Расширение макроса в схеме guile
В Guix есть слой из макросов, украшающий создание и манипулирование записями srfi-9
Код находится в guix/records.scm
Код большой и четко сформулированный
Я думал расширить эти макросы, чтобы увидеть их ввод и вывод, чтобы понять, что они делают
Дело в том, что даже стандартные записи vanilla srfi-9 являются макросами вокруг структур, в свою очередь
Таким образом, расширение макроса дает мне полностью расширенный код для создания и управления структурами.
Я бы предпочел увидеть результат одного прохода раскрытия макроса, чтобы увидеть, какой код srfi-9 создал макрос guix
В Clojure есть macroexpand
а также macroexpand-1
macroexpand-1
делает один проход расширения макроса и macroexpand
звонки macroexpand-1
несколько раз, пока не будет больше макров для расширения в обрабатываемых формах
Вы можете увидеть это здесь
Есть ли подобная опция в схеме Гиле?
Я пропускаю какой-либо трюк рабочего процесса, любой инструмент, любую библиотечную функцию или макрос для решения этой проблемы?
2 ответа
Хорошо, в файле NEWS есть этот отрывок
** Удалена функция: `macroexpand-1'
Неясно, как реализовать `macroexpand-1 'с синтаксическим регистром, хотя схема PLT действительно доказывает, что это возможно.
Я не знаю, в чем проблема между macroexpand-1 и syntax-case, и я не знаю, что Racket делает с этим
Но по крайней мере теперь я знаю, что macroexpand-1 был явно удален
Вот простая версия macroexpand1
:
#lang racket
(define-syntax (expand1 stx)
(syntax-case stx ()
[(_expand1 form)
(syntax-case #'form ()
[(id . more)
(identifier? #'id)
(let ([transformer (syntax-local-value #'id)])
(with-syntax ([expansion (transformer #'form)])
#''expansion))]
[_
#''form])]))
(expand1 (or 1 2 3))
Выход:
'(let ((or-part 1)) (if or-part or-part (or 2 3)))
Обратите внимание, что алгоритм расширения макросов Clojure более прост, чем тот, который используется в большинстве реализаций Scheme.
Для объяснения psyntax
Портативный синтаксис-кейс смотрите в книге "Красивый код" для главы Дыбвига.