【问题标题】:The Little Schemer: `lat?` without `cond`?小计划者:“拉特?”没有“安全套”?
【发布时间】:2018-04-25 11:01:00
【问题描述】:

The Little Schemer (4th edition)第二章的第一个问题要求读者编写函数lat?,如果l是原子列表,(lat? 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))))

这两种实现方式有什么明显区别吗?

【问题讨论】:

  • 没有。除了or 的实际存在,非暗示存在; cond 表达式有效地定义了它。

标签: scheme the-little-schemer


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2012-08-26
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多