【问题标题】:Syntax error in scheme macro expansion方案宏扩展中的语法错误
【发布时间】:2012-09-22 17:58:31
【问题描述】:

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

谁能解释一下这个错误的原因?

【问题讨论】:

    标签: macros scheme


    【解决方案1】:

    在 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))
    

    【讨论】:

    • 确定我知道这些参数。我只是想弄清楚宏是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多