2

这是由 Radul 和 Sussman 的“传播者的艺术”论文推动的:

http://web.mit.edu/~axch/www/art.pdf

当他们构建 a 时compound progator,他们说:

复合传播器是通过一个程序来实现的,该程序将按需构建传播器的主体。我们注意它只有在某个邻居确实有值时才被构造,并且它只被构造一次

第 10 页的代码是:

(定义(要构建的复合传播器邻居)
  (让((完成?#f)(邻居(列出邻居)))
    (定义(测试)
      (如果完成了?
          '好的
        (如果(什么都没有?(地图内容邻居))
            '好的
          (开始(设置!完成?#t)
                 (建造)))))
    (传播者邻居测试)))

我们如何使用 clojure 的持久数据结构来做到这一点?


这可能是一个简化版本:

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

where(:a m)在第一次调用时构造对象并给出,然后后续调用(:a m)将访问该对象。

它有点像 memoize 但在值而不是函数..

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 回答