0

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

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

4

1 回答 1

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))
于 2012-09-22T18:47:53.220 回答