Land Of Lisp 第3章

3章はLispの構成についての説明

シンタックス

 文を構成する基本的規則
 Lispは括弧を使ってコードをリストにする。


セマンティック

 文の意味


[Lispの構成要素]

シンボル

 最も基本的なデータ型
 アルファベット、数字、+-/*=<>?!_が使用可能
Common Lispは大小の区別はないというが、xyzzyでは

(eq 'fooo 'FoOo)
nil

と区別があるようだ。
シンボルとは、変数名や関数名を指しているのだろうか?
これは何を比較しているのか今のところ理解できない。
(因みに、多くのLisperは大文字を使わないらしい)


数値

 浮動小数点、整数
    

expt

 冪乗
例.53の53乗

(expt 53 53)
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373

例.分数(約分までしてくれる)

(/ 4 6)
2/3

ただし、小数を含む計算は結果も小数となる。


文字列

 ダブルクオートで囲む
 エスケープ文字も使用可能だが、種類は"と¥のみ

princ

 文字列を表示
例.

(princ "Tutti Frutti")
Tutti Frutti
"Tutti Frutti"

最初の「Tutti Frutti」はprincの結果、2つ目はREPLが入力された式の結果を返したもの


コードモード

 REPLの標準モード
 入力された文字列をコマンドとして解釈し実行

フォーム

 コードモードの入力が満たすべき構造
 最初の要素が特別のコマンドになっているリスト、残りの要素はすべて引数
例.ネストしたフォーム

(expt 2 (+ 3 4))
128


データモード

 入力された文字列を実行しないモード
 先頭に「'」をつけてあらわす。シンボルの例参照


リスト

 Lispコードの構成方法
 例えば、関数と引数を括弧で括った構造


コンスセル

 リストをつなぎ合わせる構造
 ポインタが2つくっ付いたイメージ
 例えば、リスト'(1 2 3)は「1」、「2」、「3」という値がメモリ上にあり
 コンスセル①の1つ目のポインタが「1」を指し、2つ目のポインタが、
 「2」を指すコンスセル②を指す。
 そして、コンスセル②の2つ目のポインタが「3」を指すコンスセル③を指す。
 コンスセル③の2つ目のポインタはどこもささず終端「nil」となる。
f:id:h0sw:20160124121907p:plain
(本に掲載されている図とは違います)
(追記)
この図で最後にnilを書いてしまったが、必ずしもnilでなくても良いようだ。
そして、nilでない場合にコンスセルの表現になるようだ。

スロット

 コンスセルを構成する2つの箱?それぞれのこと

リストを扱う関数

リスト
 二つの要素をつなげるセルがただただ長く連なったもの

cons

 二つのデータを結びつけ、コンスセルを返す
 これを繰り返し使うとリストになる
例.

(cons 'chicken 'cat)
(chicken . cat)

真ん中の「.」は何か?これがコンスセルであることを示すらしい。
リストとは違うらしい。でも、結局リストと同じらしい??
つまり、リスト(pork beef chicken)のコンス表現が(pork . (beef . (chicken . ())))らしい。
でも、そもそもシンボルのリストってどんな時に役に立つのだろう?
読み進めるとわかるかな?

car

  最初のスロットにあるデータを取り出す
例.

(car '(pork beef chicken))
pork

因みに例の「'」をつけずに試すと
f:id:h0sw:20160130141158p:plain
と表示されます。これがシンボルとして評価されていないということですかね。

cdr

 2番目のスロットの値を取り出す。
例.

(cdr '(pork beef chicken))
(beef chicken)

cadr

 carとcdrの合成
例.

(cadr '(pork beef chicken))
beef
;これは
(car (cdr '(pork beef chicken)))
beef
;おまけ
(cddr '(pork beef chicken))
(chicken)

list

 リストを作る(コンスセルを1つずつ作る処理をまとめたもの)
例.

(list 'poke 'beef 'chicken)
(poke beef chicken)

car、cdrを組み合わせたcdar、cddr、caddr、cddar、cadadrがあるらしい。
僕の覚え方は「r」の前の文字を右から「d」「a」を適用していく。
例えば、cadadrなら、あるリストに対して「d」(cdr)を適用し、その結果に「a」(car)を適用し...

(cadadr '(a (b (c d)) e))
(c d)
(car (cdr (car (cdr '(a (b (c d)) e)))))
(c d)

3章はここまで