这是由 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 但在值而不是函数..