Lispの神 (< S式を評価する(計算する)と、S式が生み出される)
Clojure を始めて、いろいろ混乱していたので、
CommonLispを始めて、OnLispを読んでいるとさらに混乱してきた。
そこで、もっと入門書がないかと思い、いろいろ調べたところ、
Lispの神様のテキストがあったので購入。
- 作者: 竹内郁雄
- 出版社/メーカー: 翔泳社
- 発売日: 2010/03/10
- メディア: 単行本
- 購入: 31人 クリック: 565回
- この商品を含むブログ (49件) を見る
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式
を返す。