Эмуляция ключевого слова static из D на макросах

Aug 28, 2013 14:10

Очень порадовал комментарий некоего схемиста [1] к посту про compile-time function execution в D.

Если вкратце, в D перед объявлением переменной можно написать ключевое слово static (например, static int r1000 = euler1(1000)) и это приведет к тому, что компилятор попытается посчитать правую часть объявления во время компиляции ( Read more... )

macros, scala

Leave a comment

Comments 16

ext_1178598 August 28 2013, 12:58:29 UTC
А что происходит в D, если euler1 меняет глобальный стейт?

Reply

thedeemon August 28 2013, 14:16:46 UTC
Такую конпелятор не разрешит в компайл-тайме использовать.

Reply

xeno_by August 28 2013, 14:18:38 UTC
Как он это определит? Есть ли какой-то список правил того, что можно и что нельзя делать в разрешенных функциях?

Reply

v_l_a_d August 28 2013, 16:06:41 UTC
http://dlang.org/function.html , см. раздел "Compile Time Function Execution (CTFE)"

Reply


ex_juan_gan August 28 2013, 18:32:00 UTC
Аяяй. Прогресс уже на горизонте, но ещё не с нами.

Reply


zhengxi August 28 2013, 21:06:52 UTC
1. в С++11 тоже такое обещали. Не знаю, если работает.

2. Помимо модных штук, которыми вы там занимаетесь, есть еще простой тупой препроцессинг.
И вот этот пример мне кажется больше для него подходит, чем для макросов.
Простой парсер скалы на скале (без проверки синтаксиса, но создающий из исходника иерархическое дерево, которое можно менять и превращать обратно в компилябельный исходник; назвать его гордым словом AST язык не поворачивается) это всего строк 300. gist.github.com/anonymous/6371180

А дальше тривиально делается препроцессор конкретно под эту фичу:
Прошлись по дереву 1 раз, заменили ct(...) на ???, сдампили обратно в исходник, внутренности ct(...) засунули в println(), дописали в исходник.
Скомпиляли, запустили. Что напечаталось записали на место ct(...).

Reply

xeno_by August 29 2013, 05:33:29 UTC
1) Тут интересно, что схлопывание констант определяется не definition-site аннотацией, а управляется на use-site. Соответственно, становится возможным шарить функции между компайл-таймом и рантаймом. Также, класс функций, поддерживаемых дишечкой в этом плане, гораздо шире, чем в плюсах.

2) Есть мелочи вроде рассинхронизации со скаловским парсером (например, в новых версиях) или факта того, что ct ресолвится не как честный идентификатор из какого-то модуля, а просто как что-то по имени ct. Но самое главное тут в том, что замена ct(...) на ??? может сделать программу некомпилируемой.

Reply

ext_1178598 August 29 2013, 17:22:50 UTC
У call-site есть свои плюсы - за счет того, что при определении такой static функции мы в явном виде работает с компайл-тайм окружением, потенциально можно разрешить сайд-эффекты и ничего не будет ломаться.

Reply


rssh August 29 2013, 11:17:38 UTC
scala-way будет это написать интерпретатор скалы (принимающей AST) прямо в компиляторе. Кстати - если учесть что все уже распрасено то осталось написать сравнительно немного.

Reply

xeno_by August 29 2013, 11:27:37 UTC
Судя по опыту реализации джит-компилятора для макросов, это совсем не немного. Но да, это, мне кажется, единственный способ сделать макросы действительно удобными.

Reply


Leave a comment

Up