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

Common lisp 如何在MIT Scheme中编写一个简单的宏?,common-lisp,mit-scheme,Common Lisp,Mit Scheme,我正在尝试将这个简单的通用Lisp宏代码转换为MIT Scheme代码: (defmacro calc (a op b) (list op a b)) (calc 2 + 3) 上述代码按预期打印5 我如何在麻省理工学院的计划中做同样的事情?以下是我的尝试: (defmacro (calc a op b) (list op a b)) (calc 2 + 3) 上述代码失败,出现此错误: Unbound variable: b 在麻省理工学院的方案中,写这段代码的正确方法是什么

我正在尝试将这个简单的通用Lisp宏代码转换为MIT Scheme代码:

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

(calc 2 + 3)
上述代码按预期打印
5

我如何在麻省理工学院的计划中做同样的事情?以下是我的尝试:

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

(calc 2 + 3)
上述代码失败,出现此错误:

Unbound variable: b

在麻省理工学院的方案中,写这段代码的正确方法是什么

虽然许多Scheme实现都有
defmacro
,但如果它有Common Lisp、Scheme等参数,或者表达式也是一种特殊形式,则会有所不同。它不是便携式的。在R5RS中,您可以使用`语法规则:

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

(calc 4 + 3) ; ==> 7

使用DEFINE syntax在
(\uA op b)
开头的
\uuuu
是什么意思?@LoneLearner
与其他符号一样是一个符号。它将匹配模式中的
calc
。有些人喜欢使用这个名称,例如
(计算a op b)
,但是你从来没有实际使用过第一个符号,所以经常使用