簡體   English   中英

Clojure循環形式如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM