Clojure循环表单是如何工作的?
我对函数式编程都是新手。 我尽了最大努力,理解了循环结构 我可以使用它,我可以查看用它编写的代码并告诉输出,但我不明白的是,它是如何工作的 这是否与编写带参数的匿名函数,然后使用相同的算术数和新值在尾部重复出现相同Clojure循环表单是如何工作的?,clojure,Clojure,我对函数式编程都是新手。 我尽了最大努力,理解了循环结构 我可以使用它,我可以查看用它编写的代码并告诉输出,但我不明白的是,它是如何工作的 这是否与编写带参数的匿名函数,然后使用相同的算术数和新值在尾部重复出现相同 它是一个内置的宏还是什么的?实际上,循环不是一个函数或宏。这是一个好主意。它的工作原理类似于let(这也是一种特殊形式),只是它充当recur的目标 区分函数、宏和特殊形式的一种方法是检查它们的参数是如何计算的: 始终计算函数参数,然后将结果传递给函数 在宏扩展为新的未计算形式之前
它是一个内置的宏还是什么的?实际上,
循环
不是一个函数或宏。这是一个好主意。它的工作原理类似于let
(这也是一种特殊形式),只是它充当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))))
那么它的回报是什么呢?与do一样,最后一个表达式?是:
(循环[x1](if(
=>5recur将始终以最近的循环、defn或fn表单为目标?是defn
只是一个宏,它使用fn
扩展为一种形式。这是一个信心助推器。我写的所有这些编程问题和算法,我在我的早期编程天,在循环,而在C,C++和java循环的CuljuleWe方法。这确保了我以写的方式理解了这个概念:)我喜欢递归形式,这意味着我现在也可以递归调用匿名方法,我不需要指定名称。在JavaScript或Python中也可以这样做吗?