[英]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目前在詞匯順序上模糊不清,但計划在不久的將來改變。 在執行任何其他操作之前,'static if'和'mixin'將按詞匯順序進行評估。 之后,其他所有內容都將按需評估。
除了“靜態if / mixin”傳遞之外,編譯可以並行進行(雖然當前實現還沒有這樣做),這意味着沒有排序(多個項目可能同時完成編譯)。
所以,希望澄清事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.