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 不积累序列是很方便的。

仍然感觉一个成熟的编程环境应该展现出更明显的行为。比如在退出前强制评估所有未评估的代码。或者在代码执行实际上不会做出任何事情时发出警告。

尽管如此,doseq 正是我在我特定的情况中寻找的东西。我的原始解决方案是只是使用 loop 和 recur,因为 for 和 map 不产生副作用。但 doseq 更接近我想要的语法。
+1 投票

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

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

...