@(delay (delay 1)) ; equals to unrealized delay object, containing 1.
すべての内部遅延を再帰的に逆参照する簡単な(各ブロックをテストするヘッドファーストマクロスなしでrealized?
)方法はありますか?
アーサーのコードは確かにあなたが投稿した例で機能しますが、混合シーケンスを処理する方法の例を次に示します。
(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)
ネストされた遅延が多数ある場合、最も内側の遅延から値を取得する関数が必要だと思いますか?
(defn recursive-deref [delays]
(if (= clojure.lang.Delay (type delays))
(recur @delays)
delays))
#'user/recursive-deref
user> (recursive-deref delays)
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}]}