Lisp系言語なんだからリストを使えないと

主にもうひとつの Scheme 入門を参考にあれこれ。
リストを扱えるようにならにゃ、Schemeでプログラミングはできねえ。らしい。さてやってみよう。

gosh> (cons 1 2)
(1 . 2)
gosh> (cons 3 (cons 1 2))
(3 1 . 2)
gosh> (cons (cons 1 2) (cons 3 4))
((1 . 2) 3 . 4)
gosh> (car (cons 1 2))
1
gosh> (cdr (cons 1 2))
2

コンスセルとやら。(cons 1 2)の1をcar部、2をcdr部と呼ぶ。car部とcdr部はcar、cdrで取り出せる。

gosh> (cons 1 (cons 2 (cons 3 '())))
(1 2 3)
gosh> (quote (1 2 3))
(1 2 3)
gosh> '(1 2 3)
(1 2 3)

末尾データが'()(空リスト)である一連のコンスセルをリストと呼ぶと。quoteは与えられた引数をリストとする。'(hogehoge)(quote (hogehoge))の省略形。

追記

ちょっと違ったぽい。quoteは与えられたシンボルを評価せずに、そのままシンボルとして返す。とかそんな。

gosh> (car '(1 2 3 4))
1
gosh> (cdr '(1 2 3 4))
(2 3 4)
gosh> (car (cdr '(1 2 3 4)))
2
gosh> (cdr (cdr '(1 2 3 4)))
(3 4)

リストはコンスセルなので、carとcdrで値を取りだせる。

gosh> (list)
()
gosh> (list 1 2 3)
(1 2 3)
gosh> (list 1 '(3 4 5) '(a b c))
(1 (3 4 5) (a b c))

要素がたくさんあるリストはlistで作るといいらしい。

うーんここまでやったら、あとはlambdaでほげほげしたら、意外とそれなりに便利なことさせれる気がしてきた。
あと宣言する。末尾再帰はあとまわしにする。

test