循环向量

Jim*_*ies 12 list-comprehension vector clojure map

我是Clojure的新手并且发现当我使用列表理解在clojure中循环这个向量时,我最后得到了一些nils.

(def myVec [1,2,3])

user=> (for [x myVec] (println x))
(1
2
3
nil nil nil)
Run Code Online (Sandbox Code Playgroud)

我使用相同的东西 map

user=> (map println myVec)
(1
2
3
nil nil nil)
Run Code Online (Sandbox Code Playgroud)

是什么原因导致在这些情况下打印nill?

Joo*_*aat 9

formap创建一个新的延迟序列,原始向量中的每个元素都替换为(println element)的结果,并println返回nil.

您不应该使用formap执行元素的副作用(如打印).使用doseq了点.

  • @ SavanniD'Gerinel你所说的东西含糊不清,但在大多数细节上都是错误的.事情以"错误"的顺序出现,因为序列被分块,而不是因为repl在值之前打印副作用:如果你有一个像un的中性序列(取10(迭代#(inc(doto%println))0)) `,你会看到与打印结果交错的返回值.同样地,如果你的列表大于单个块(比如大小为50),你会获得一堆打印,然后是一堆值,然后是更多的打印...... (4认同)

sku*_*uro 7

那些nil是回归价值println.每次打电话

(println "something")
Run Code Online (Sandbox Code Playgroud)

println函数something在标准输出上打印,然后返回nil.代码中的整体效果是您看到所有println调用的所有副作用(I/O),然后REPL打印来自每次调用的返回值(例如三次nil).