?

Log in

No account? Create an account

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

Jul. 5th, 2014

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

Previous Entry Share Next Entry

Comments:

From:Valentin Budaev
Date:July 12th, 2014 09:14 am (UTC)
(Link)
define-for-syntax никак не извлекается - определенная define-for-syntax переменная имеет значения из фазы 1 (вычисляется в 1) и связана в фазе 1. Переменная определенная через define связана в фазе 0 и имеет значение из 0 (вычисляемое в 0). Переменная определенная через define-syntax (макрос) - связана в фазе 0 и имеет значение, вычисляемое в фазе 1, ее-то значение мы и можем получить через syntax-local-value, при этом мы квотим имя переменной. То есть форма (syntax-local-value #'id) выполняется в 1 фазе, id связано в 0 фазе, если мы напишем (syntax-local-value id), то id в 1 фазе unbound, но под темплейтом (#') фаза опускается, переменная становится связана и мы в первой фазе извлекаем значение из переменной нулевой фазы. В общем случае это невозможно, конечно (ведь переменных 0 фазы в 1 фазе "еще не существует"), но т.к. эта переменная особая (макрос) и значение ее вычисляется в 1 фазе, то мы можем его получить через этот work around.

А prop:procedure - это просто специальный интерфейс ф-й, ну как в скале трейт Function - если структура реализует этот prop:procedure, то ее инстансы могут использоваться везде в качестве ф-й. В частности, мы можем определить структуру с prop:procedur, в котором ф-я будет имет тип syntax->syntax и тогда инстансы такой структуры можно использовать в качестве макросов - но при этом этот инстанс будет не прсото ф-ей макросом, но еще и иметь доп. информацию (поля структуры, собственно)

Например, сама форма определения структуры (struct struct-name args ...) определяет struct-name как макрос (define-syntax struct-name ...) и именно кладет в struct-name инстанс структуры с определенным prop:procedure. Как ф-я-макрос (struct-name args ...) раскрывается в конструктор структуры struct-name, но если мы сделаем (syntax-local-value #'struct-name) то получим обычный инстанс стурктуры к полям которого имеем доступ, с-но в этих полях сеттеры/геттеры, информация о супер-структуре и т.д. - все доступно в 1 фазе из других макросов. С-но макрос match когда в паттерне видит какой-то id, то он проверяет - а не является ли этот id указанным инстансом и если да, то через syntax-local-value получает его поля и на основе этой информации генерирует код для разбора значения.
(Reply) (Parent) (Thread)