小计划者:`lat?`没有`cond`?

时间:2017-11-12 19:18:10

标签: scheme the-little-schemer

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))))

这两种实现之间是否存在显着差异?

1 个答案:

答案 0 :(得分:1)

cond是一种特殊形式,采用(大致)形式

(cond
  ((test-expression) (then-expression))
  ((test-expression2) (then-expression2))
  (else
   (then-expression3)))

它的语义是它将按顺序评估test-expression,并且对于它发现要评估为#t的第一个(true值),它将评估其关联的then-expression并返回其值。如果所有test-expression评估为#ffalse值),并且存在else子句,那么它将评估其中关联的then-expression3 case,并返回其值。

就语义而言,这两种实现是等价的。他们唯一的区别可能是,cond版本在Scheme社区被认为更为惯用。