Как написать простой макрос в MIT Scheme? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь перевести этот простой макрос макрос Common Lisp в код схемы MIT:

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

(calc 2 + 3)

Приведенный выше код печатает 5, как и ожидалось.

Как мне сделать то же самое вещь в схеме MIT? Вот моя попытка:

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

(calc 2 + 3)

Приведенный выше код завершается ошибкой с этой ошибкой:

Unbound variable: b

Как правильно написать этот код в схеме MIT?

1 Ответ

1 голос
/ 03 марта 2020

Хотя многие реализации Scheme имеют defmacro, оно отличается, если оно имеет аргументы, как в Common Lisp, Scheme или если выражение также является специальной формой. Это не портативный. Из R5RS вы можете использовать `синтаксические правила:

(define-syntax calc
  (syntax-rules () 
   ((_ a op b)   ; pattern  
    (op a b))))  ; expansion

(calc 4 + 3) ; ==> 7
...