理系学生日記

おまえはいつまで学生気分なのか

問題2-23

for-eachを実装しろって話なんですけど、なんか結構むずかしかった。
難しかったのは、リストが空リストでないとき

  • 関数をリストの先頭要素に作用させる
  • リストの残りの要素に対して再帰的にfor-eachを呼び出す

てのを同時に行わないといけないところ。2つの処理を連続しては書けないぽいので、そこをどう書くかがなやみどころ。
で、悩んだあとこんなの書いてみた。

(define (for-each f li)
  (if (null? li)
      #t
      (let ((ans (f (car li))))
	(for-each f (cdr li)))))

letで変数bindするときに、リストの先頭要素に作用させるという(たぶん)行儀の悪い方法。
とりあえずうごく。

gosh> (for-each (lambda (x) (newline) (display x))
	  (list 57 321 88))

57
321
88#t

ホントはどうやるのが行儀がいいのかなぁ。

追記

cond使えばよかった…!

(define (for-each f li)
  (cond ((null? li) #t)
	(else (f (car li))
	      (for-each f (cdr li)))))

cond++。