Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
February 15, 2017 Convert call to a string | ||||
---|---|---|---|---|
| ||||
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, 2017 Re: Convert call to a string | ||||
---|---|---|---|---|
| ||||
Posted in reply to data pulverizer | 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, 2017 Re: Convert call to a string | ||||
---|---|---|---|---|
| ||||
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, 2017 Re: Convert call to a string | ||||
---|---|---|---|---|
| ||||
Posted in reply to H. S. Teoh | 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, 2017 Re: Convert call to a string | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | 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, 2017 Re: Convert call to a string | ||||
---|---|---|---|---|
| ||||
Posted in reply to data pulverizer | On Wednesday, 15 February 2017 at 22:07:22 UTC, data pulverizer wrote: That's great, thanks both of you! |
Copyright © 1999-2021 by the D Language Foundation