Как сделать macroexpand-1 и macroexpand в схеме MIT? - PullRequest
1 голос
/ 03 марта 2020

В Common Lisp я могу определить двухуровневый макрос и развернуть макрос следующим образом:

(defmacro calc (a op b)
  (list op a b))

(defmacro twice (x)
  (list 'calc x '+ x))

(twice 10)
(macroexpand-1 '(twice 10))
(macroexpand '(twice 10))

Вывод:

20
(CALC 10 + 10)
(+ 10 10)

Теперь я пытаюсь сделать то же самое в схеме MIT:

(define-syntax calc
  (syntax-rules ()
    ((_ a op b)
     (op a b))))

(define-syntax twice
  (syntax-rules ()
    ((_ x)
     (calc x + x))))

(twice 10)

Как я могу сделать эквивалент macroexpand-1 и macroexpand в схеме MIT?

1 Ответ

0 голосов
/ 04 марта 2020

В Racket macroexpand будет

(syntax->datum
  (expand-to-top-form '(twice 10)))
;; '(+ 10 10)

, а macroexpand-1 будет

(syntax->datum (expand-once '(twice 10)))
;; '(calc 10 + 10)

Есть схемы для макро-отладки в схеме М. Феллайзена. Смотри здесь .

...