Proposal: Replace __traits and is(typeof(XXX)) with a 'magic namespace'.
Robert Jacques
sandford at jhu.edu
Mon Nov 2 09:09:11 PST 2009
On Mon, 02 Nov 2009 11:47:53 -0500, Don <nospam at nospam.com> 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.
>
> ======================
> PATCH against svn 234 (this is just a quick hack for evaluation, it
> doesn't fix error messages, etc. But it works as described above. It
> allows all existing code to continue to compile).
>
> This allows '__traits' as the magic namespace. The existing __traits
> stuff continues to compile. To allow 'meta' as another synonym for the
> same magic namespace, add this line to lexer.c, line 2960.
>
> { "__traits", TOKtraits },
> + { "meta", TOKtraits },
> { "__overloadset", TOKoverloadset },
>
> (Hmm. Didn't know __overloadset was a keyword. The things you find...)
>
>
> Index: parse.c
> ===================================================================
> --- parse.c (revision 234)
> +++ parse.c (working copy)
> @@ -4934,6 +4934,20 @@
> Objects *args = NULL;
>
> nextToken();
> + if (token.value == TOKdot) {
> + // __traits.identifier(args, ...)
> + nextToken();
> + if (token.value != TOKidentifier)
> + { error("__traits.identifier(args...) expected");
> + goto Lerr;
> + }
> + ident = token.ident;
> + nextToken();
> + if (token.value==TOKlparen)
> + args = parseTemplateArgumentList2();
> + e = new TraitsExp(loc, ident, args);
> + break;
> + }
> check(TOKlparen);
> if (token.value != TOKidentifier)
> { error("__traits(identifier, args...) expected");
>
vote++
More information about the Digitalmars-d
mailing list