SICP 読み (123) 3.5.1 ストリームは遅延リスト

ざくっと読んだのですが、すごい面白そう。でもちょっとリハビリ必要です。
リハビリついでにコードを書きうつしてみる。まず filter

(define (filter pred seq)
  (cond ((null? seq) '())
	((pred (car seq))
	 (cons (car seq)
	       (filter pred (cdr seq))))
	(else
	 (filter pred (cdr seq)))))

次は accumulate

(define (accumulate op initial seq)
  (if (null? seq)
      initial
      (op (car seq)
	  (accumulate op initial (cdr seq)))))

もう一つ enumurate-interval

(define (enumurate-interval low high)
  (if (> low high)
      '()
      (cons low (enumulate-interval (+ low 1) high))))

あるいは list-ref ってドコにあったっけ、と言いつつ自分のブログを検索。SICP ガラミではエントリ入ってない。gosh で見てみると標準プロシージャとして定義。

gosh> list-ref
#<subr list-ref>
gosh>

挙動としては以下。

gosh> (list-ref '(a b c) 0)
a
gosh> (list-ref '(a b c) 1)
b
gosh> (list-ref '(a b c) 2)
c
gosh> (list-ref '(a b c) 3)
*** ERROR: argument out of range: 3
Stack Trace:
_______________________________________
gosh> 

次。map は以下。

(define (map p seq)
  (if (null? seq)
      '()
      (cons (p (car seq))
	    (map p (cdr seq)))))

for-each は問題 2.23 で実装なソレがあるようですが、スルーしてませんように。一応解答が投入されてた。以下。

(define (for-each proc list)
  (let f ((l list))
    (cond ((null? l) #t)
	  (else
	   (proc (car l))
	   (f (cdr l))))))

この頃、名前付き let が好きだったんだよねぇ (何

そろそろ stream

手でコードを打つだけで例示されているソレ達もさくっと頭に入ってくるような気がするんですが、それを略して見るだけで理解できんと駄目かも、と思う。年寄りなんで勘弁して下さひ。
で、_ストリームの実装の働き_な項については、もう少し時間が欲しい。(弱