我对宏很陌生,所以我有一个基本问题,似乎与 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]>})
所以我猜这种表示会让读者感到厌烦。有没有正确的方法来做到这一点?