clojure - 在 for 循环中打印
问题描述
我正在练习一个 Clojure 教程,并且必须确保执行了一个 for 循环,所以我在println
那里放了一个命令,但它没有显示消息。
所以现在我有问题了...
这段代码打印出汤姆的名字:
(ns tutorial.core)
(defn -main []
(println 'Jane)
(for [a ['Tom]]
(println a))
;; 'Kate
)
tutorial.core> (-main)
Jane
Tom
(nil)
tutorial.core>
但这不是:
(ns tutorial.core)
(defn -main []
(println 'Jane)
(for [a ['Tom]]
(println a))
'Kate
)
tutorial.core> (-main)
Jane
Kate
tutorial.core>
为什么?在哪些情况下我们可以期望它println
不会打印文本?
解决方案
for
不是循环,它是返回惰性序列的序列理解。因此,您的表达式将仅在评估返回的序列时for
执行其副作用(调用)。println
REPL 评估从您的调用返回的值,-main
以便打印它们。
您的第一个示例返回一个惰性序列,该序列由 REPL 评估,导致(println 'Tom)
调用被评估。由于println
返回nil
,结果序列包含一个nil
值 - 这是(nil)
您在输出中看到的。
您的第二个示例创建了相同的序列,但不评估它,而是'Kate
从函数返回,然后 REPL 打印出来。
如果你想要一个命令式 for 循环,你应该使用doseq
:
(defn -main []
(println 'Jane)
(doseq [a ['Tom]]
(println a))
'Kate)
推荐阅读
- rust - 当我尝试提交 Rocket Rust 表单时出现错误 422
- ios - 为什么我的 Flutter 应用在 iOS 上启动时会崩溃?
- android - 代码不断崩溃并出现以下错误:无法将 java.lang.String 类型的对象转换为类型
- php - 如何在 PHP 中的数组中搜索字符串?
- excel - Excel:为范围内的最低时间值着色
- arrays - 以不同的方式合并三个哈希数组
- ios - Flutter 应用程序构建失败
- azure - Azure 通知中心 - 从移动应用注册并通过应用后端发送通知
- python - 为什么 df.columns 是一个空列表,而如果我打印出数据框,我可以看到列名?蟒蛇熊猫
- python - 从容器内的 Python 脚本读取 Docker 容器外的 HDF 文件