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