2

私はマクロを初めて使用するので、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]>})

だから私は、表現が読者をうんざりさせていると推測しています。これを行う正しい方法はありますか?

4

2 に答える 2