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