0

関数の遅延シーケンスを強制的に評価する方法を知りたいです。

たとえば、整数 1 を返す関数があるとします。

test.core=> (fn [] 1)
#<core$eval2480$fn__2481 test.core$eval2480$fn__2481@4163c61>
test.core=> ((fn [] 1))
1

そして、これらの関数の遅延シーケンスを構築します。

test.core=> (repeat 5 (fn [] 1))
(#<core$eval2488$fn__2489 test.core$eval2488$fn__2489@76fd6301> ...)

test.core=> (class (repeat 5 '(fn [] 1)))
clojure.lang.LazySeq

シーケンス内の関数を実際に実行するにはどうすればよいですか?

test.core=> (take 1 (repeat 5 (fn [] 1)))
(#<core$eval2492$fn__2493 test.core$eval2492$fn__2493@46e1e0c8>)

test.core=> (take 1 (repeat 5 '(fn [] 1)))
((fn [] 1))

test.core=> ((take 1 (repeat 5 '(fn [] 1))))

ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.IFn

私はDoall を提案した How to convert lazy sequence to non-lazy in Clojureを読みました...しかし、結果がどこに行くのかわかりませんか? [1 1 1 1 1] または同様のものを期待しています。

test.core=> (doall (repeat 5 (fn [] 1)))
(#<core$eval2500$fn__2501 test.core$eval2500$fn__2501@14e3c50c>...)

test.core=> (realized? (doall (repeat 5 (fn [] 1))))
true
4

1 に答える 1

3

あなたの問題は、評価されていない一連の関数を返していることです。次のように評価できます。

=> (map #(%) (repeat 5 (fn [] 1)))
(1 1 1 1 1)

mapとはどちらrepeatも遅延ですが、REPL またはその他の消費者は、少なくとも必要なだけの遅延シーケンスの評価を強制します。

于 2014-02-20T18:19:16.673 に答える