Lispの話(データ型)
こんばんは、たくさん寝太郎です。
先日Lispの記事を書いた後に海外の掲示板からアクセスがあってビビりました(小心者)
今日はデータ型の話をします。
LispはList processorの略ということもありリストが主なデータ構造となっています。
他にはシンボル、数値、文字列などがあります。
コードモードとデータモード
REPLに何かを打ち込む時、コンパイラはそれをコマンドだと解釈し実行します。(コードモード)
コードはフォームという、最初の要素が特別なコマンドになっているリストである必要があります。
(+ 1 (* 2 3))
上のコードは2つのフォームがネストしており、(* 2 3)が実行された後(+ 1 6)が実行されて7を返します。
対してデータモードでは入力されたものを全てデータとして扱い、実行はしません。
リストの前に'(シングルクオート)を置くことで式を評価せずにデータとして扱います。
'(+ 1 (* 2 3))
このコードを実行すると(+ 1 (* 2 3))がそのまま返ってきます。
リスト
Lispのリストはコンスセルで繋がっています。
どんな構造になっているかは「Lisp リスト」でググると図が出てくるのでそちらを見てください。(図を作るのが面倒くさい)
リストを扱う基本的な関数はcons,car,cdrです。
cons
(cons 1 '(2 3 4))
(1 2 3 4)
2つのデータを結びたい時に使うのがconsです。上のコードは次のようにconsを連ねて書くこともできます。
(cons 1 (cons 2 (cons 3 (cons 4 ()))))
carとcdr
carはセルの最初のスロットにあるデータを取り出し、cdrは2番目のスロットの値を取り出すのに使います。
(car '(1 2 3 4)) 1
(cdr '(1 2 3 4)) (2 3 4)
(1 2 3 4)から2を取り出したいときはcdrを使った後carを使えば良いことが分かります。
(car (cdr '(1 2 3 4)))
cadrやcdarやcadadrなどといった関数が既に用意されているので、上のコードは次のように表すこともできます。
(cadr '(1 2 3 4))
list
consの引数は2つですが、listは任意個の引数を取ります。以下の2つのコードはどちらも同じリストを返します。
(cons 1 (cons 2 (cons 3 (cons 4 ())))) (list 1 2 3 4)
以上でLand of Lisp第一部終了です。
次回は条件判断について書こうと思います。