我正在扭曲我的老java/python头clojure的方式。请帮我理解clojure的懒惰特性。懒惰评价Clojure发生了什么
=> (def myvar (lazy-seq [1 2 (prn "abc")]))
#'user/myvar
以上很容易理解。由于它是一个懒惰的序列,因此不会评估(prn“abc”),因此不会打印任何内容。
=> (def myvar (lazy-seq [1 2 (prn undefined-var)]))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: undefined-var in this context, compiling:(NO_SOURCE_PATH:1)
上面会出现一个错误,你可以看到。为什么?
我的(错误的)理解是,由于它很懒,(prn undefined-var)可能在这里合法,即使“undefined-var”尚未定义。
请任何人指出我的理解到正确的方式。
谢谢帕维尔。它变得更清晰。源代码需要在读者阶段解决以形成表单。该错误仅显示解决过程失败。听起来这与“懒惰”的评估材料无关。而且它也必须是所有lisp方言的通用方法。 –
没错。据我所知,读者几乎是任何列表方言的强制性部分。 –