Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在单独的行clojure中打印列表的每个项目?_Clojure - Fatal编程技术网

如何在单独的行clojure中打印列表的每个项目?

如何在单独的行clojure中打印列表的每个项目?,clojure,Clojure,我在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 谁能告诉我,我该怎么做?谢谢。这种用例(对序列中的每个成员执行一次副作用)就是本

我在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
谁能告诉我,我该怎么做?谢谢。

这种用例(对序列中的每个成员执行一次副作用)就是本文的目的。在这里使用它就像

(doseq [item my-list]
   (println item))

请注意,这不会打印
nil
,但会返回它。在REPL中使用它将看到打印的所有表达式的返回值,但在例如作为终端程序启动项目时不会出现

如果您已经有了一个函数,希望将其应用于单个序列中的每个项目,则可以使用,而不是为了更简洁:

(run! println [1 2 3 4 5])
;; 1
;; 2
;; 3
;; 4
;; 5
;;=> nil

doseq
在您想要执行的操作比仅在单个序列中对项目应用单个函数更复杂时非常有用,但在这里
run工作正常。

另一种策略是从要打印的列表中生成一个字符串,然后只打印该字符串

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

主要区别在于打印的序列是惰性的;比较
(run!println(range))
(println(unlines(range)))
@SamEstep你是对的,它在无限列表中没有那么有用。在构建字符串之前,必须实现惰性序列。但总的来说,将副作用代码限制在边界上并不是一个坏策略。返回字符串的函数比打印到控制台的函数更易于测试。这只是一个具体需要完成什么任务的问题。在这个特殊的例子中,打印五个已经知道的项目,并用换行符分隔,我想说您的
unlines
解决方案更好。但在重复执行操作(可能涉及输入或输出或两者)的更一般情况下,预先计算结果并不总是一种选择。