方案宏扩展中的语法错误

时间:2012-09-22 17:58:32

标签: macros scheme

只是为了理解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逐步扩展宏,但它会立即停止。

有人能解释一下这个错误的原因吗?

1 个答案:

答案 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))