欢迎!请查看关于页面以获取更多信息。
我打开一个文件,键入(map prn (range 2))然后保存文件并执行clojure file.clj。这没有产生输出。然后我执行clojure并键入(map prn (range 2))。这产生了输出。
clojure是否有某种“特性”,在运行文件时丢弃未使用的for和map代码?如果是这样,它似乎应该提供一个错误或至少一个警告,说明它在丢弃死代码。
根据文档(https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/map),map返回一个惰性序列,这意味着工作未完成(特别是prn未发生),直到序列被消耗。正如Eugene Pakhomov在另一个答案中指出的那样,REPL消耗了序列,但文件中的形式本身并没有。
因为map会返回一个惰性序列,所以通常不应该依赖map来实现打印之类的副作用。doseq更适合执行副作用。除了时间问题之外,通常您需要要么数据(序列)要么副作用,因此doseq不累积序列是很方便的。
我给你一个更好的例子——如果你只在这个文件中输入1或其他任何文字,单独执行它不会产生任何结果。
1
REPL中的“P”代表“print”——它会打印出所有的结果。执行文件本身不会打印任何内容,除非你使用了某种打印函数。