5

谁能解释导致以下所有 nil 值的原因?

(defn my-for []
   (for [n (range 0 40)]
     (println n)))
(my-for)

结果(省略一些数值):

(0 1 2 ... 30 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 32 33 ... 38 39 nil nil nil无 无 无 无 无 无)

4

2 回答 2

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 将这两个打印在彼此之上

于 2013-06-28T20:56:31.347 回答
4

for是一个列表推导运算符,它的返回值是一个列表。的返回值printlnalways nil,这些是for用于构建它返回的列表的值。既然你是(println n),你的打印与 REPL 的返回值的打印交错for

如果您避免在 中使用printlnforREPL 将显示从 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

(defn my-doseq []
   (doseq [n (range 0 40)] 
     (println n)))
(my-doseq)
于 2013-06-28T20:57:46.883 回答