如何在clojure中实现延迟对象构造函数?

时间:2012-12-04 06:30:43

标签: clojure

这是由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)))
    (define (test)
      (if done?
          ’ok
        (if (every nothing? (map content neighbors))
            ’ok
          (begin (set! done? #t)
                 (to-build)))))
    (propagator neighbors test)))

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


这个的简化版本可能是:

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

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

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

1 个答案:

答案 0 :(得分:1)

至于延迟执行,delay可能是一个开始的地方。它可以用于仅在第一个取消引用时评估构造函数。它可能看起来像这样:

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

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

(println "Doing some intermediate work.")

(println (deref (:a m)))