The Little Schemer(第4版)第二章中的第一个问题之一要求读者编写函数lat?
,如果(lat? l)
是一个列表,l
将返回true原子。
接着说:
你还没有能够做到这一点,因为你仍然缺少一些成分。
但我熟悉递归,本书前面的atom?
的定义已经介绍and
(进一步暗示or
的存在),所以我试了一下无论如何:(repl)
(define lat?
(lambda (l)
(or
(null? l)
(and
(atom? (car l))
(lat? (cdr l))))))
在下一页上,本书介绍cond
运算符以启用lat?
的定义:
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
这两种实现之间是否存在显着差异?
答案 0 :(得分:1)
cond
是一种特殊形式,采用(大致)形式
(cond
((test-expression) (then-expression))
((test-expression2) (then-expression2))
(else
(then-expression3)))
它的语义是它将按顺序评估test-expression
,并且对于它发现要评估为#t
的第一个(true
值),它将评估其关联的then-expression
并返回其值。如果所有test-expression
评估为#f
(false
值),并且存在else
子句,那么它将评估其中关联的then-expression3
case,并返回其值。
就语义而言,这两种实现是等价的。他们唯一的区别可能是,cond
版本在Scheme社区被认为更为惯用。