当我尝试将元数据添加到 Clojure 中的无限惰性序列时,我得到了堆栈溢出,如果我删除元数据,那么它就可以正常工作。为什么添加with-meta
宏会破坏惰性序列?
首先创建一个非常好的数字的无限序列:
(定义好 [] (惰性序列 (缺点 42 (好的)))) 用户>(取5(好)) (42 42 42 42 42)
然后,为每个惰性序列实例添加一些元数据:
(定义不好 [] (惰性序列 (缺点 42 (带元 (坏的) {:padding 4})))) 用户>(取5(坏)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [抛出类 clojure.lang.Compiler$CompilerException]
尝试将元数据上移一级:
(定义也不好 [] (带元 (惰性序列 (缺点 42 (也很糟糕))) {:填充 4})) 用户>(取 5 (foo)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [抛出类 clojure.lang.Compiler$CompilerException]
以下是有限序列上的元数据示例:
(定义也有效 [] (惰性序列 (缺点 4 (带元 () {:a 5})))) 用户>(也有效) (4) user> (meta (rest (also-works))) {:a 5} 用户>