Units of Measurement Library: units-d

Simen Kjaeraas via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Mon Apr 4 14:25:33 PDT 2016


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


More information about the Digitalmars-d-announce mailing list