当定义默认参数时,我遇到一对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 ~@opts)))
Run Code Online (Sandbox Code Playgroud)
评价:
(mm02 { :f1 byte })
Run Code Online (Sandbox Code Playgroud)
打印出来:
(1) ~f1 #function[clojure.core/byte]
(2) ~f1 #function[clojure.core/long]
Run Code Online (Sandbox Code Playgroud)
但是,我原以为:
(1) ~f1 #function[clojure.core/byte]
(2) ~f1 #function[clojure.core/byte]
Run Code Online (Sandbox Code Playgroud)
我做错了什么或者我错过了什么?
顺便说一句,评价:
(mm01 { :f1 byte })
Run Code Online (Sandbox Code Playgroud)
打印出来:
(2) ~f1 #function[clojure.core/byte] …Run Code Online (Sandbox Code Playgroud)