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

Don nospam at nospam.com
Sat Nov 14 03:32:18 PST 2009


Yigal Chripun wrote:
> On 13/11/2009 22:05, Bill Baxter wrote:
>> On Fri, Nov 13, 2009 at 11:50 AM, Yigal Chripun<yigal100 at gmail.com>  
>> wrote:
>>>
>>> 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
> 
> let's start from the end,
> yes, you can implement static if that way but I don't see why would you 
> want to do that.
> 
> regarding constant folding and 2 phase compilation:
> from what I know, DMD currently contains inside two backends, the 
> regular one generates the executable *and* an interpreter which does 
> CTFE

> Constant folding is an optimization used by both.
> 
> basically we already have two phases of compilation but they are done 
> internally by DMD. This means that DMD has two separate backends instead 
> of just one and that you need separate syntax to target the different 
> phases.
> 
> The major problems I see with the current system:
> - unnecessary duplication of syntax
> - two backends instead of just one which complicates the compiler 
> implementation

There's only one backend. The interpreter is basically just constant 
folding, with a small amount of interpreting of statements. 90% of the 
CTFE complexity is in the constant folding. The interpreter itself is 
only about 200 lines of code. But the real backend is huge.

> - unclear separation of phase in code:
>   auto arr = [1.0, 2.0, bar(5.0)]; // when is bar executed?
> also, how can I control when it's executed? This is needlessly confusing 
> and doesn't provide enough control to the programmer.

That particular example is caused by array literals not being immutable, 
which I am certain is a mistake.

> it's analogous to structs vs. classes. I'm sure everyone in the D 
> community agree that this separation of concerns is much better than the 
> bug-prone c++ way.



More information about the Digitalmars-d mailing list