Scheme if和cond之间的区别是什么?
我现在正在学习sicp并做ex2.23 我已编写了以下代码:Scheme if和cond之间的区别是什么?,scheme,sicp,Scheme,Sicp,我现在正在学习sicp并做ex2.23 我已编写了以下代码: (define (for-each proc items) (if (null? items) #t ((proc (car items)) (for-each proc (cdr items))))) 但在运行时,会导致错误:过程应用程序:预期过程,给定:#;论点是:() 我想我知道原因:我递归地调用for-each函数,每次调用for-each都希望返回值 但当我修改代码时: (
(define (for-each proc items)
(if (null? items)
#t
((proc (car items))
(for-each proc (cdr items)))))
但在运行时,会导致错误:过程应用程序:预期过程,给定:#;论点是:()
我想我知道原因:我递归地调用for-each函数,每次调用for-each都希望返回值
但当我修改代码时:
(define (for-each proc items)
(cond ((null? items) #t)
(else (proc (car items)) (for-each proc (cdr items)))))
它运行良好。我不明白,为什么?在条件中,是否对每个调用都不需要返回值
我使用DrScheme,并选择语言
我不是以英语为母语的人,所以如果有什么东西描述不清楚,请告诉我
但在运行时,导致错误:过程应用程序:预期>过程,给定:#;论点是:()
我想我知道原因:我递归地调用for each函数,>每次调用for each都希望返回值
不,这是因为在if
的替代条款中,您有组合((过程(车辆项目))(对于每个过程(cdr项目))
。您打算按顺序评估这两种组合(过程(汽车项目))
和(对于每个过程(cdr项目))
,为此,您认为将它们放在另一对括号中是可行的。但实际上,您指定的是(proc(car项))
的结果是一个应用于参数的过程,该参数是(对于每个proc(cdr项))
的返回值。情况并非如此,您会得到一个错误。关键的一点是,Lisp中的括号不是用于分组的,而是具有明确的意义
问题是,if
在该位置只能有一个组合,而您希望一行有两个组合。另一方面,cond
不受这种限制;你可以在cond
子句的后续部分中放入你内心想要的任意长的单个组合序列。这种情况就是语言的工作定义
在这些情况下,您也可以使用cond
,但如果您仍然想使用if
,则有一些选项可以将多个组合填充到一个组合中。例如。您可以创建一个lambda过程,其主体是两个组合,并立即将其触发:
(define (for-each proc items)
(if (null? items)
#t
((lambda ()
(proc (car items))
(for-each proc (cdr items)) )) ))
如果要对
if
子句中的多个语句求值,begin
是正确的做法
(define (for-each proc items)
(if (null? items)
#t
(begin
(proc (car items))
(for-each proc (cdr items)) ) ))