Scheme:COND在其主体中支持多个表达式的直觉是什么?

Scheme:COND在其主体中支持多个表达式的直觉是什么?,scheme,lisp,Scheme,Lisp,以下各项都是正确的。但是versoin 2似乎有点混乱,因为它建议执行的顺序/顺序,我认为在功能编程中不鼓励这样做。所以我想知道允许版本2的直觉/好处是什么。它只是为了比versoin 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

以下各项都是正确的。但是versoin 2似乎有点混乱,因为它建议执行的顺序/顺序,我认为在功能编程中不鼓励这样做。所以我想知道允许版本2的直觉/好处是什么。它只是为了比versoin 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))))

对于函数式编程(无论是版本2还是版本3),它不仅不受鼓励,而且毫无意义。但是,如果您需要产生副作用(例如打印),那么它是有用的,而版本2比版本3稍微简单一些。

对于函数式编程(版本2或版本3)来说,它不仅不受鼓励,而且毫无意义。但是,如果您需要产生副作用(例如打印),那么它是有用的,而版本2比版本3稍微简单一些。

Scheme不是函数式语言,更不用说非严格评估的语言了。Scheme直接提供表单的顺序评估。
cond
表单本身并没有严格的功能:它按照严格的顺序评估测试子句,当它找到一个产生true的子句时,它跳过其余的子句。因此,即使不在单个
cond
子句中使用多种形式,我们也可以表达命令式编程:

(cond
  ((> x 10)
   (set! y 3))
  ((< x 0)
   (set! z 5)))
(续)
((>x10)
(第三集)
(
cond
表单在Lisp中有着悠久的历史。它出现在一些最早的Lisp版本中,并在1960年的Lisp 1手册中进行了描述。在该手册中,实际上描述的
cond
不允许多种形式:它的参数是严格成对的。在LISP1.5手册中仍然是这样。在某种程度上,Lisp方言开始在
cond
子句中表现出对多种形式的支持。然而,奇怪的是,“cond pair”术语拒绝消亡

允许
(cond(test1 e1 e2..en))
的直觉是,如果您不提供这一点,程序员无论如何都会获得所需的行为,代价是额外的冗长,正如您的示例所示,显式的
开始
:另一个括号嵌套级别伴随着运算符符号

它是原始
cond
的向后兼容扩展。允许额外的形式不会改变以前正确的
cond
表达式的含义;它为以前格式错误的
cond
表达式增加了意义


Lisp的其他方言,如Common Lisp和Emacs Lisp,在它们的
cond
子句中有多个形式求值,因此在Scheme中不允许它只会降低兼容性,在将代码从另一种方言转换为Scheme时会增加工作量。

Scheme不是函数式语言,更不用说非严格评估的了。Scheme直接提供表单的顺序评估。
cond
表单本身并没有严格的功能:它按照严格的顺序评估测试子句,当它找到一个产生true的子句时,它跳过其余的子句。因此,即使不在单个
cond
子句中使用多种形式,我们也可以表达命令式编程:

(cond
  ((> x 10)
   (set! y 3))
  ((< x 0)
   (set! z 5)))
(续)
((>x10)
(第三集)
(
cond
表单在Lisp中有着悠久的历史。它出现在一些最早的Lisp版本中,并在1960年的Lisp 1手册中进行了描述。在该手册中,实际上描述的
cond
不允许多种形式:它的参数是严格成对的。在LISP1.5手册中仍然是这样。在某种程度上,Lisp方言开始在
cond
子句中表现出对多种形式的支持。然而,奇怪的是,“cond pair”术语拒绝消亡

允许
(cond(test1 e1 e2..en))
的直觉是,如果您不提供这一点,程序员无论如何都会获得所需的行为,代价是额外的冗长,正如您的示例所示,显式的
开始
:另一个括号嵌套级别伴随着运算符符号

它是原始
cond
的向后兼容扩展。允许额外的形式不会改变以前正确的
cond
表达式的含义;它为以前格式错误的
cond
表达式增加了意义


Lisp的其他方言,如Common Lisp和Emacs Lisp,在它们的
cond
子句中有多种形式求值,因此在Scheme中不允许它只会降低兼容性,在将代码从另一种方言转换为Scheme时会增加工作负载。

版本2和3完全相同,只是在版本2中,
begin
是隐式的。为什么您要担心
cond
:如果您想担心,请担心为什么
lambda
支持多个表达式。@tfb为什么您首先要在lambda表达式中编写多个表达式?但这是无关紧要的。我在问为什么Scheme的设计者允许版本2和版本3同时存在,而不是只存在一个(最好是版本3)。你似乎根本没有回答:(@wlnirvana:嗯,为什么他们不要求你写
(define(x…(begin…))
,而不是像我说的那样写
(define(x…)
),因为这是一个完全痛苦的原因,而隐式的
progn
(或者隐式的
begin
)使语言实际可用。第2版和第3版完全相同,只是在第2版中,
begin
是隐式的。为什么您要担心
cond
:如果您想担心,请担心为什么
lambda
支持多个表达式。@tfb为什么您要在fi中的lambda表达式中编写多个表达式第一位?但这与此无关。我在问为什么方案的设计者允许版本2和版本3同时存在,而不是只存在一个版本(最好是版本3)。而你似乎根本没有回答:(@wlnirvana:嗯,