我是 Clojure 和函数式编程的新手。我尽力了,理解循环结构。
我可以使用它,我可以查看用它编写的代码并告诉输出,但我不明白的是,它是如何工作的?
是否与编写带有参数的匿名函数然后以相同的数量和新值保持递归在尾部相同?
它是一个内置的宏还是它的东西?
我是 Clojure 和函数式编程的新手。我尽力了,理解循环结构。
我可以使用它,我可以查看用它编写的代码并告诉输出,但我不明白的是,它是如何工作的?
是否与编写带有参数的匿名函数然后以相同的数量和新值保持递归在尾部相同?
它是一个内置的宏还是它的东西?
实际上,loop
不是函数或宏。它是一种特殊的形式。它的工作原理与let
(也是一种特殊形式)一样,只是它充当recur
.
区分函数、宏和特殊形式的一种方法是检查它们的参数是如何计算的:
dbyrne的回答都是正确的,而且很好,但我想解决您的进一步问题“是否与编写带有参数的匿名函数然后recur
在尾部具有相同的数量和新值一样?”。是的,就是这样:
(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))))