當我嘗試向Clojure中的無限延遲序列添加元數據時,出現堆棧溢出,並且如果我取消了元數據,那麼它工作得很好。爲什麼添加with-meta
宏打破懶惰seq?將元數據添加到延遲序列
首先創建一個非常漂亮的數量無限序列:
(defn good [] (lazy-seq (cons 42 (good)))) user> (take 5 (good)) (42 42 42 42 42)
然後,添加一些元數據到每個懶-seq的實例:
(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]
嘗試將元數據了一個級別:
(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獲得進一步的瞭解。 macroexpand-1。 – Svante 2009-06-29 00:26:02