2

当我阅读The Scheme Programming Language 的宏部分时,它提到当您尝试使用 定义语法扩展define-syntax时,您应该使用pat ...在模式中指定零个或多个表达式。为什么不只使用...零个或多个表达式,在这种情况下pat ...意味着一个或多个表达式?

此外,当作者给出and如下定义时:

(define-syntax and
  (syntax-rules ()
    [(_) #t]
    [(_ e) e]
    [(_ e1 e2 e3 ...)
     (if e1 (and e2 e3 ...) #f)]))

为什么不直接写成这样:

(define-syntax and
  (syntax-rules ()
    [(_) #t]
    [(_ e) e]
    [(_ e1 e2 ...)
     (if e1 (and e2 ...) #f)]))

我已经用一些案例测试了这个定义,我没有发现任何问题。

4

1 回答 1

3

根据R6RS...必须始终遵循某个标识符才能获得其“零或多个”含义(它的行为类似于Kleene 星),因此...pat ...意味着不同的东西:就所涉及的而言,前者只是一个文字...符号syntax-rules

在您的示例中,这两种形式似乎是相同的,但这是因为该模式(_ e1 e2 ...)仅在有两个或多个连词(参数and)时才会触发,因为第二种模式(_ e)已经处理了只有一个连词的情况。它并不总是以这种方式工作,而且 Dybvig 显然发现编写明确的“两个或多个”子句而不是“完全一个”和“一个或多个”子句更简洁。

于 2013-09-19T13:01:34.690 回答