2.2.1 並びの表現

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html#%_sec_2.2.1
ようやく、リストが出てくる。リストは、ポインタであり、最後のデータのcdrには、nullポインタがセットされている。

リストの操作には主に3つある。

  1. リストを順に"cdrダウン"する
  2. リスト全体を"cdrダウン"する
  3. リストをcdrダウンしつつ、"consアップ"する

正直、この3つの違いがよくわからない。おそらく、普段意識することが無いからだろうな。

問題2.17
(define (last-pair items)
  (if (null? (cdr items))
	  items
	  (last-pair (cdr items)))
問題2.18

再帰プロセスで書こうとして、結局断念した。再帰プロセスで書くのは無理なのかな?

(define (myreverse items)
  (define (iter a b)
	(if (null? b)
		a
		(iter (cons (car b) a) (cdr b))))
  (iter '() items))

追記(09.11.05) SICP Lite#6で再帰版を考えたらあっさりできた。

(define (myreverse items)
  (if (null? items)
	  '()
	  (append (myreverse (cdr items)) (list (car items)))))
問題2.19
(define (first-denomination items)
  (car items))
(define (except-first-denomination items)
  (cdr items))
(define (no-more? items)
  (null? items))
問題2.20

すみません。答え見てまいました。

(define (same-parity x . y)
  (define pred (if (even? x) even? odd?))
  (define (filter p xs)
	(cond ((null? xs) '())
		  ((pred (car xs))
		   (cons (car xs) (filter p (cdr xs))))
		  (else 
		   (filter p (cdr xs)))))
  (cons x (filter pred y)))
問題2.21
  • 通常のリスト操作版
(define (square-list1 items)
  (if (null? items)
	  '()
	  (cons (square (car items)) (square-list1 (cdr items)))))
  • map版
(define (square-list2 items)
  (map square items))
問題2.22

Iterativeにすると、リストが逆順になる。これは、最初に作ったconsセルを包み込むように次のconsセルが作られてしまうため。

問題2.23

反則だと思うけど、begin式を使った。

(define (my-foreach proc items)
  (if (not (null? items))
	  (begin 
		(proc (car items))
		(my-foreach proc (cdr items)))))