方案宏为“或”

时间:2011-12-13 19:37:21

标签: scheme

我正在通过Kent Dybvig"计划编程语言"为了学习Scheme宏,

在8.2节中 http://www.scheme.com/tspl4/syntax.html#./syntax:h2 他有"或"的例子。

的宏
(define-syntax or
   (syntax-rules ()
     ((_) #f)
     ((_ e) e)
     ((_ e1 e2 e3 ...)
      (let ((t e1)) (if t t (or e2 e3 ...))))))

他有什么理由不使用更简单的形式:

(define-syntax or
   (syntax-rules ()
     ((_) #f)
     ((_ e) e)
     ((_ e1 e2 ...)
      (let ((t e1)) (if t t (or e2 ...))))))

这两种形式是否等同扩展?

2 个答案:

答案 0 :(得分:6)

国际海事组织,这样做是为了让事情变得更加清晰 - 你的简单形式取决于案件的顺序,因为(or x)可以匹配第二和第三条规则。因此,使案例互相排斥使其更易于阅读,也更加健壮。

(顺便说一句,那里有一个更微妙的观点,我最初认为你在问:为什么不进一步简化它:

(define-syntax or
  (syntax-rules ()
    ((_) #f)
    ((_ e1 e2 ...)
     (let ((t e1)) (if t t (or e2 ...))))))

?)

答案 1 :(得分:2)

后跟...的子模式可以匹配输入的零个或多个元素。使用e1 e2 e3使这种情况与前一种情况截然不同。