[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
解决了我的一个问题啊 呵呵 谢谢啊
Global site tag (gtag.js) - Google Analytics