Scheme if和cond之间的区别是什么?

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都希望返回值 但当我修改代码时: (

我现在正在学习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)
  (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)) ) ))