Thread overview
Convert call to a string
Feb 15
ag0aep6g
February 15
I'd like to convert a call to a string for debug printing purposes for example:


```
import std.stdio : writeln;
void someFunction(int x, string y){}
string myCall = debugPrint(someFunction(1, "hello"));
writeln(myCall);
```
writes:
someFunction(1, "hello")


Does this functionality exists? If not how can I construct it? Please note that the call `someFunction(1, "hello")` should also be executed.

Thank you
February 15
On Wed, Feb 15, 2017 at 10:07:22PM +0000, data pulverizer via Digitalmars-d-learn wrote:
> I'd like to convert a call to a string for debug printing purposes for example:
> 
> 
> ```
> import std.stdio : writeln;
> void someFunction(int x, string y){}
> string myCall = debugPrint(someFunction(1, "hello"));
> writeln(myCall);
> ```
> writes:
> someFunction(1, "hello")
> 
> 
> Does this functionality exists? If not how can I construct it? Please note that the call `someFunction(1, "hello")` should also be executed.
[...]

Try this:

	auto debugPrint(string expr)() {
		writeln(expr);
		return mixin(expr);
	}

	string myCall = debugPrint!`someFunction(1, "hello")`;


T

-- 
Klein bottle for rent ... inquire within. -- Stephen Mulraney
February 15
On Wed, Feb 15, 2017 at 02:18:48PM -0800, H. S. Teoh via Digitalmars-d-learn wrote: [...]
> Try this:
> 
> 	auto debugPrint(string expr)() {
> 		writeln(expr);
> 		return mixin(expr);
> 	}
> 
> 	string myCall = debugPrint!`someFunction(1, "hello")`;
[...]

OTOH, that won't work with local variables (it'd only print the variable names, not the values). Presumably you'd also want to print the variables too.  So perhaps something like this instead:

	auto debugPrint(alias fun, A...)(A args) {
		writefln("%s(%(%s, %))", __traits(identifier, fun), [args]);
		return fun(args);
	}

	string arg = "hello";
	string myCall = debugPrint!someFunction(1, arg);


T

-- 
I see that you JS got Bach.
February 15
On Wednesday, 15 February 2017 at 22:34:22 UTC, H. S. Teoh wrote:
> 	auto debugPrint(alias fun, A...)(A args) {
> 		writefln("%s(%(%s, %))", __traits(identifier, fun), [args]);
> 		return fun(args);
> 	}
>
> 	string arg = "hello";
> 	string myCall = debugPrint!someFunction(1, arg);

`[args]` doesn't work when the tuple elements don't have a common type. But you can pass `args` as is to writefln and generate the format string accordingly:

----
import std.range: repeat;
import std.string: join;

immutable string argsfmt = "%s".repeat(args.length).join(", ");
writefln("%s(" ~  argsfmt ~ ")", __traits(identifier, fun), args);
----
February 15
On Wed, Feb 15, 2017 at 10:58:42PM +0000, ag0aep6g via Digitalmars-d-learn wrote:
> On Wednesday, 15 February 2017 at 22:34:22 UTC, H. S. Teoh wrote:
> > 	auto debugPrint(alias fun, A...)(A args) {
> > 		writefln("%s(%(%s, %))", __traits(identifier, fun), [args]);
> > 		return fun(args);
> > 	}
> > 
> > 	string arg = "hello";
> > 	string myCall = debugPrint!someFunction(1, arg);
> 
> `[args]` doesn't work when the tuple elements don't have a common type.

Very good point.


> But you can pass `args` as is to writefln and generate the format string accordingly:
> 
> ----
> import std.range: repeat;
> import std.string: join;
> 
> immutable string argsfmt = "%s".repeat(args.length).join(", ");
> writefln("%s(" ~  argsfmt ~ ")", __traits(identifier, fun), args);
> ----

Excellent idea!


T

-- 
Life is complex. It consists of real and imaginary parts. -- YHL
February 15
On Wednesday, 15 February 2017 at 22:07:22 UTC, data pulverizer wrote:

That's great, thanks both of you!