On Saturday, 2 April 2016 at 01:19:45 UTC, Meta wrote:
What is needed is Lisp's gensym construct.


That's basically what I said, no? :p

One problem of lisp's gensym (if we were to use it in D) is that it's simply a monotonically increasing number with a global prefix. It's perfect for the language it's in, and all but useless in D.

For this very reason, I have made a stab at implementing __GENSYM__ in D. It follows basically the ideas I outlined above, and spits out a string on the form MANGLE_#, with # being a counter for the given mangled name:

module bar;
struct Ham(string gensym = __GENSYM__) {
    pragma(msg, gensym);
}
struct Eggs(string gensym = __GENSYM__) {
    pragma(msg, gensym);
}

// ===========================

module foo;
import bar;

pragma(msg, __GENSYM__); // 3foo_1

void main() {
    pragma(msg, __GENSYM__); // _Dmain_1
    Ham!() a; // _Dmain_3bar_1
    Ham!() b; // _Dmain_3bar_2
    assert(!is(typeof(a) == typeof(b)));
    Eggs!() c; // _Dmain_3bar_3
    S2!() d; // _Dmain_3foo_1
}

struct Qux {
    pragma(msg, __GENSYM__); // 3foo3Qux_1
    void baz() {
        pragma(msg, __GENSYM__); // _D3foo3Qux3bazMFZv_1
        Ham!() a; // _D3foo3Qux3bazMFZv_3bar_1
    }
}

struct S2(string gensym = __GENSYM__) {
    pragma(msg, gensym);
}

Should I file an enhancement for this?

--
  Simen

Reply via email to