SICP 読み (20)

微妙なまま進行しています。今日は問題 2.24 以降がどこまでできるか。

問題 2.24

机上で考えてみた。最初、

(list 1 (list 2 (list 3 4))) ;; => (1 (2 (3 4)))

(1 2 3 4)

と同じか、と勘違いしてしまっていて、びっくり。cons なナニと間違えていた。ちなみに、

(cons 1 (cons 2 (cons 3 (cons 4 '())))) ;; => (1 2 3 4)

なんだったよ。(ため息

たしかこんな感じ (動作確認してない

gosh> (define l (list 1 (list 2 (list 3 4))))
l
gosh> l
(1 (2 (3 4)))
gosh> (car l)
1
gosh> (cdr l)
((2 (3 4)))
gosh> (car (cdr l))
(2 (3 4))
gosh> (car (car (cdr l)))
2
gosh> (cdr (car (cdr l)))
((3 4))
gosh> (car (cdr (car (cdr l))))
(3 4)
gosh>

ちょっと(??)まだまだ慣れてない。マンガは略します。

問題 2.25

これも先にこっちに書いてみる。

7 を取りだす car 又は cdr とゆー事で。

gosh> (cdr (car (cdr (cdr '(1 3 (5 7) 9)))))
7
gosh> (car (car '((7))))
7
gosh> (define l '(1 (2 (3 (4 (5 (6 7)))))))
gosh> (cdr (cdr (car (cdr (car (cdr (car (cdr (car (cdr l))))))))))
7
gosh>

どうか。やってみたのが以下。

gosh> (cdr (car (cdr (cdr '(1 3 (5 7) 9)))))
(7)
gosh>

違った。こうか。

gosh> (car (cdr (car (cdr (cdr '(1 3 (5 7) 9))))))
7
gosh>

次。

gosh> (car (car '((7))))
7
gosh> 

これは OK。次。

gosh> (define l '(1 (2 (3 (4 (5 (6 7)))))))
l
gosh> (cdr (cdr (car (cdr (car (cdr (car (cdr (car (cdr l))))))))))
()
gosh> 

ぎゃー。多すぎてワケワカ。以下、試行錯誤。(とほほ

gosh> (cdr (car (cdr (car (cdr (car (cdr (car (cdr l)))))))))
((6 7))
gosh> (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr l))))))))))
(6 7)
gosh> (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr l)))))))))))
(7)
gosh> (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr l))))))))))))
7
gosh> 

このあたり、きちんと理解しておかないと後で泣きを見そうです。
しかも傾向として末端のナニを cdr 一発で取り出せるという誤解があるな。(駄目

問題 2.26

これも机上検討を晒して別途検証。

gosh> (define x (list 1 2 3))
x
gosh> (define y (list 4 5 6))
y
gosh> (append x y)
(1 2 3 4 5 6)
gosh> (cons x y)
((1 2 3) . (4 5 6))
gosh> (list x y)
((1 2 3) 4 5 6)
gosh>

どうなるか。(怖

gosh> (define x (list 1 2 3))
x
gosh> (define y (list 4 5 6))
y
gosh> (append x y)
(1 2 3 4 5 6)
gosh> (cons x y)
((1 2 3) 4 5 6)
gosh> (list x y)
((1 2 3) (4 5 6))
gosh> 

駄目ぢゃん。(とほほほ

リストな考え方はもうすこし机上で修行が必要な模様。精進させて頂きます。ってか、他の問題も未着手のナニ以外は答え合わせをしといた方が良いな。