2009年6月28日日曜日

【フムフム本】6章 リスト


* 6章 リスト
** 6.1 リストのふたつの顔
- 「クォートはあくまで「プログラムとして解釈される
箇所で、データであることを示す」」というのはうま
い説明だなぁ。
- Common Lisp的には、「quoteはspecial operatorであ
り、the evaluatorは、その引数を評価せずにそのま
ま(readerから渡されたform(lisp objects)のまま)を
値として返す」かな。
** 6.2 リストの基本操作
- お、
gosh> (cdr '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________
gosh>
なんと。
- 「空でないリストXに対して、(cons (car X) (cdr
X))は常に元のリストと同じになる」これは「同じ」
の定義によるのでは。
** コラム クォートとeval
- お、Gaucheにはevalがあるんだ。
** 6.3 リストの走査
- foldはCommon Lispのreduceみたいなもんかな。
- foldのいろんな活用、おもしろい。
** 6.4 foldの定義
- なんか、#'がいないと寂しい気持になる。
- #?=、便利。これもreader macroでCommon Lispに導
入したいなぁ。
** 6.5 簡単なリスト処理
- う、deep-copy-list、書いてみたけど同等に関する
述語がわからないのでテストできない。

(define (deep-copy-list lis)
(if (pair? lis)
(cons (deep-copy-list (car lis))
(deep-copy-list (cdr lis)))
lis))

- ()に慣れちゃったので[]は面倒。[]って初学者にど
れくらい有効なんだろう?
- うーん。再帰、久しぶりなので頭がぼけぼけ。
- 練習問題

gosh> (define (mylength lis)
(if (pair? lis)
(+ 1 (mylength (cdr lis)))
0))
mylength
gosh> (mylength '())
0
gosh> (mylength '(a))
1
gosh> (mylength '(a b))
2
gosh> (mylength '((a) (b c)))
2
gosh> (define (myfilter pred proper-list)
(cond
((null? proper-list) proper-list)
((pred (car proper-list))
(cons (car proper-list) (myfilter pred (cdr proper-list))))
(else (myfilter pred (cdr proper-list)))))
myfilter
gosh> (myfilter odd? '(1 2 3 4 5))
(1 3 5)
gosh> (myfilter odd? '())
()
gosh> (myfilter odd? '(1))
(1)
gosh> (myfilter odd? '(2))
()
gosh>

** 6.6 2種類の再帰
- う、末尾再帰をちゃんと理解していなかったことが
わかった。
** コラム なぜ配列でなく対で並びを表現するのか?
- 特になし。

こつこつ。

0 件のコメント: