【发布时间】:2010-11-06 13:31:59
【问题描述】:
当我尝试将元数据添加到 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} 用户>【问题讨论】:
-
lazy-seq 和 with-meta 都是宏,因此您应该能够通过 macroexpand resp 获得更深入的了解。宏展开-1.
标签: lisp clojure lazy-sequences