想象一下,您将其编写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-if
10 和 20 将被打印。这也是如何and
实现or
的。