【问题标题】:Is D's "static if" declarative or procedural?D 的“静态 if”是声明性的还是程序性的?
【发布时间】:2011-12-17 04:00:49
【问题描述】:

考虑以下代码:

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

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

我最初的理解是声明的顺序(在全局范围内)在 D 中并不重要

但是,在这种情况下,static ifs 的顺序决定了程序是否编译。

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


编辑:

我刚刚意识到,问题还不止于此。 static if 使用 .tupleof 枚举当前模块的成员会发生什么,并创建相同类型的问题?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我认为已经有人谈论使该示例代码非法。要么直接拒绝它,要么声明它未定义的行为。
    • @BCS:不是检测不到吗?至少当 mixins 发挥作用时,它看起来像是停机问题......
    • @Mehrdad 不一定,尤其是在常见情况下。一种方法是让is()“诱杀”符号表,然后认为插入一个会更改已评估static if的值的符号是错误的@
    • @BCS:如果两个模块具有交叉依赖关系并且它们都检查彼此的类型,那将如何正常工作?哪个是第一?应该很重要吗?一个应该能够阻止另一个的编译吗?
    • @Mehrdad:在不同的模块中无关紧要,OP的代码说明了这一点:假设第二个if首先运行,它什么也不做,然后第一个if运行,“陷阱”符号MyStruct,然后尝试添加简单的触发陷阱并给出错误消息。如果事情以另一种方式发生,则即使没有到达第二个if,也会给出相同的错误消息。 -- OTOH 通过将问题的最有用版本设为非法来实现这一点。
    【解决方案2】:

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

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

    编辑:

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

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

    除了 "static if/mixin" pass,编译可以在 并行(尽管当前的实现还没有这样做) 表示没有排序(多个项目可能完成编译 同时)。

    所以,希望这可以澄清事情。

    【讨论】:

    • 我认为问题不在于static if 本身——我认为它可能会提供模板匹配和别名,从而相当意外地改变代码的行为,对吧?跨度>
    • 跟他们不完全一样,但是有关联,也有相似之处。模板的声明顺序对模板约束没有影响,但static ifs 的顺序会影响它们,如果它们引入了新符号,则可以产生与static if 相同的效果。我不相信aliases 的顺序有什么影响,因为它们不涉及条件编译。它们只是引入了一个新符号(如果它们在 static if 内部,则可能会影响其他 static ifs,但它们的顺序对它们本身没有影响)。
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2015-02-24
    • 2017-03-23
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多