Clojure-拾取序列元素的非循环方法
还有什么比循环一个序列来遍历一个序列并从中提取每个元素更符合Clojur习惯的方法呢?这是我的意思的循环版本:Clojure-拾取序列元素的非循环方法,clojure,sequence,Clojure,Sequence,还有什么比循环一个序列来遍历一个序列并从中提取每个元素更符合Clojur习惯的方法呢?这是我的意思的循环版本: (def a-seq (list 700 600 500 400 300 200 100)) (loop [s a-seq] (if (seq s) (do (instrument (first s)) (recur (rest s))) "End")) 我将把(第一个s)作为一个频率输入正弦波发生器,如下所示(在泛音库中): 使用dose
(def a-seq (list 700 600 500 400 300 200 100))
(loop [s a-seq]
(if (seq s)
(do (instrument (first s)) (recur (rest s)))
"End"))
我将把(第一个s)
作为一个频率输入正弦波发生器,如下所示(在泛音库中):
使用
doseq
:
(doseq [item a-seq]
(println item))
(println "End")
map
功能就是您想要使用的功能
(map instrument a-seq)
这将按顺序为a-seq
中的每个元素调用一次instrument
函数
请注意,map是惰性的,因此您需要使用map的结果来保证任何副作用的发生,或者调用
doall
我已经编辑了我的问题,实际上打印不是一个大问题,因为我将使用每个元素作为频率doseq
更倾向于产生副作用,对吧?难道“输入正弦波发生器”不符合副作用吗?@AmirTeymuri-在不知道要应用的转换的情况下回答这个问题有点困难。更新后的问题现在只返回字符串“End”doseq
用于应用效果,但似乎您想要生成另一个序列?使用map
和用于。这很好!我做了这个(map#(do(Thread/sleep(+100(rand int 401)))(instrument%))a-seq)
,它就工作了。如果你这样做:(映射仪器a-seq)1)
,那么结果将是1,但可能永远不会调用仪器。在您的示例中,您可能处于打印结果的REPL中,这导致map返回的延迟序列得以实现。
(map instrument a-seq)