日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

On Lisp

On Lisp -> Clojure へ移植: 12.1~12.3

ここでも一応書いておくが、前の 11 章はベースになる setf に該当するものが Clojure には見当たらないので章全体を飛ばしている。 また、この章のサンプル移植は most-of しかなく、殆ど無いも同然なので ここも飛ばしてもらっても構わない。 12.1 新しい…

On Lisp -> Clojure へ移植: 10.4~10.6

10.4 反復 p96 (defmacro forever [& body] `(loop [] ~@body (recur))) 図 53 単純な反復用マクロ.while, for は既出なので till のみ。 Clojure の loop には go や return はないが、条件分岐と recur を組み合わせたら マクロ定義時だけは同様の事が可…

On Lisp -> Clojure へ移植: 10.1~10.3

この辺りから段々と変態じみてくるw 10.1 コンテキストの生成 p90 図 47 let のマクロによる実装。 binds の奇数 index はローカル変数のシンボルなので、それを関数の仮引数として渡し、body を実行。 で、binds の偶数 index を関数の実引数として後半部で…

On Lisp -> Clojure へ移植: 9.1~9.4

9.1 評価の回数 p84 On Lisp で言う複数回の評価を起こし得るマクロが Clojure 版にあるかどうか 良く分からん。形式的に近いのとなると for-b なんだが、 (defmacro for-b [[sym start stop] & body] `(loop [~sym ~start] (when (<= ~sym ~stop) ~@body (r…

On Lisp -> Clojure へ移植: 8.1~8.9

8.1 マクロ引数の捕捉 p75 ここで挙げられている for はリスト内包表記な Clojure の for でなく、 命令プログラミング的な for をマクロ実装してみたもの。 Clojure でサンプルを素直に読み替えて定義してみた場合だと実際は使えない。 (defmacro for-a [[s…

On Lisp -> Clojure へ移植: 6.9~6.11

6.9 マクロへの依存 p66 Clojure も事情は同じと考えていいのかな。 (defmacro mac [x] `(inc ~x)) ;=> #'user/mac (def f (fn [y] (mac y))) ;=> #'user/f (defmacro mac [x] `(+ ~x 100)) ;=> #'user/mac (f 1) ;=> 2 6.10 関数からマクロへ p67 ここでは …

On Lisp -> Clojure へ移植: 6.4~6.8

6.4 マクロ展開の確認 p60 図 33 マクロ展開確認用のマクロ (defmacro mac [expr] `(clojure.pprint/pprint (macroexpand-1 '~expr))) cider なら C-c C-m すればいいんだが一応。 6.5 引数リストの構造化代入 p61 最初サンプルほぼそのまま書いてみたのだが…

On Lisp -> Clojure へ移植: 6.1~6.3

6 マクロ 6.1 マクロはどのように動作するか p54 (defmacro nil! [x] (list 'def x nil)) 6.2 逆クォート そのままバッククォートと言われたりもする。 一応補足すると、Common Lisp でのバッククォート中のカンマは Clojure では ~ に相当する。 同様に Com…

On Lisp -> Clojure へ移植: まえおきと目次

まえおきのまえおき ここは On Lisp -> Clojure へ移植記事シリーズのエントリポイントとして書いてます。 なので目次は中身が更新され次第合わせて更新します。 意思表明的な意味を込めてまえおきも置いてますがんなもんどうでもいいよと言う人は まえおき…