これは、RadulとSussmanによる「プロパゲーターの芸術」の論文によって動機付けられています。
http://web.mit.edu/~axch/www/art.pdf
彼らが構築しているときcompound progator
、彼らは言います:
複合プロパゲーターは、必要に応じてプロパゲーターの本体を構築する手順で実装されます。ある隣人が実際に価値を持っている場合にのみ構築され、一度だけ構築されるように注意します
10ページのコードは次のとおりです。
(define(compound-propagator neighbors to-build) (let((done?#f)(neighbors(listify neighbors))) (定義(テスト) (完了した場合? 'わかった (if(every none?(map content neighbors)) 'わかった (開始(設定!完了?#t) (構築する)))))) (プロパゲーターネイバーテスト)))
clojureの永続データ構造を使用してこれを行うにはどうすればよいですか?
これの簡略化されたバージョンは多分:
(def m {:a (delayed (some-object-constructor))})
ここ(:a m)
で、最初の呼び出しでオブジェクトを作成し、その後の呼び出しで(:a m)
オブジェクトにアクセスします。
メモ化のようなものですが、関数ではなく値に基づいています。