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

Reply via email to