为了学习Scheme宏,我正在学习Kent Dybvig的"The Scheme Programming Language“。
在8.2节http://www.scheme.com/tspl4/syntax.html#./syntax:h2中,他有一个"or“宏的例子。
(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 ...))))))这两个表单是否等同地展开?
发布于 2011-12-14 04:01:34
我这样做是为了让事情更清楚一些--您的简单形式取决于案例的顺序,因为(or x)可以同时匹配第二条和第三条规则。因此,使案例互斥使其更容易阅读,也更健壮。
(顺便说一下,这里有一个更微妙的观点,我最初以为你是在问这个问题:为什么不进一步简化它:
(define-syntax or
(syntax-rules ()
((_) #f)
((_ e1 e2 ...)
(let ((t e1)) (if t t (or e2 ...))))))?)
发布于 2011-12-14 03:48:01
后跟...的子模式可以匹配零个或多个输入元素。使用e1 e2 e3使这种情况与前一种情况截然不同。
https://stackoverflow.com/questions/8495091
复制相似问题