2024 Clojure状态调查 中分享你的想法!

欢迎!请参阅 关于页面 获取更多关于如何工作的信息。

0
语法和读取

我打开一个文件,输入 (map prn (range 2)) 并保存文件然后执行 clojure file.clj。
这没有产生任何输出。
然后我执行 clojure 并输入 (map prn (range 2))。
这产生了输出。

是否有某种Clojure的“特性”,当运行文件时,如果结果未被使用则丢弃for和map中的代码?
如果是这样,那么它应该给出错误或至少提供一个警告,说有被丢弃的死代码。

2 答案

+2

最佳答案
 
最佳答案

根据文档 (https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/map),map 返回一个惰性序列,这意味着工作(特别是 prn 的执行)不会在序列被消耗之前完成。正如 Eugene Pakhomov 在另一个回答中指出的,REPL 会消耗序列,但文件中的表单本身并没有。

因为 map 返回惰性序列,所以通常不会依赖 map 进行打印等副作用。doseq 适用于执行副作用。除了时间问题外,通常需要 要么 数据(序列)要么 副作用,因此 doseq 不积累序列很方便。

by
仍然感觉像一个成熟的编程环境应该表现出更明显的行为。比如退出前强制求值所有未求值的代码。或者如果运行代码实际上不会做任何事情,会有一个警告。

不过,doseq 正是我特定情况下需要的东西。我最初的解决方案是仅使用 loop 和 recur,因为 for 和 map 没有产生副作用。但是 doseq 更接近我想要的语法。
+1 点赞
by

给你更好的建议——如果你在这个文件中只输入 1 或其他任何字面量,单独执行它不会产生任何结果。

REPL 中的 P 代表 "print",它会为你打印所有结果。执行文件不会自行打印任何内容,除非你使用一些打印函数。

...