Lispの神 (< S式を評価する(計算する)と、S式が生み出される)

Clojure を始めて、いろいろ混乱していたので、
CommonLispを始めて、OnLispを読んでいるとさらに混乱してきた。


そこで、もっと入門書がないかと思い、いろいろ調べたところ、
Lispの神様のテキストがあったので購入。


初めての人のためのLISP[増補改訂版]

初めての人のためのLISP[増補改訂版]


50ページくらいまで読んだ。
ここまでで、クオート、アンクオートで 混乱している 自分に非常に救われる内容だった。
神様は万人に慈悲深い
CommonLisp の基本的なところをまとめてみる。


〇 S式のルール
・S式はS式を返す
・S式は アトム、nil、リスト で構成されている。
(それぞれ p45, p39 参照)
・評価したくない場合は、クオートする。
(p42)


〇 そのまま返すルール
・ アトムの一部: デフォルトで同じものを返すS式 : t, nil, 数字, 文字列 ...
・ リスト・アトム: リストも,アトムも、記述したままのS式で返したい場合は、クオートする。


=> そのまま返すアトムは、所謂、リテラルのことだろう。 同じアトムを返す S式だという感じだと思う。


〇 別のS式を返すルール
・リスト: リストを「題名付きの並び」と見て、引数を評価した(S式を得た)後に、
・(アトムの一つの)シンボル: 辞書(名前空間)を参考にして、アトムから、別のS式 を返す。シンボルというのは、アトムの中でもリテラルでなく変数のようなもの。


〇 consセル、car、cdr に関するコツ
S式の探索
・car, cdr のイメージは、括弧をずらすイメージがよい (p25参照)
・car が アトムを返して、cdr がリストを返す理由は、car がリスト返してたらいつまでたっても、アトムにたどり着かない(p23) マッカーシー天才!
nil に対しては car も cdr も nil。 ただし、nil に対するcar はエラーになると考えた方がよい (p87)
・アトムに対しては、car も cdr もエラーになる。
(Clojureではfirst, rest)


リストの作成
・(cons atom-or-list list ) という形式。 これは、car や cdrの逆関数なので、第二引数がlistになるとのこと。
・(list S-expression ....) という形式。 list関数を使う。


空白リスト、()、nilの確認
・CommonLispではnull、 Clojureではnil?


アトムの確認
atom を使う。 nil or () に対しても、atom は t となる。


Lispの変数定義、関数定義
・変数(シンボル)へのS式の代入(束縛)は、set を使う。 setq は第一引数を自動で quote するので、' が不要。 setfでもOK。第二引数はS式
Clojureのdef は setq みたいなものだね。
・関数定義は、defun を用いる。 第一引数も第二引数も評価されない。第二引数にはS式
Clojureでは、defn を用いる。
body のところには、実は、アトムでもリストでもOK。 さらに複数のS式も許容されている。


〇 条件式 cond
・(cond ( condition S-expression... ) ( condition S-expression... ) ...)
この書き方はマッカーシーの気まぐれらしい。一方、Clojureのことも本書で予言されていて
・(cond condition S-expression condition S-expression ...)
という書き方のLispがあってもよいだろうと。 これってClojureじゃん。 この欠点は、一つの条件にS式が一つしか書けないということ。まぁ普通これで十分なわけだが。
・condition にくるような関数は、例えば偶数かしらべる場合は、evenp 関数などというように、名前の最後に p をつける。 Rubyの?のようなもの。
Clojureには、:else があるが、 CommonLispでは普通、最後のcondtion を t として必ずマッチするようにするよう。


〇 条件 if
・ (if condition-S-expr t-S-expr nil-S-expr )
これはCommonLispもClojureも同じ


再帰のコツ
直列で
*1
 => 123 というS式
(list 11 23 'hatena )
 => (11 23 hatena) というS式
を返す。

*1:null cdr(x) ) car x ) ;; ← 最後の要素を得るとき、condの引数として慣用句的 (p79のlast-elemの課題) ・((null x) 0 );; ← (lengthなどで最後の要素は不要の時) 二分木で再帰する場合、次のように場合分けする。 ・ (null) ;; ← 各枝の最後部分 ・ (atom) ;; ← 葉っぱ ・ (t ) ;; ← その他。この場合、ツリーの node 部分 にあたる。 〇 クイズ (car '(123 234 566