Clojure序列理解中是否存在变量?

All*_*ate 4 list-comprehension clojure for-comprehension

我正在阅读Programming Clojure第2版,在第49页上它涵盖了Clojure的for循环结构,它说它实际上是一个序列理解.

作者建议使用以下代码:

(defn indexed [coll] (map-indexed vector coll))

(defn index-filter [pred col]
  (when pred
    (for [[idx elt] (indexed col) :when (pred elt)] idx)))

(index-filter #{\a} "aba")
(0 2)
Run Code Online (Sandbox Code Playgroud)

...优于基于Java的命令式示例,并且给出的证据是"通过使用高阶函数......任何函数索引都避免了对变量的所有需求".

什么是"idx","elt",如果它们不是变量?它们是指除累加器之外的变量吗?

另外,为什么#{\ a}而不是"a"?

Joh*_*hnJ 5

pred是一个函数 - #{\a}是一个包含字符a的集合.在Clojure中,set是一个函数,如果它的参数\a包含它,则返回true .你也可以使用#(= % \a)(fn [x] (= \a x)).

正如另一个答案所暗示的那样,"在制作这个例子时没有创造任何国家." idx并且elt函数类似于变量,但是只对for序列理解是局部的,所以代码更紧凑,不是有状态的,并且可以说更清晰(一旦你用来排序理解,至少:-)) - 也许文本不是在这一点上最佳清晰.