Getting the error from __traits(compiles, ...)

Bill Baxter wbaxter at gmail.com
Fri Nov 13 12:05:51 PST 2009


On Fri, Nov 13, 2009 at 11:50 AM, Yigal Chripun <yigal100 at gmail.com> wrote:
> On 13/11/2009 19:30, Bill Baxter wrote:
>>
>> On Fri, Nov 13, 2009 at 8:40 AM, bearophile<bearophileHUGS at lycos.com>
>> wrote:
>>>
>>> Bill Baxter:
>>>>
>>>> 2) how to get and report errors related to failure to compile
>>>> some code. (this one I hadn't thought of back then)
>>>
>>> I'd like a "static foreach" too. Eventually most statements will
>>> have a static version. At that point people will start seeing this
>>> little duplication in the language and someone may invent a way to
>>> throw away all the static versions and allow normal D code to be
>>> used at compile time, maybe with a 2-stage compilation or
>>> something.
>>
>> A static switch would be nice too.   static if (is(type == xxx)) {}
>> else static if (is(type==yyy)) {} else static if ... gets kinda
>> tedious.
>>
>>
>> The kind of unification you're talking about is one thing I like
>> about Nemerle's 2-phase macros-as-plugins.  The code you execute at
>> compile time is written in exactly the same language as what you
>> execute at runtime.  And no CTFE engine is required to make it work.
>> Only one new construct required, the macro facility itself.
>>
>> But I don't think that leads to elimination static if, etc.  It just
>> means that such things become implementable as macros, rather than
>> language constructs.
>>
>> On the other hand, having macros doesn't mean that you don't want
>> constant folding.  And if you can fold the constant 2+3, why not the
>> constant add(2,3)?  So desire to fold as many constants as possible
>> naturally leads to a desire to do CTFE and be able to execute your
>> entire language at compile time.
>>
>> And once you're there -- yeh, I guess you're right.   Ultimately
>> it's not really necessary to specify static if vs regular if.   It's
>> yet another extension of constant folding -- if the condition is a
>> compile time constant, then it can act as a static if.   Same goes
>> for loops. But like regular loop unrolling optimizations, the
>> compiler should decide if it's prudent to unroll that 10,000 static
>> foreach loop or not.
>>
>> So in short.  I think you're right.  "static if"  should go away.
>> But "2-stage" compilation isn't really necessary, just more
>> extensions to the constant folding engine.  (Or perhaps you could say
>> constant folding is already a separate stage of a 2-stage process)
>>
>> --bb
>
> I don't follow your logic regarding CTFE.
>
> with 2 phase macros a-la nemerle:
>
> macro foo() {
>  int res = 2 + 3;
>  return res;
> }
>
> macro bar() {
>  return q{2 + 3};
> }
>
> foo's addition is done at compile time so the constant folding was
> implemented in the macro body
>
> bar return the AST for the expression "2 + 3". Compiler optimizations like
> constant folding will apply just as if you wrote that expression yourself
> instead of generating it by calling a macro.

Right, which is why I'm saying you still want constant folding/CTFE
even if you have a macro system.  But then if you're going to have
CTFE sitting around anyway, you might as well use it to implement
macros instead of going to this funky two-phase thing.   That was one
point I was making, though not so clearly.

> static if is not supposed to be implemented with macros, rather the
> equivalent of a static if would be using a regular if *inside* the body of
> the macro.

But that's how you would implement a static if with macros, no?
(pardon the incorrect nemerle syntax)

macro static_if(bool cond, a, b) {
        if (cond) {
           <|  a  |>
        } else {
           <|  b  |>
        }
}

--bb



More information about the Digitalmars-d mailing list