@(delay (delay 1)) ; equals to unrealized delay object, containing 1.
是否有一个简单的(没有头部优先的宏,用realized?
测试每个块)方式递归地解除所有内部延迟?
答案 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}]}