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

すべての内部遅延を再帰的に逆参照する簡単な(各ブロックをテストするヘッドファーストマクロスなしでrealized?)方法はありますか?

4

3 に答える 3

3

アーサーのコードは確かにあなたが投稿した例で機能しますが、混合シーケンスを処理する方法の例を次に示します。

(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

ネストされた遅延が多数ある場合、最も内側の遅延から値を取得する関数が必要だと思いますか?

(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 に答える
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 に答える