我是Clojure和功能编程的新手。 我尽我所能,理解循环结构。
我可以使用它,我可以查看用它编写的代码并告诉输出但我不明白的是,它是如何工作的?
是否与使用参数编写匿名函数然后使用相同的arity和new值保持重复?
它是一个内置的宏还是它的东西?
答案 0 :(得分:7)
实际上,loop
不是函数或宏。这是一个special form。它就像let
(也是一种特殊形式)一样工作,但它充当recur
的目标。
区分函数,宏和特殊形式的一种方法是检查其参数的评估方式:
答案 1 :(得分:5)
dbyrne 的答案都是真的,很好,但是我想解决你的进一步问题“它是否与编写带参数的匿名函数然后recur
相同在尾部有相同的arity和新的值?“是的,它完全是这样的:
(loop [x 1, y 2]
(if (whatever x y)
(recur (inc x) (dec y))
(* x y)))
在功能上与
相同((fn [x y]
(if (whatever x y)
(recur (inc x) (dec y))
(* x y)))
1 2)
如果loop
不存在,您可以将其编写为发出此类形式的简单宏,但编译器具有更快的特殊loop
形式。
(defmacro loop [bindings & body]
(let [bindings (partition 2 bindings)]
`((fn [~@(map first bindings)]
(do ~@body))
~@(map second bindings))))