расширение макроса в схеме Guile - PullRequest
0 голосов
/ 28 апреля 2018

В Guix есть слой из макросов, украшающий создание и управление записями srfi-9

Код находится в guix / records.scm

код большой и четко сформулированный

Я подумал расширить эти макросы, чтобы увидеть их ввод и вывод, чтобы понять, что они делают

Дело в том, что даже стандартные записи vanilla srfi-9 являются макросами вокруг структур, в свою очередь

Итак, расширение макроса дает мне полностью расширенный код для создания и управления структурами.

Я бы предпочел увидеть результат одного прохода раскрытия макроса, чтобы увидеть, какой код srfi-9 сгенерировал макрос Guix

В Clojure есть macroexpand и macroexpand-1

macroexpand-1 выполняет один проход раскрытия макроса и macroexpand повторно вызывает macroexpand-1 до тех пор, пока в обрабатываемых формах больше не будет макросов для расширения

Вы можете увидеть это здесь

Есть ли аналогичная опция в схеме Guile?

Мне не хватает трюка рабочего процесса, какого-либо инструмента, какой-либо библиотечной функции или макроса для решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вот простая версия 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 aka переносимый синтаксис-регистр смотрите в книге "Красивый код" для главы Дибвига.

https://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf

0 голосов
/ 28 апреля 2018

Хорошо, в файле NEWS есть этот отрывок

** Удалена функция: `macroexpand-1 '

Неясно, как реализовать `macroexpand-1 'с синтаксическим регистром, хотя схема PLT доказывает, что это возможно.

Я не знаю, в чем проблема между macroexpand-1 и синтаксисом, и я не знаю, что Racket делает с этим

Но, по крайней мере, теперь я знаю, что macroexpand-1 был явно удален

...