に任意のオブジェクトを埋め込む私はeval
後日間することができるClojureのコードで(この場合のBufferedImageに)Javaオブジェクトを埋め込みたいです。コードの作成Clojureのコード
が正常に動作します:
(defn f [image]
`(.getRGB ~image 0 0))
=> #'user/f
(f some-buffered-image)
=> (.getRGB #<BufferedImage [email protected]: type = 2 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width = 256 height = 256 #Bands = 4 xOff = 0 yOff = 0 dataOffset[0] 0> 0 0)
eval
にそれをしようとしたときに例外を取得しかし:
(eval (f some-buffered-image))
=> CompilerException java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: [email protected]: type = 2 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width = 256 height = 256 #Bands = 4 xOff = 0 yOff = 0 dataOffset[0] 0, compiling:(NO_SOURCE_PATH:1)
この作品のようなものを作るための方法はありますか?
EDIT:
私はこれを行うにしようとしています理由は、私がイメージからサンプルを取るコードを生成できるようにしたいということです。画像は、(上記f
に相当)符号の生成を行いますが、(様々な理由のために)後でコンパイルされたコードにパラメータとして渡すことができない関数に渡されます。
(defn f [image]
(fn [] (.getRGB image 0 0)))
このエラーを返すのはちょうどevalですか?マクロ(例えば 'if')はそれをうまく使えますか?もしそうなら、それはおそらくevalが物事をテキストを通過させるようにしているからです(これはevalには意味があります)。これが問題なのであれば、マクロが必要なときに必要なときにevalを使用している可能性があります。 –
@andrewcooke私が理解しているように、 'eval'は物事が* text *を通過することを強制しません。 Eval(コンパイル経由)は、オブジェクトを作成するJVMコードを生成します。未知のオブジェクトに使用される最後の手段は、シリアライゼーションを介してテキストを読むことです。 –
@mikera引用符で囲んだものとevalを使って 'defn f [a](fn [](.getRGB a 0 0))')のようなやり方をした理由についてコメントすることができますか? – user100464