[英]How does Clojure loop form works?
我是Clojure和功能編程的新手。 我盡我所能,理解循環結構。
我可以使用它,我可以查看用它編寫的代碼並告訴輸出但我不明白的是,它是如何工作的?
是否與使用參數編寫匿名函數然后使用相同的arity和new值保持重復?
它是一個內置的宏還是它的東西?
實際上, loop
不是函數或宏。 這是一種特殊的形式 。 它的工作原理就像let
(它也是一種特殊的形式),除了它作為recur
的目標。
區分函數,宏和特殊形式的一種方法是檢查其參數的計算方式:
dbyrne的答案都是正確的,而且很好,但是我想解決你的另一個問題“它是否與用參數編寫一個匿名函數然后在尾部recur
相同的arity和new值?”。 是的,它完全是這樣的:
(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))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.