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