我在clojure中非常新。我想在换行中打印每个列表项。我试着这样做:
user=> (def my-list '(1 2 3 4 5 ))
;; #'user/my-list
user=> my-list
;; (1 2 3 4 5)
user=> (apply println my-list)
;; 1 2 3 4 5
;; nil
但我希望我的输出必须是:
1
2
3
4
5
nil
谁能告诉我,我怎么能这样做?感谢。
答案 0 :(得分:18)
如果您已经有一个功能想要应用于单个序列中的每个项目,则可以使用run!
而不是doseq
来获得更加简洁:
(run! println [1 2 3 4 5])
;; 1
;; 2
;; 3
;; 4
;; 5
;;=> nil
当您要执行的操作比仅将单个函数应用于单个序列中的项目更复杂时, doseq
非常有用,但此处run!
工作正常。
答案 1 :(得分:13)
这种用例(对序列的每个成员执行一次副作用)是doseq
的目的。在这里使用它就像
>revdf1
HospNum_Id VisitDate EVENT
11 3 04/06/16 nothing
10 3 04/05/16 EMR
8 2 13/04/15 EMR
9 3 03/04/15 RFA
7 2 13/06/14 EMR
3 1 13/05/12 nothing
5 2 13/04/12 EMR
2 1 13/04/05 RFA
1 1 13/02/03 EMR
请注意,这不会打印 (doseq [item my-list]
(println item))
,但会返回。在REPL中使用它将看到打印的所有表达式的返回值,但不会在例如将项目作为终端程序启动。
答案 2 :(得分:2)
另一种策略是从要打印的列表中构建一个字符串,然后只打印字符串。
user> (defn unlines [coll]
(clojure.string/join \newline coll))
#'user/unlines
user> (unlines [1 2 3 4 5])
"1\n2\n3\n4\n5"
user> (println (unlines [1 2 3 4 5]))
1
2
3
4
5
nil