以下所有内容均正确无误。但是第2版似乎有点令人困惑,因为它暗示了执行的顺序/顺序,我认为在功能性编程中不鼓励这样做。所以我想知道允许版本2的直觉/好处是什么。它是否仅仅用于比第3版更简单的代码?
; version 1
(define (foo x)
(cond ((> x 0) 1)))
; version 2
(define (foo x)
(cond ((> x 0) 1 2 3)))
; version 3
(define (foo x)
(cond ((> x 0)
(begin 1 2 3))))
答案 0 :(得分:2)
对于函数式编程(版本2或版本3),它不仅气馁,而且毫无意义。但是,如果您需要产生副作用(例如,打印),并且版本2比版本3稍微简单一点,则它非常有用。
答案 1 :(得分:1)
Scheme不是一种功能语言,更不用说非严格评估的语言了。 Scheme直接提供表格的顺序评估。 cond
表单本身并不具有严格的功能:它以严格的顺序评估测试子句,当它找到一个产生true的表项时,它会跳过其余的表单。因此,即使不在单个cond
子句中使用多个表单,我们也可以表达命令式编程:
(cond
((> x 10)
(set! y 3))
((< x 0)
(set! z 5)))
cond
表单在Lisp中有很长的历史。它存在于一些最早的Lisp版本中,并在1960年的Lisp 1手册中有所描述。在该手册中,实际描述的cond
不允许多种形式:它的参数是严格的对。在Lisp 1.5手册中仍然如此。在某些时候,Lisp方言开始在cond
条款中展示多形式支持。但奇怪的是,&#34; cond对&#34;术语拒绝死亡。
允许(cond (test1 e1 e2 .. en))
背后的直觉是,如果你不提供这个,程序员无论如何都会得到所需的行为,代价是额外的措辞,正如你的例子用明确的begin
所示:另一级括号嵌套,附有运算符符号。
它是原始cond
的向后兼容扩展。允许额外的表单不会改变之前正确的cond
表达式的含义;它为以前形成错误的cond
表达增加了意义。
Lisp的其他方言,例如Common Lisp和Emacs Lisp,在cond
子句中有多种形式评估,因此不允许在Scheme中使用它只会降低兼容性,增加某人的工作量将代码从另一种方言转换为Scheme。