我正在通过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 ...))))))
Run Code Online (Sandbox Code Playgroud)
有什么理由他没有使用更简单的形式:
(define-syntax or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e1 e2 ...)
(let ((t e1)) (if t t (or e2 ...))))))
Run Code Online (Sandbox Code Playgroud)
这两种形式是否等同扩展?
IMO,它是为了使事情更清晰 - 你的简单形式取决于案例的顺序,因为(or x)可以匹配第二和第三规则.因此,使案例互相排斥使其更易于阅读,也更加健壮.
(顺便说一句,那里有一个更微妙的观点,我最初认为你在问:为什么不进一步简化它:
(define-syntax or
(syntax-rules ()
((_) #f)
((_ e1 e2 ...)
(let ((t e1)) (if t t (or e2 ...))))))
Run Code Online (Sandbox Code Playgroud)
?)