Function name

Jacob Carlborg doob at me.com
Fri Apr 23 05:00:05 PDT 2010


On 4/23/10 01:48, bearophile wrote:
> In Python I sometimes use the name of a given function reference (all lambdas are named "<lambda>"), this is a minimal example:
>
>
> def add(a, b): return a + b
> def mul(a, b): return a * b
> for func in [add, mul]:
>      print func.__name__, func(10, 20)
>
>
> In D for object references it's easy to find the name at runtime:
> object_reference.classinfo.name
>
> But for functions the situation is less simple.
>
> Here are two ways I have found:
>
>
> import std.stdio: writeln;
> import std.typetuple: TypeTuple;
> import std.typecons: tuple;
>
> int add(int a, int b) { return a + b; }
> int mul(int a, int b) { return a * b; }
>
> void main() {
>      // solution 1
>      foreach (name; TypeTuple!("add", "mul"))
>          mixin(`writeln(name, " ", ` ~ name ~ `(10, 20));`);
>
>      // solution 2
>      auto funcs = [tuple("add",&add), tuple("mul",&mul)];
>      foreach (ptr_name; funcs)
>          writeln(ptr_name.field[0], " ", ptr_name.field[1](10, 20));
>
>      // hypothetical solution 3
>      auto funcs_ptr = [&add,&mul];
>      foreach (func; funcs_ptr)
>          writeln(func.name, " ", func(10, 20));
> }
>
>
> The first solution is not good because it uses a static foreach and I like to avoid messy string mixins when possible.
>
> The second solution is better, and I can use it, but it requires redundancy in those names that can cause bugs.
>
> The third solution is what I'd like to be able to write. To have such run-time reflection the compiler has to store in the binary a dictionary that maps function pointers and delegates to their names as strings (lambdas can be mapped to standard name). This can inflate the binary a little. This is not too much different from the data classes have, like their name that can be found with classinfo. What do you think?
>
> Bye,
> bearophile

I think http://www.dsource.org/projects/flectioned is what you are 
looking for. Don't know if it still works though.



More information about the Digitalmars-d mailing list