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

是否有一种简单的(没有使用 测试每个块的先行宏realized?方法来递归地取消所有内部延迟?

4

3 回答 3

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)
于 2012-12-07T23:09:10.867 回答
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}]}
于 2012-12-08T03:24:38.113 回答
1

我假设如果有很多嵌套延迟,你想要一个函数从最里面的延迟中检索值?

(defn recursive-deref [delays] 
  (if (= clojure.lang.Delay (type delays)) 
    (recur @delays) 
    delays))
#'user/recursive-deref
user> (recursive-deref delays)
1
于 2012-12-07T21:46:33.000 回答