D是“静态的”是陈述性的还是程序性的?

时间:2011-10-28 09:30:15

标签: terminology d compile-time declarative static-if

请考虑以下代码:

static if (!is(MyStruct))
{
    struct MyStruct
    {
    }
}

static if (is(MyStruct))
{
    static assert(0);
}

我最初的理解是声明的顺序(在全局范围内)与D中的无关紧要

但是,在这种情况下,static if s的顺序会对程序是否编译产生影响。

D是编译时评估阶段,因此,是一个程序性功能(如C / C ++),一个声明性功能,还是其他什么?目前是什么,计划是什么(如果两者不同)?


编辑:

我刚刚意识到,这个问题甚至还没有结束。 static if使用.tupleof枚举当前模块的成员,并创建相同类型的问题会发生什么?

2 个答案:

答案 0 :(得分:2)

这是一个声明性功能,具有程序属性作为实现的副作用。

答案 1 :(得分:2)

这很复杂。它本质上是声明性的,但是当static if引入新符号时,顺序仍然很重要。除此之外,我不相信这一点很重要,但正如您的示例所示,当您在static if中引入新符号,而另一个static if使用它时,顺序肯定很重要。

最近有some discussion关于如何使其尽可能一致和直观。因此,特别是在极端情况下,情况可能会在不久的将来发生变化。但我希望你的例子会继续触发static assert。问题是,如果你颠倒static assert块的顺序,它是否会开始触发static if,我不确定那是否真的已经确定了。 discussion on it in the compiler's newsgroup并不完全是结论性的,有点难以跟随恕我直言,所以我不能肯定地说。但我希望在至少某些涉及引入新符号的static if块的情况下,排序仍然很重要。

修改

这是dmd的主要贡献者之一recently posted

  

目前,没有定义编译时评估的顺序; DMD   目前它在词汇顺序上模糊不清,但计划这样做   在不久的将来改变。 'static if'和'mixin'将被评估   在词汇顺序中,在完成任何其他事情之前。然后,   其他一切都将按需评估。

     

除了“静态if / mixin”传递之外,编译可以继续进行   并行(虽然目前的实现还没有这样做)   意味着没有排序(多个项目可能完成编译   同时地)。

所以,希望澄清事情。