www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Logging Function Parameters

reply dom <oggs gmx.at> writes:
Hi,

I am looking for a method to log the current function name + 
parameters.
Getting the name of the current function is simply possible with 
__PRETTY_FUNCTION__
Is there some possibility to generically access the parameters of 
a function such that they can be iterated and printed out?

currently i have something like this:
log.info(__PRETTY_FUNCTION__,  " ", parameter1, " ", parameter2);

i would like to get to something like that:
log.info(__PRETTY_FUNCTION__,  " ", parameters.join(", "));
Mar 17 2018
next sibling parent reply aliak <something something.com> writes:
On Saturday, 17 March 2018 at 10:34:41 UTC, dom wrote:
 Hi,

 I am looking for a method to log the current function name + 
 parameters.
 Getting the name of the current function is simply possible 
 with __PRETTY_FUNCTION__
 Is there some possibility to generically access the parameters 
 of a function such that they can be iterated and printed out?

 currently i have something like this:
 log.info(__PRETTY_FUNCTION__,  " ", parameter1, " ", 
 parameter2);

 i would like to get to something like that:
 log.info(__PRETTY_FUNCTION__,  " ", parameters.join(", "));
You may be able to do something with a mixin. I tried this but I think I'm hitting a compiler bug, or I'm just using mixins wrong. import std.stdio; string arguments(alias f)() { import std.meta: AliasSeq; import std.traits: ParameterIdentifierTuple; import std.array: join; string[] args; foreach (a; [AliasSeq!(ParameterIdentifierTuple!f)]) { args ~= `"` ~ a ~ `: ", ` ~ a; } return args.join(`, ", ", `); } // calling writeln(mixin(arguments!f)) should do what you want. void f(int a, int b, int c) { // But you get a: // Error: Using the result of a comma expression is not allowed // writeln(mixin(arguments!f)); auto value = arguments!f; // "a: ", a, ", ", "b: ", b, ", ", "c: ", c writeln(value); // This is ok: writeln("a: ", a, ", ", "b: ", b, ", ", "c: ", c); } void main() { f(1, 2, 3); } You might be able to start with that and get something that works. Or maybe someone knows how to make the mixin part above compile. I have a feeling you may need to make the arguments() function return a string("p0: ", arg0, ", p1: ", arg1" ...) instead so that it's a full string instead of a comma separated expression maybe. Cheers
Mar 18 2018
parent reply Dennis <dkorpel gmail.com> writes:
On Sunday, 18 March 2018 at 22:57:15 UTC, aliak wrote:
     // But you get a:
     // Error: Using the result of a comma expression is not 
 allowed
     // writeln(mixin(arguments!f));
You can't mix part of a function call in: "Mixed in text must form complete declarations, statements, or expressions." (https://dlang.org/articles/mixin.html) In this case, it evaluates to a comma expression, which is deprecated. If you put the "writeln();" inside the mixin string it should form a complete statement and compile.
Mar 18 2018
parent Aliak <something something.com> writes:
On Sunday, 18 March 2018 at 23:17:58 UTC, Dennis wrote:
 On Sunday, 18 March 2018 at 22:57:15 UTC, aliak wrote:
     // But you get a:
     // Error: Using the result of a comma expression is not 
 allowed
     // writeln(mixin(arguments!f));
You can't mix part of a function call in: "Mixed in text must form complete declarations, statements, or expressions." (https://dlang.org/articles/mixin.html) In this case, it evaluates to a comma expression, which is deprecated. If you put the "writeln();" inside the mixin string it should form a complete statement and compile.
Ah! Thanks for the clarification.
Mar 19 2018
prev sibling parent Seb <seb wilzba.ch> writes:
On Saturday, 17 March 2018 at 10:34:41 UTC, dom wrote:
 Hi,

 I am looking for a method to log the current function name + 
 parameters.
 Getting the name of the current function is simply possible 
 with __PRETTY_FUNCTION__
 Is there some possibility to generically access the parameters 
 of a function such that they can be iterated and printed out?

 currently i have something like this:
 log.info(__PRETTY_FUNCTION__,  " ", parameter1, " ", 
 parameter2);

 i would like to get to something like that:
 log.info(__PRETTY_FUNCTION__,  " ", parameters.join(", "));
You can't get the parameters names at the moment, but there's a PR for it: https://github.com/dlang/dmd/pull/7821
Mar 18 2018