Является ли D "статическим, если" декларативным или процедурным? - PullRequest
5 голосов
/ 28 октября 2011

Рассмотрим следующий код:

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

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

Насколько я понимаю, порядок объявлений (в глобальной области видимости) не имеет значения в D.

Однако в этом случае порядок static if s определяет разницу между тем, компилируется ли программа.

Является ли этап оценки времени компиляции D, следовательно, процедурной функцией (например, C / C ++)декларативная особенность или что-то еще?Что это в настоящее время, и что планируется (если они разные)?


Редактировать:

Я только что понял, что проблема здесь даже не заканчивается.Что происходит с static if, использующим .tupleof для перечисления членов текущего модуля и создания проблем такого же типа?

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Это становится сложным. Это по сути декларативно, но порядок все еще может иметь значение, когда static if вводит новый символ. Кроме того, я не верю, что это когда-либо имеет значение, но, как показывает ваш пример, когда вы вводите новый символ в static if, а другой static if использует его, порядок определенно может иметь значение.

В последнее время обсуждается о том, как сделать его максимально последовательным и интуитивно понятным. Так что, особенно в угловых случаях, ситуация может измениться в ближайшее время. Но я ожидаю, что ваш пример продолжит вызывать static assert. Вопрос в том, начнет ли он запускать static assert, если вы измените порядок блоков static if, и я не уверен, что это действительно было решено. Обсуждение по этому вопросу в группе новостей компилятора не совсем убедительно, и имхо трудно следовать ИМХО, поэтому я не могу сказать наверняка. Но я ожидаю, что порядок все равно будет иметь значение, по крайней мере, в некоторых случаях, когда в блоке static if вводится новый символ.

EDIT:

Это было недавно опубликовано одним из основных участников dmd:

В настоящее время порядок оценки во время компиляции не определен; DMD в настоящее время делает это неопределенно в лексическом порядке, но планируется измениться в ближайшее время. 'static if' и 'mixin' будут оцениваться в лексическом порядке, прежде чем что-либо еще будет сделано. После этого, все остальное будет оцениваться по требованию.

Помимо прохода "static if / mixin", компиляция может продолжаться в параллельный (хотя текущая реализация еще не делает этого), который означает, что нет порядка (несколько элементов могут завершить компиляцию одновременно).

Итак, надеюсь, это прояснит ситуацию.

2 голосов
/ 28 октября 2011

Это декларативная функция, которая имеет процедурные свойства в качестве побочного эффекта реализации.

...