当定义一个默认参数时,我有一对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]中评论了与此相关的一些方面, –