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でほげほげしたら、意外とそれなりに便利なことさせれる気がしてきた。
あと宣言する。末尾再帰はあとまわしにする。