Clojure循环表单是如何工作的?

Clojure循环表单是如何工作的?,clojure,Clojure,我对函数式编程都是新手。 我尽了最大努力,理解了循环结构 我可以使用它,我可以查看用它编写的代码并告诉输出,但我不明白的是,它是如何工作的 这是否与编写带参数的匿名函数,然后使用相同的算术数和新值在尾部重复出现相同 它是一个内置的宏还是什么的?实际上,循环不是一个函数或宏。这是一个好主意。它的工作原理类似于let(这也是一种特殊形式),只是它充当recur的目标 区分函数、宏和特殊形式的一种方法是检查它们的参数是如何计算的: 始终计算函数参数,然后将结果传递给函数 在宏扩展为新的未计算形式之前

我对函数式编程都是新手。 我尽了最大努力,理解了循环结构

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

这是否与编写带参数的匿名函数,然后使用相同的算术数和新值在尾部重复出现相同


它是一个内置的宏还是什么的?

实际上,
循环
不是一个函数或宏。这是一个好主意。它的工作原理类似于
let
(这也是一种特殊形式),只是它充当
recur
的目标

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

  • 始终计算函数参数,然后将结果传递给函数
  • 在宏扩展为新的未计算形式之前,不会计算宏参数
  • 特殊形式参数在传递时不进行计算,但特殊形式可以选择或不选择在内部对其进行计算

dbyrne的答案都是正确的,很好,但我想进一步回答你的问题“这是否等同于编写一个带参数的匿名函数,然后使用相同的算术数和新值在尾部重复执行?”。是的,就是这样:

(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))))

那么它的回报是什么呢?与do一样,最后一个表达式?是:
(循环[x1](if(
=>5recur将始终以最近的循环、defn或fn表单为目标?是
defn
只是一个宏,它使用
fn
扩展为一种形式。这是一个信心助推器。我写的所有这些编程问题和算法,我在我的早期编程天,在循环,而在C,C++和java循环的CuljuleWe方法。这确保了我以写的方式理解了这个概念:)我喜欢递归形式,这意味着我现在也可以递归调用匿名方法,我不需要指定名称。在JavaScript或Python中也可以这样做吗?