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正是我在特定情况下所寻找的。我最初的解决方案是只使用循环和递归,因为for和map没有产生副作用。但是doseq更接近我想要的语法。
+1投票
by

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

REPL中的“P”代表“print”——它会打印出所有的结果。执行文件本身不会打印任何内容,除非你使用了某种打印函数。

...