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

如何在clojure中实现延迟对象构造函数?,clojure,Clojure,这是由Radul和Sussman撰写的《传播者的艺术》论文推动的: 当他们正在构建一个复合程序时,他们会说: 复合传播器是通过一个过程实现的,该过程将根据需要构造传播器的主体。我们要注意的是,只有当某个邻居确实有一个值时,才会构造它,并且只构造一次 第10页上的代码是: (define (compound-propagator neighbors to-build) (let ((done? #f) (neighbors (listify neighbors))) (define

这是由Radul和Sussman撰写的《传播者的艺术》论文推动的:

当他们正在构建一个
复合程序时,他们会说:

复合传播器是通过一个过程实现的,该过程将根据需要构造传播器的主体。我们要注意的是,只有当某个邻居确实有一个值时,才会构造它,并且只构造一次

第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))) 其中,
(:am)
在第一次调用时构造对象并给出 然后对
(:am)
的后续调用将访问该对象


它有点像memoize,但基于值而不是函数。

就延迟执行而言,可能是一个开始。它只能用于在第一次取消引用时计算构造函数。它可能看起来像这样:

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

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

(println "Doing some intermediate work.")

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

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

(println "Doing some intermediate work.")

(println (deref (:a m)))