當定義一個默認參數時,我有一對Clojure宏的問題。當一個宏調用另一個宏時Clojure宏和默認參數
在下列情況下使用2個宏,其中MM02調用MM01:
(defmacro mm01
[ & [ { :keys [ f1 ] :or { f1 long } :as opts } ]]
`(let []
(println "(2) ~f1" ~f1)))
(defmacro mm02
[ & [ { :keys [ f1 ] :as opts } ]]
`(let []
(println "(1) ~f1" ~f1)
(mm01 [email protected])))
的評價:
(mm02 { :f1 byte })
打印出:
(1) ~f1 #function[clojure.core/byte]
(2) ~f1 #function[clojure.core/long]
不過,我想有預計:
(1) ~f1 #function[clojure.core/byte]
(2) ~f1 #function[clojure.core/byte]
我做錯了什麼或者我錯過了什麼嗎?
順便說一下的評價:
(mm01 { :f1 byte })
打印出:
(2) ~f1 #function[clojure.core/byte]
非常感謝你。
非常明確的解釋和有用的意見,謝謝!我發現可選參數可能會導致一些模糊的錯誤。我認爲Stuart Sierra在[https://stuartsierra.com/2015/06/01/clojure-donts-optional-arguments-with-varargs]中評論了與此相關的一些方面, –