任何人都可以解释是什么导致以下所有的零值?
(defn my-for []
(for [n (range 0 40)]
(println n)))
(my-for)
Run Code Online (Sandbox Code Playgroud)
结果(省略一些数值):
(0 1 2 ... 30 31无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无32 33 ... 38 39无无无无零无零无
这是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)
Run Code Online (Sandbox Code Playgroud)
这两个是由repl打印在彼此的顶部
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)
Run Code Online (Sandbox Code Playgroud)
如果您只想打印值,那么您可以使用该doseq
表单,该表单用于副作用函数(例如println
)并始终返回nil
:
(defn my-doseq []
(doseq [n (range 0 40)]
(println n)))
(my-doseq)
Run Code Online (Sandbox Code Playgroud)