これは、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)オブジェクトにアクセスします。
メモ化のようなものですが、関数ではなく値に基づいています。