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」となる。
(本に掲載されている図とは違います)
(追記)
この図で最後にnilを書いてしまったが、必ずしもnilでなくても良いようだ。
そして、nilでない場合にコンスセルの表現になるようだ。
スロット
コンスセルを構成する2つの箱?それぞれのことリストを扱う関数
リスト
二つの要素をつなげるセルがただただ長く連なったもの
cons
二つのデータを結びつけ、コンスセルを返すこれを繰り返し使うとリストになる
例.
(cons 'chicken 'cat) (chicken . cat)
真ん中の「.」は何か?これがコンスセルであることを示すらしい。
リストとは違うらしい。でも、結局リストと同じらしい??
つまり、リスト(pork beef chicken)のコンス表現が(pork . (beef . (chicken . ())))らしい。
でも、そもそもシンボルのリストってどんな時に役に立つのだろう?
読み進めるとわかるかな?
car
最初のスロットにあるデータを取り出す例.
(car '(pork beef chicken)) pork
因みに例の「'」をつけずに試すと
と表示されます。これがシンボルとして評価されていないということですかね。
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章はここまで