[language] Scheme语法请教
t0uch
2010-01-19
在做SICP 2.23这一题的时候,我的代码在最后会报错:
(define (for-each proc items) (if (not (null? items)) ((proc (car items)) (for-each proc (cdr items))))) 错误:procedure application: expected procedure, given: #<void>; arguments were: #<void> 莫非,这和返回值有关系? 看了一下别人的解答,加上let ()就ok了 (define (for-each proc items) (if (not (null? items)) (let () (proc (car items)) (for-each proc (cdr items))))) 请问一下这是为什么? |
|
aristotle9
2010-08-19
一般情况下 ( (...) (...) (...) ... )这样的结构是以第一个值为函数,后面的值作为参数进行调用.
在第一代码里,程序把(proc ...)返回的#<void>作为函数,for-each的返回值#<void>作为参数进行求值了.相当于命令式里的nil(nil) 如果要实现命令式一样顺序执行一系列的form,要用一些特殊的方法来做. 常用的是(begin (...) (...) ...),(let () (...) (...) ..)可以, 貌似(and (...) (...) ...)也行,用匿名函数来做也可以,像这样: (define (my-each foo lst) (if (not (null? lst)) (begin (foo (car lst)) (my-each foo (cdr lst))))) (define (my-each2 foo lst) (if (not (null? lst)) (and (foo (car lst)) (my-each2 foo (cdr lst))))) (define (my-each3 foo lst) (if (not (null? lst)) ((lambda () (foo (car lst)) (my-each3 foo (cdr lst)))))) 最后的方法可以返回自己想返回的东西 ps:也是在看SICP,共勉 |
|
silentpassing
2011-01-09
解决了我的一个问题啊 呵呵 谢谢啊
|