【问题标题】:how do you implement a delayed object constructor in clojure?如何在 clojure 中实现延迟对象构造函数?
【发布时间】:2012-12-04 06:30:43
【问题描述】:

这是受到 Radul 和 Sussman 的“传播者艺术”论文的启发:

http://web.mit.edu/~axch/www/art.pdf

当他们构建compound progator 时,他们会说:

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

第10页的代码是:

(定义(要构建的复合传播器邻居) (让((完成?#f)(邻居(列出邻居))) (定义(测试) (如果完成了? '行 (如果(什么都没有?(地图内容邻居)) '行 (开始(设置!完成?#t) (建造))))) (传播者邻居测试)))

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


这可能是一个简化版本:

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

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

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

【问题讨论】:

    标签: clojure


    【解决方案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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多