3

我是 Clojure 和函数式编程的新手。我尽力了,理解循环结构。

我可以使用它,我可以查看用它编写的代码并告诉输出,但我不明白的是,它是如何工作的?

是否与编写带有参数的匿名函数然后以相同的数量和新值保持递归在尾部相同?

它是一个内置的宏还是它的东西?

4

2 回答 2

7

实际上,loop不是函数或宏。它是一种特殊的形式。它的工作原理与let(也是一种特殊形式)一样,只是它充当recur.

区分函数、宏和特殊形式的一种方法是检查它们的参数是如何计算的:

  • 始终评估函数参数,然后将结果传递给函数。
  • 在宏扩展为新的未评估形式之前,不会评估宏参数。
  • 特殊形式的参数在传递时不会被评估,但特殊形式可能会或可能不会选择在内部评估它们。
于 2013-04-08T18:41:47.297 回答
5

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))))
于 2013-04-08T23:27:18.387 回答