簡體   English   中英

D是“靜態的”是陳述性的還是程序性的?

[英]Is D's “static if” declarative or procedural?

請考慮以下代碼:

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

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

我最初的理解是, 聲明的順序(在全球范圍內)在D中無關緊要

但是,在這種情況下, static if的順序決定了程序是否編譯。

因此,D的編譯時評估階段是程序性特征(如C / C ++),聲明性特征還是其他什么? 目前是什么,計划是什么(如果兩者不同)?


編輯:

我剛剛意識到,問題甚至還沒有結束。 static if使用.tupleof枚舉當前模塊的成員,並創建相同類型的問題, static if會發生什么?

它是一個聲明性功能,具有作為實現的副作用的過程屬性。

它變得復雜了。 它本質上是聲明性的,但是當static if引入新符號時,順序仍然很重要。 除此之外,我不相信它是重要的,但正如你的例子所示,當你在static if引入一個新符號,而另一個static if使用它時,順序肯定是重要的。

最近有一些關於如何使其盡可能一致和直觀的討論 因此,特別是在極端情況下,情況可能會在不久的將來發生變化。 但我希望您的示例將繼續觸發static assert 問題是,如果你顛倒static if塊的順序,它是否會開始觸發static assert ,我不確定那是否真的已經確定了。 在編譯器的新聞組中對它討論並不完全是決定性的,並且有點難以遵循恕我直言,所以我不能肯定地說。 但我希望在至少某些涉及static if塊引入新符號的情況下,排序仍然很重要。

編輯:

這是最近由dmd的主要貢獻者之一發布的:

目前,沒有定義編譯時評估的順序; DMD目前在詞匯順序上模糊不清,但計划在不久的將來改變。 在執行任何其他操作之前,'static if'和'mixin'將按詞匯順序進行評估。 之后,其他所有內容都將按需評估。

除了“靜態if / mixin”傳遞之外,編譯可以並行進行(雖然當前實現還沒有這樣做),這意味着沒有排序(多個項目可能同時完成編譯)。

所以,希望澄清事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM