如何在 MIT Scheme 中编写一个简单的宏?

How to write a simple macro in MIT Scheme?

我正在尝试将这个简单的 Common Lisp 宏代码翻译成 MIT Scheme 代码:

(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 Scheme 中编写这段代码的正确方法是什么?

虽然许多 Scheme 实现具有 defmacro,但如果它具有像 Common Lisp、Scheme 中的参数,或者表达式也是一种特殊形式,则有所不同。它不是便携式的。从 R5RS 你可以使用 `syntax-rules:

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

(calc 4 + 3) ; ==> 7