请在Clojure 2024 状态调查中分享您的想法!

欢迎!请参阅关于页面以了解更多关于如何使用本站的信息。

0
语法和读取器

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

clojure 是否有一种“功能”,当在文件上运行时,如果代码结果没有被使用就会丢弃循环和映射内的代码?
如果真是这样,可能应该给出错误或至少发出警告,表明正在丢弃的代码是无效的。

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代表“打印”——它会为你打印所有结果。执行文件本身不会打印任何内容,除非你使用一些打印函数。

...