-
Notifications
You must be signed in to change notification settings - Fork 0
SICPはschemeで書かれていますが、参加者の大半(というか全員)はclojureを使っています。schemeとclojure、差異がないかと言われればあるので、ハマりそうなところやどうやればいいか分からないところを事前にピックアップしておこうと思います。参考になりそうなリンク等も貼っていきましょう。
問題1.21のようにどこで終わればよいか具体的に分からない、というときに無限sequenceが扱えると便利です。実際に無限のsequenceを作りたいというより、(take n lis)
というような形で使うことが多いです。例えば以下の例は無限の正数列を作って、最初から5つ取ってくる例です。
(defn inc-two [x] (+ x 2))
(take 5 (iterate inc-two 1)) ; (1 3 5 7 9)
1.3.2節など。schemeだとlambda
ですが、clojureだと(fn [x] (+ x 1))
とか#(+ % 1)
のような形で無名関数を作ることができます。関数内関数(SICPだとdefine
の中でdefine
で関数定義)をclojureでする場合letfn
というのを使うことがあります。
1.2.1節など。dotraceの使い方に書いてみました。
2.2.4節の図形言語。swingとかで頑張るんだろうけど、よく分からんので調べる必要がありそう。
-
pic_lang.clj at master from harishtella/SICP-Picture-Language - GitHub
-
src/sicp/picture_language.clj at master from globulon/sicp-in-clojure - GitHub
-
src/sicp/picture_language_geometry.clj at master from globulon/sicp-in-clojure - GitHub
3.1節の代入と局所状態など。set!
などはclojureにはありません。clojureは基本的にimmutableなものを推奨しているので、何か状態を持つようなものを作りたいときにはatomはrefなどをよく使います。変数と更新したいときには明示的にdo-sync
などをしないと変更できないようになっているのが特徴です。
4.3.3節の継続(schemeだとcall/cc
?)。
- Clojureのモナド - einblickerの日記
- Contモナドというところが近そう?
- Clojureでの継続の簡単な例 — Gist