私はマクロを初めて使用するので、Java オブジェクトが Clojure コードで表現される方法に関係していると思われる基本的な質問があります。マップを返すマクロがあります。
(defmacro g []
(let [m {:color :black}]
`(identity ~m)))
user=> (g)
{:color :black}
ただし、マップでJavaオブジェクトを使用すると、事態が奇妙になります
(defmacro g []
(let [m {:color java.awt.Color/BLACK}]
`(identity ~m)))
user=> (g)
CompilerException java.lang.RuntimeException: Can't embed object in code, maybe
print-dup not defined: java.awt.Color[r=0,g=0,b=0], compiling:(NO_SOURCE_PATH:1
:1)
出力に変更defmacro
するとdefn
、次のようになります。
user=> (g)
(clojure.core/identity {:color #<Color java.awt.Color[r=0,g=0,b=0]>})
だから私は、表現が読者をうんざりさせていると推測しています。これを行う正しい方法はありますか?