Lisp 从cond语句中删除多余的else?

Lisp 从cond语句中删除多余的else?,lisp,scheme,conditional-statements,the-little-schemer,Lisp,Scheme,Conditional Statements,The Little Schemer,我正在读第四版的《小阴谋家》。一个早期的练习是创建一个函数insertR,它在列表中给定值的右侧插入一个值。本书最终得出以下定义: (define insertR (lambda (new old lat) (cond ((null? lat) (quote ())) (else (cond ((eq? (car lat) old) (cons old (con

我正在读第四版的《小阴谋家》。一个早期的练习是创建一个函数
insertR
,它在列表中给定值的右侧插入一个值。本书最终得出以下定义:

(define insertR
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      (else (cond
              ((eq? (car lat) old)
               (cons old
                     (cons new (cdr lat))))
              (else (cons (car lat)
                          (insertR new old
                                   (cdr lat)))))))))
我自己的定义如下:

(define insertR
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      ((eq? (car lat) old) (cons old (cons new (cdr lat))))
      (else (cons (car lat) (insertR new old (cdr lat)))))))

它们相等吗?

是的,虽然我觉得你的更容易阅读
cond
支持多个子句,并对每个子句求值,直到其中一个求值为
true
值。因此,以下是:

(else (cond
        ((eq? (car lat) old) (cons old (cons new (cdr lat))))
        (else (cons (car lat) (insertR new old (cdr lat)))))))))
相当于将第二个
cond
的第一个子句移动到第一个子句:

(cond
  ((null? lat) (quote ()))
  ((eq? (car lat) old) (cons old (cons new (cdr lat))))
  (else (cons (car lat) (insertR new old (cdr lat)))))))

也许这本书的作者认为将终端
null
条件与其他两个条件分开更为明确,但如果是这样,那么
if
就足够了,而不是
cond
当然,这两个定义是等效的,但您的定义更容易阅读。请记住,你只在书的第三章,作者喜欢慢慢来。在同一章的后面部分,在第41页,他们将教给你所做的精确的简化——在一个
cond
表单中处理所有相互排斥的条件,而不是嵌套
cond
表单。

是的,这两个定义具有相同的行为

这本书之所以有两个条件,是因为它们有两个不同的用途。外部
cond
区分列表数据类型的两种情况(列表为
null
或第二个参数为列表的
cons
)。外部
cond
由正在使用的数据类型决定;列表上的所有结构递归函数都将具有外部的
cond
。内部
cond
特定于所定义的特定功能


因此,虽然将它们组合起来更紧凑,但通过将它们分开,可以使函数的结构与递归类型的结构更清晰地对应。如果你始终如一地使用这个习惯用法,它会使你的结构递归函数更容易阅读、调试和维护。

我要说的和Ryan一样:可读性仅次于正确性。事实上,如果你是一名学生,可读性可能比正确性更重要

书中出现的版本的优点是它有一个两臂cond,其中一个用于测试空性。这是完全正常和预期的解决问题的方法。当我看到这段分割时,我可以很快理解这两段代码的作用。在您的代码中,我必须停下来花时间确保这三种情况都是详尽的、相互排斥的,然后推断出哪些输入属于哪些箱子


这是我想让你们想象的:现在是晚上11:52,我累了,我的眼睛受伤了,我正在阅读学生们为同一个问题写的45个解决方案。我在寻找清晰,该死的。如果你能用一种方式写出你的解决方案,让它明显地表明你做得对,我会给你100%的回报,并祝福你的名字。

我相信没有人会在搜索引擎中搜索你的标题(以下函数是否等效)。。。你不能改进一下吗?是的,我想你是对的。我把它改成了希望更好的东西,尽管可以随意改变。不知何故,格多龙的暗示给了他一些成果:我现在正在读《小阴谋家》,寻找一个注意到同样事情的人:)然而,正如其他人所说,在第41页,作者似乎鼓励这种简化。实际上,我所指的例子在第47页,在他们展示了如何进行简化之后。我一直在等待他们简化这个例子,但他们从来没有这样做。我知道你是从哪里来的,但我越老越欣赏简洁,我读的代码越少,我就越容易理解函数的功能。当然,这是一个意见问题。