Don wrote:
[I'm moving this from deep inside a TDPL thread, since I think it's
important]
is(typeof(XXX)) is infamously ugly and unintuitive
__traits(compiles, XXX) is more comprehensible, but just as ugly.
They are giving metaprogramming in D a bad name. I think we need to get
rid of both of them.
A very easy way of doing this is to replace them with a 'magic
namespace' -- so that they _look_ as though they're functions in a
normal module.
Names which have been suggested include 'meta', 'traits', 'scope',
'compiler'. Personally I think 'meta' is the nicest (and I suggested two
of the others <g>). This would give us:
meta.compiles(XXX)
meta.isArithmetic; // note, property syntax OK if no arguments
meta.isArithmetic(int*);
Benefits:
* Fewer keywords: __traits -> meta, typeid() -> meta.typeid()
* Get rid of is() expressions, which are the most complicated thing in
the language.
* Some meta.XXX functions could be defined in runtime library code.
* The existing __traits functions could have more useful return values.
* Retain the flexibility of __traits.
These days, I don't propose anything unless I'm prepared to write a
patch to implement it. <g>
If nothing is, this should convince everyone that there's NO REASON to
put up with the ugly metaprogramming syntax we currently have. We can do
much better. Easily.
I'm all for it. I vote for 'meta'. :)
-Lars