2

これは、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)オブジェクトにアクセスします。

メモ化のようなものですが、関数ではなく値に基づいています。

4

1 に答える 1

1

実行の遅延に関しては、遅延が開始点になる可能性があります。これは、最初の間接参照でのみコンストラクターを評価するために使用できます。次のようになります。

(defn some-object-constructor
  []
  (println "Making something!")
  :something)

(def m {:a (delay (some-object-constructor))})

(println "Doing some intermediate work.")

(println (deref (:a m)))
于 2012-12-06T05:28:01.573 に答える