1

The Little Schemer(第 4 版)第二章中的第一个问题要求读者编写函数lat?,如果是原子列表,(lat? l)则返回 true 。l

它接着说:

您还没有预料到能够做到这一点,因为您仍然缺少一些成分。

但是我对递归很熟悉,并且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))))

这两种实现之间有什么显着区别吗?

4

1 回答 1

1

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

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

它的语义是它将test-expression按顺序评估 s,并且对于它找到要评估的第一个#ttrue值),然后它将评估其关联then-expression并返回其值。如果所有的test-expressions 评估为#ffalse值),并且else存在一个子句,那么它将then-expression3在这种情况下评估其关联,并返回其值。

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

于 2017-11-13T13:27:21.337 回答