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

dro*_*oon 5 clojure

任何人都可以解释是什么导致以下所有的零值?

(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无无无无零无零无

Art*_*ldt 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)  
Run Code Online (Sandbox Code Playgroud)

这两个是由repl打印在彼此的顶部


jua*_*rro 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)
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)