Ich habe ein Problem mit einem Paar Clojure-Makros, wenn ein Standardargument definiert ist.Clojure-Makros und Standardargumente, wenn ein Makro einen anderen aufruft
In der folgenden Situation mit zwei Makros, wo mm02 ruft 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])))
Die Bewertung von:
(mm02 { :f1 byte })
druckt:
(1) ~f1 #function[clojure.core/byte]
(2) ~f1 #function[clojure.core/long]
Allerdings hätte ich erwartet:
(1) ~f1 #function[clojure.core/byte]
(2) ~f1 #function[clojure.core/byte]
Mache ich etwas falsch oder verpasse ich etwas?
By the way, die Auswertung von:
(mm01 { :f1 byte })
druckt:
(2) ~f1 #function[clojure.core/byte]
Ihnen sehr danken.
Große und klare Erklärung und nützliche Kommentare, danke! Ich sehe, dass optionale Argumente zu einigen obskuren Fehlern führen können. Ich denke, dass Stuart Sierra einige Aspekte dazu in [https://stuartsierra.com/2015/06/01/clojure-donts-optional-arguments-with-varargs] kommentiert. –