Clojureの無限レイジーシーケンスにメタデータを追加しようとすると、スタックオーバーフローが発生し、メタデータを取り除くとうまくいきます。 with-meta
マクロを追加すると、遅延セグメントが中断されるのはなぜですか?レイジーシーケンスにメタデータを追加する
まず非常に素晴らしい数の無限の配列を作成:怠惰-seqのインスタンスのそれぞれにいくつかのメタデータを追加し、その後
(defn good [] (lazy-seq (cons 42 (good)))) user> (take 5 (good)) (42 42 42 42 42)
を:
(defn bad [] (lazy-seq (cons 42 (with-meta (bad) {:padding 4})))) user> (take 5 (bad)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException]
は1までのメタデータを移動してみてくださいレベル:
(defn also-bad [] (with-meta (lazy-seq (cons 42 (also-bad))) {:padding 4})) user> (take 5 (foo)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException]
ここでは、有限シーケンスのメタデータの例を示します。
(defn also-works [] (lazy-seq (cons 4 (with-meta () {:a 5})))) user> (also-works) (4) user> (meta (rest (also-works))) {:a 5} user>
lazy-seqとwith-metaの両方がマクロであるため、macroexpand respを使用してさらに詳しい情報を得ることができます。マクロエクセル-1。 – Svante