我在读 The Little Schemer 。由于我的英语水平不好,我对这一段感到困惑:
(cond ...)也有不考虑所有的财产 参数。但是,由于这个属性,既没有(和......)也没有 但是,(或......)可以用(cond ...)来定义为函数 (和......)和(或......)都可以表示为。的缩写 (cond ...) - 表达:
(and a b) = (cond (a b) (else #f) and (or a b) = (cond (a #t) (else (b))
如果我理解正确,它说(和......)和(或......)可以用(cond ...)表达式替换,但不能定义为包含的函数(cond .. )。为什么会这样?它与变量参数有什么关系吗?感谢。
P.S。我做了一些搜索,但只发现(cond ...)在其中一个条件评估为#f时忽略表达式。
答案 0 :(得分:5)
想象一下,您将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
为零,也会对其进行评估,因此该过程将永远不会结束。
您可以使用语法创建自己的:
(define-syntax my-if
(syntax-rules ()
((my-if predicate consequent alternative)
(cond (predicate consequent)
(else alternative)))))
现在,您如何阅读本文的第一部分是一个模板,其中谓词结果和替代表示未评估的表达式。它被另一个替换,只是重用表达式,以便:
(my-if (check-something) (display 10) (display 20))
将被替换为:
(cond ((check-something) (display 10))
(else (display 20)))
使用my-if
的程序版本,将打印10和20。这也是and
和or
的实施方式。
答案 1 :(得分:1)
您无法将cond
或and
或or
或if
定义为函数,因为函数会评估所有参数。 (您可以将其中一些定义为宏)。
另请阅读着名的SICP和Lisp In Small Pieces(法语original)。