任何人都可以解释导致以下所有nil值的原因吗?
(defn my-for []
(for [n (range 0 40)]
(println n)))
(my-for)
结果(省略一些数值):
(0 1 2 ... 三十 31 nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil 32 33 ... 38 39 nil nil nil nil nil nil nil nil nil)
答案 0 :(得分:5)
这是print语句的输出和打印for表达式结果的混合。
for产生println返回值的序列,它总是nil
user> (defn my-for []
(for [n (range 0 40)]
(println n)))
#'user/my-for
user> (def ansewr (doall (my-for)))
0
1
2
3
...
38
39
#'user/ansewr
user> ansewr
(nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)
这两个是由repl
打印在彼此的顶部答案 1 :(得分:4)
for
是一个列表推导运算符,它的返回值是一个列表。 println
的返回值始终为nil
,这些是for
用于构建其返回的列表的值。由于您是(println n)
,因此您的打印与REPL打印for
的返回值交错。
如果您避免在println
中使用for
,则REPL会显示0到39之间的数字列表:
(defn my-for []
(for [n (range 0 40)] n))
(my-for)
;= (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39)
如果您只想打印值,那么您可以使用doseq
表单,该表单用于副作用函数(例如println
)并始终返回nil
:< / p>
(defn my-doseq []
(doseq [n (range 0 40)]
(println n)))
(my-doseq)