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++。