Очень порадовал комментарий некоего схемиста [1] к посту про compile-time function execution в D.
Если вкратце, в D перед объявлением переменной можно написать ключевое слово static (например, static int r1000 = euler1(1000)) и это приведет к тому, что компилятор попытается посчитать правую часть объявления во время компиляции
(
Read more... )
Comments 16
Reply
Reply
Reply
Reply
Reply
2. Помимо модных штук, которыми вы там занимаетесь, есть еще простой тупой препроцессинг.
И вот этот пример мне кажется больше для него подходит, чем для макросов.
Простой парсер скалы на скале (без проверки синтаксиса, но создающий из исходника иерархическое дерево, которое можно менять и превращать обратно в компилябельный исходник; назвать его гордым словом AST язык не поворачивается) это всего строк 300. gist.github.com/anonymous/6371180
А дальше тривиально делается препроцессор конкретно под эту фичу:
Прошлись по дереву 1 раз, заменили ct(...) на ???, сдампили обратно в исходник, внутренности ct(...) засунули в println(), дописали в исходник.
Скомпиляли, запустили. Что напечаталось записали на место ct(...).
Reply
2) Есть мелочи вроде рассинхронизации со скаловским парсером (например, в новых версиях) или факта того, что ct ресолвится не как честный идентификатор из какого-то модуля, а просто как что-то по имени ct. Но самое главное тут в том, что замена ct(...) на ??? может сделать программу некомпилируемой.
Reply
Reply
Reply
Reply
Leave a comment