clojure如何在两个seqs的元素上执行一个函数?

vie*_*bel 9 clojure

在Clojure中,在两个seq上并发迭代并在两个运行元素上调用函数的最佳方法是什么?例如:

(def a (range 3))
(def b (range 100 103))
(defn my-func [] ...) ;some custom code
Run Code Online (Sandbox Code Playgroud)

代码应该执行my-func 3次,如下所示:

(my-func 0 100)
(my-func 1 101)
(my-func 2 102)
Run Code Online (Sandbox Code Playgroud)

如何在不定义任何函数或宏的情况下实现这一目标?

Art*_*ldt 16

map 正是你需要的,它需要一个函数和任意数量的seqs,并按你的意愿调用它们.

(def a (range 3))
(def b (range 100 103))
user=> a
(0 1 2)
user=> b
(100 101 102)

user=> (defn my-func [a b] (str a ":" b))
#'user/my-func

user=> (my-func 1 2)
"1:2"

user=> (map my-func a b)
("0:100" "1:101" "2:102")
Run Code Online (Sandbox Code Playgroud)

因为map如果你想要的功能实际上现在运行是懒惰:

(doall (map my-func a b))
Run Code Online (Sandbox Code Playgroud)

  • @YehonathanSharvit:`map`是懒惰的(参见[clojure.org上的页面](http://clojure.org/lazy),或者[sequence](http://clojure.org/sequences)有点太多了) ,所以它不会评估,直到它需要结果(这也是REPL东西散布的原因).它非常方便,但可以在这样的时候绊倒你.试试`(doall(map println'(1 2)'(10 20)))`.`doall`强制评估传递给它的`seq`. (3认同)