想象一下,您将其编写if为函数/过程而不是用户定义的宏/语法:
;; makes if in terms of cond
(define (my-if predicate consequent alternative)
(cond (predicate consequent)
(else alternative)))
;; example that works
(define (atom? x)
(my-if (not (pair? x))
#t
#f))
;; example that won't work
;; peano arithemtic
(define (add a b)
(my-if (zero? a)
b
(add (- a 1) (+ b 1))))
问题my-if在于,作为一个过程,每个参数都会在过程主体执行之前进行评估。因此在atom?部件(not (pair? x))中,#t并在执行#f主体之前进行了评估my-if。
对于最后一个示例(add (- a 1) (+ b 1)),无论 a 是什么,即使 aa为零,均会对其进行评估,因此该过程将永远不会结束。
您可以使用语法制作自己的 if:
(define-syntax my-if
(syntax-rules ()
((my-if predicate consequent alternative)
(cond (predicate consequent)
(else alternative)))))
现在,您如何阅读本文的第一部分是一个模板,其中谓词 consequent 和 Alternative 表示未计算的表达式。它被替换为另一个只是重用表达式,以便:
(my-if (check-something) (display 10) (display 20))
将被替换为:
(cond ((check-something) (display 10))
(else (display 20)))
使用程序版本my-if10 和 20 将被打印。这也是如何and实现or的。