Ich möchte ein Java-Objekt (in diesem Fall ein BufferedImage) in Clojure-Code einbetten, die später eval
d sein kann.Einbetten beliebiger Objekte in Clojure-Code
den Code erstellen funktioniert:
(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)
jedoch eine Ausnahme erhalten, wenn sie versuchen, es 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)
Gibt es eine Möglichkeit etwas wie diese Arbeit zu machen?
EDIT:
Der Grund, warum ich dies zu tun versuche, ist, dass ich Code zu erzeugen in der Lage sein wollen, die Proben von einem Bild nimmt. Das Bild wird an die Funktion übergeben, die die Codegenerierung durchführt (entspricht f
oben), kann aber (aus verschiedenen Gründen) später nicht als Parameter an den kompilierten Code übergeben werden.
muß ich zitierte Code generieren, weil dieser Teil einer viel größeren Codegenerierung Bibliothek ist, die weiteren Transformationen auf den generierten Code gelten, daher kann ich nicht einfach so etwas tun:
(defn f [image]
(fn [] (.getRGB image 0 0)))
ist es nur eval, das diesen Fehler gibt? Makros (zB 'if') können es gut gebrauchen, nehme ich an? Wenn ja, dann ist es wahrscheinlich, weil eval die Dinge zwingt, durch Text zu gehen (was für eval sinnvoll ist). Wenn dies ein Problem für Sie ist, verwenden Sie möglicherweise eval, wenn es nicht notwendig ist - wenn ein Makro möglicherweise das ist, was Sie brauchen. –
@andrewcooke Wie ich es verstehe, zwingt das 'eval' die Dinge nicht wirklich durch * text *. Eval (via Compilieren) generiert JVM-Code, der die Objekte erstellt. Das Durchlaufen von Text (via Serialisierung) ist das letzte Mittel, das für unbekannte Objekte verwendet wird. –
@mikera Zurücktreten, können Sie kommentieren, warum Sie quoting und eval vs. etwas tun wie '(defn f [a] (fn [] (.getRGB a 0 0)))? – user100464