我现在正在学习sicp并且做了ex2.23我已经修改了以下代码:
(define (for-each proc items)
(if (null? items)
#t
((proc (car items))
(for-each proc (cdr items)))))
Run Code Online (Sandbox Code Playgroud)
但在运行时,会导致错误:程序应用程序:预期程序,给定:#; 参数是:()
我想我知道原因:我以递归方式调用for-each函数,每个调用for-each想要返回值
但是当我修改代码时:
(define (for-each proc items)
(cond ((null? items) #t)
(else (proc (car items)) (for-each proc (cdr items)))))
Run Code Online (Sandbox Code Playgroud)
它运行良好.我不明白,为什么?在cond中,是否每次都要求 - 每个都不需要返回值?
我使用DrScheme,并选择语言SICP
我不是母语英语的人,所以如果有一些没有清楚描述的话,请告诉我
但在运行时,会导致错误:程序应用程序:预期>程序,给出:#; 参数是:()
我想我知道原因:我以递归方式调用for-each函数,>每个调用for-each想要返回值
不,这是因为在替代条款中if你有这个组合((proc (car items)) (for-each proc (cdr items))).您打算两个组合评估(proc (car items))和(for-each proc (cdr items))顺序,并为此你以为他们将在另外一对括号会工作的.但实际上,你所指定的是结果(proc (car items))是一个应用于参数的过程,它是返回值(for-each proc (cdr items)).情况并非如此,您会收到错误消息.关键点在于Lisp中的括号不是用于分组,而是具有一定的意义.
问题是if在该位置只能有一个组合,而你想要连续两个.另一方面,cond不受此限制; 你可以按照你的心愿,在一个cond条款的后续部分中加入一系列单独的组合.这种状态只是语言的定义方式.
您也可以cond在这些情况下使用,但如果您仍想使用if,则可以使用一些选项将多个组合填充到一个组合中.E. g.你可以创建一个lambda程序,它的主体是两个组合并立即将其关闭:
(define (for-each proc items)
(if (null? items)
#t
((lambda ()
(proc (car items))
(for-each proc (cdr items)) )) ))
或者您可以使用begin实际上用于此目的的那些:
(define (for-each proc items)
(if (null? items)
#t
(begin
(proc (car items))
(for-each proc (cdr items)) ) ))