digitalmars.D.learn - One of us is crazy: Me or {function here}.stringof
- "Nick Sabalausky" <a a.a> Nov 12 2009
- "Nick Sabalausky" <a a.a> Nov 13 2009
- Bill Baxter <wbaxter gmail.com> Nov 13 2009
- Don <nospam nospam.com> Nov 13 2009
AKA ".stringof strikes again", or ".attackof.stringof"...
Not sure if this is right or not:
------------------------------
void foo(){}
pragma(msg, foo.stringof);
------------------------------
Outputs "foo()", but shouldn't it just be "foo" instead? Or am I overlooking
something?
And on top of that, giving foo a parameter:
------------------------------
void foo(int i){}
pragma(msg, foo.stringof);
------------------------------
Error: function main.foo (int) does not match parameter types ()
Error: expected 1 arguments, not 0
WTF?
Ok, so maybe that stupid optional-parens function-invocation "feature" is
kicking in where it's not wanted. D's standard way to refer to a function
itself is supposed to be '&':
------------------------------
void foo(int i){}
pragma(msg, &foo.stringof);
------------------------------
main.d(2): Error: function main.foo (int) does not match parameter types ()
main.d(2): Error: expected 1 arguments, not 0
main.d(2): Error: "foo()"c is not an lvalue
main.d(2): Error: pragma msg string expected for message, not '&"foo()"c'
FFPPJTTdD!!!!!
Associativity problem?
------------------------------
void foo(int i){}
pragma(msg, (&foo).stringof);
------------------------------
& foo
Argh! (Not to be confused with "Args!")
Sooooooooo.......
If I'm writing a template that takes in a varadic list of variables and
functions, and does something with their names, what's the right way to do
that (if any)? Trivial example:
------------------------------
template makeBools(idents...)
{
const char[] foo = "bool _generated_from_"~idents[0].stringof~"_name;" ~
foo!(idents[1..$]);
}
int i;
void func1(){}
void func2(int x){}
mixin(makeBools!(i, func1, func2)); // Thoroughly fucks up.
------------------------------
I suppose I could resort to passing in string literals, but I'd really
rather not have to.
Nov 12 2009
"Nick Sabalausky" <a a.a> wrote in message news:hdj3dk$1r5k$1 digitalmars.com...AKA ".stringof strikes again", or ".attackof.stringof"...
Ok, *now* I see all the reports of this on bugzilla, now that I searched for just "stringof" and dug through the pile of results, instead of searching for both "stringof" and "function"...Real pain for metaprogramming...
Nov 13 2009
On Fri, Nov 13, 2009 at 12:05 AM, Nick Sabalausky <a a.a> wrote:"Nick Sabalausky" <a a.a> wrote in message news:hdj3dk$1r5k$1 digitalmars.com...AKA ".stringof strikes again", or ".attackof.stringof"...
Ok, *now* I see all the reports of this on bugzilla, now that I searched for just "stringof" and dug through the pile of results, instead of searching for both "stringof" and "function"...Real pain for metaprogramming...
At any rate I think a single stringof for a function is not sufficient. You might want any of: foo foo(int, int) foo(int a, int b) There should probably be some __traits functions for getting these different things, if there aren't already. --bb
Nov 13 2009
Bill Baxter wrote:On Fri, Nov 13, 2009 at 12:05 AM, Nick Sabalausky <a a.a> wrote:"Nick Sabalausky" <a a.a> wrote in message news:hdj3dk$1r5k$1 digitalmars.com...AKA ".stringof strikes again", or ".attackof.stringof"...
just "stringof" and dug through the pile of results, instead of searching for both "stringof" and "function"...Real pain for metaprogramming...
At any rate I think a single stringof for a function is not sufficient. You might want any of: foo foo(int, int) foo(int a, int b) There should probably be some __traits functions for getting these different things, if there aren't already. --bb
'meta.nameof' module. It included nameOf(xxx), qualifiedNameOf(xxx) and prettyNameOf(xxx), which were the 3 cases you listed above.
Nov 13 2009








Don <nospam nospam.com>