首页 > 解决方案 > 在 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不会打印文本?

标签: clojure

解决方案


for不是循环,它是返回惰性序列的序列理解。因此,您的表达式将仅在评估返回的序列时for执行其副作用(调用)。printlnREPL 评估从您的调用返回的值,-main以便打印它们。

您的第一个示例返回一个惰性序列,该序列由 REPL 评估,导致(println 'Tom)调用被评估。由于println返回nil,结果序列包含一个nil值 - 这是(nil)您在输出中看到的。

您的第二个示例创建了相同的序列,但不评估它,而是'Kate从函数返回,然后 REPL 打印出来。

如果你想要一个命令式 for 循环,你应该使用doseq

(defn -main []
  (println 'Jane)
  (doseq [a ['Tom]]
    (println a))
  'Kate)

推荐阅读