欢迎!请参阅 关于页面 获取更多关于如何工作的信息。
我打开一个文件,输入 (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",它会为你打印所有结果。执行文件不会自行打印任何内容,除非你使用一些打印函数。