?

Log in

No account? Create an account

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

Aug. 28th, 2013

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

Previous Entry Share Next Entry

Comments:

From:zhengxi
Date:August 28th, 2013 09:06 pm (UTC)
(Link)
1. в С++11 тоже такое обещали. Не знаю, если работает.

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

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

Edited at 2013-08-28 09:10 pm (UTC)
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 29th, 2013 05:33 am (UTC)
(Link)
1) Тут интересно, что схлопывание констант определяется не definition-site аннотацией, а управляется на use-site. Соответственно, становится возможным шарить функции между компайл-таймом и рантаймом. Также, класс функций, поддерживаемых дишечкой в этом плане, гораздо шире, чем в плюсах.

2) Есть мелочи вроде рассинхронизации со скаловским парсером (например, в новых версиях) или факта того, что ct ресолвится не как честный идентификатор из какого-то модуля, а просто как что-то по имени ct. Но самое главное тут в том, что замена ct(...) на ??? может сделать программу некомпилируемой.
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:August 29th, 2013 05:22 pm (UTC)
(Link)
У call-site есть свои плюсы - за счет того, что при определении такой static функции мы в явном виде работает с компайл-тайм окружением, потенциально можно разрешить сайд-эффекты и ничего не будет ломаться.
(Reply) (Parent) (Thread)