@(delay (delay 1)) ; equals to unrealized delay object, containing 1.
是否有一种简单的(没有使用 测试每个块的先行宏realized?
)方法来递归地取消所有内部延迟?
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)
您可以使用 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}]}
我假设如果有很多嵌套延迟,你想要一个函数从最里面的延迟中检索值?
(defn recursive-deref [delays]
(if (= clojure.lang.Delay (type delays))
(recur @delays)
delays))
#'user/recursive-deref
user> (recursive-deref delays)
1