Skip to content
syou6162 edited this page Mar 26, 2012 · 18 revisions

懸念点

SICPはschemeで書かれていますが、参加者の大半(というか全員)はclojureを使っています。schemeとclojure、差異がないかと言われればあるので、ハマりそうなところやどうやればいいか分からないところを事前にピックアップしておこうと思います。参考になりそうなリンク等も貼っていきましょう。

無限sequenceを作りたい

問題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とかで頑張るんだろうけど、よく分からんので調べる必要がありそう。

swing関係

図を表示するとか線を書くとか。

代入

3.1節の代入と局所状態など。set!などはclojureにはありません。clojureは基本的にimmutableなものを推奨しているので、何か状態を持つようなものを作りたいときにはatomはrefなどをよく使います。変数と更新したいときには明示的にdo-syncなどをしないと変更できないようになっているのが特徴です。

継続

4.3.3節の継続(schemeだとcall/cc?)。

Clone this wiki locally