たくさん寝太郎の寝床

料理とITと皿回しが好きなオタクのブログ

Lispの話(データ型)

こんばんは、たくさん寝太郎です。

先日Lispの記事を書いた後に海外の掲示板からアクセスがあってビビりました(小心者)
今日はデータ型の話をします。

LispList 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第一部終了です。
次回は条件判断について書こうと思います。


雑記

気付いたら九月になってました。最近はかなり涼しくなって過ごしやすいですが数日後には台風が来るらしいですね。おそロシア
先日成績発表があり前期で無事般教の単位を取り終えたので後期はゼミに行くだけで卒業できそうです。
九月中にLand of Lispと計算機科学入門とEnglish Grammar in Useを読み終えられるよう頑張ろうと思います。