欢迎!请参阅关于页面以了解更多关于如何使用本站的信息。
我打开一个文件,键入(map prn (range 2)),然后保存文件并执行 clojure file.clj。这没有输出。然后我执行 clojure 并键入 (map prn (range 2))。这产生了输出。
clojure 是否有一种“功能”,当在文件上运行时,如果代码结果没有被使用就会丢弃循环和映射内的代码?如果真是这样,可能应该给出错误或至少发出警告,表明正在丢弃的代码是无效的。
根据文档(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代表“打印”——它会为你打印所有结果。执行文件本身不会打印任何内容,除非你使用一些打印函数。