是什么导致这个for循环打印一系列的nil?

时间:2013-06-28 20:50:54

标签: clojure

任何人都可以解释导致以下所有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)

2 个答案:

答案 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)