?

Log in

No account? Create an account

scala.meta: новая платформа для метапрограммирования Скалы - Excelsior

Jul. 5th, 2014

12:16 am - scala.meta: новая платформа для метапрограммирования Скалы

Previous Entry Share Next Entry

Comments:

[User Picture]
From:xeno_by
Date:July 12th, 2014 06:44 am (UTC)
(Link)
Спасибо! А как это работает с раздельной компиляцией?
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:July 12th, 2014 08:57 am (UTC)
(Link)
А никак, очевидно, это так называемый "3-D syntax", и раздельная компиляция с ним невозможна. Если хочется компилировать, то надо делать work around, окружая несереализуемые значения евалом, например, то есть чтобы самой лямбды в коде не было, а была форма, которая при вычислении возвращает эту лямбду.

Тут еще надо отметить, что begin-for-syntax - это core-форма, она никуда не исчезает после экспанда и остается в скомпилированном коде. По-этому даже после компиляции можно выполнять формы 1 фазы. А вот с макросами такое уже не прокатывает - они просто раскрываются. По-этому если хочется выполнить сайд-эффект в макросе, то следует вместо того чтобы просто написать "code", добавить в экспанд макроса #'(begin-for-syntax code), ну или #'(define-syntaxes () (begin code (values)), что то же самое, но работает в локальном контексте.
(Reply) (Parent) (Thread)