只是为了理解Scheme宏如何工作我正在尝试定义一个新命令sum
,它与公共operator +
完全一样(即也是未定义的参数数量)。
我写了这段代码:
(define-syntax sum
(syntax-rules ()
((_ arg1 arg2 args...)
(sum (+ arg1 arg2) args...))
((_ arg1 arg2)
(+ arg1 arg2))
((_ arg1)
arg1)))
如果我传递1,2或3个参数,它就有效。但是有4个参数我得到了这个错误:
sum: bad syntax in: (sum 1 2 3 4)
我尝试使用DrRacket逐步扩展宏,但它会立即停止。
有人能解释一下这个错误的原因吗?
答案 0 :(得分:2)
在Scheme中,...
只是另一个标识符,因此在两个地方都需要args
和省略号(...
)之间的空格,如下所示:
(define-syntax sum
(syntax-rules ()
((_ arg1 arg2 args ...)
(sum (+ arg1 arg2) args ...))
___etc___))
顺便说一下,你不需要创建宏来接受任意数量的参数。你也可以使用“rest args”:
(define (sum . args)
;; args is bound to a list of all the arguments
(foldl + 0 args))