嵌套的延迟解除引用

时间:2012-12-07 20:00:43

标签: clojure delay

@(delay (delay 1)) ; equals to unrealized delay object, containing 1.

是否有一个简单的(没有头部优先的宏,用realized?测试每个块)方式递归地解除所有内部延迟?

3 个答案:

答案 0 :(得分:3)

Arthur的代码当然适用于您发布的示例,但这里有一个如何处理混合序列的示例:

(defn deref-delays [x]
  (cond
    (sequential? x) (map deref-delays x)
    (= clojure.lang.Delay (class x)) (recur @x)
    :else x))

(deref-delays [1 2 (delay 3) (delay [4 (delay (delay 5)) 6]) 7])
;(1 2 3 (4 5 6) 7)

答案 1 :(得分:1)

我假设如果有许多嵌套延迟,你想要一个函数从内部延迟中检索值吗?

(defn recursive-deref [delays] 
  (if (= clojure.lang.Delay (type delays)) 
    (recur @delays) 
    delays))
#'user/recursive-deref
user> (recursive-deref delays)
1

答案 2 :(得分:1)

您可以使用clojure.walk执行此操作并保留结构。

(defn deref-walk [x] 
  (clojure.walk/prewalk 
    (fn [e] 
      (if (delay? e) 
        (deref-walk (deref e)) 
        e)) 
    x))

然后

(deref-walk (delay {:a 1 :b (delay [1 2 (delay 3) (delay {:c 4})])}))

结果

{:a 1 :b [1 2 3 {:c 4}]}