Desidero incorporare un oggetto Java (in questo caso una BufferedImage) nel codice Clojure che può essere eval
d successivo.Incorporamento di oggetti arbitrari nel codice Clojure
Creazione del codice funziona bene:
(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)
Tuttavia si ottiene un'eccezione quando si cerca di eval
esso:
(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)
Esiste un modo per fare qualcosa di simile a questo lavoro?
EDIT:
Il motivo per cui sto cercando di fare è che voglio essere in grado di generare il codice che prende campioni da un'immagine. L'immagine viene passata alla funzione che genera il codice (equivalente a f
sopra), ma (per vari motivi) non può essere passato come parametro al codice compilato in seguito.
ho bisogno per generare il codice citato perché questo fa parte di una libreria di generazione di codice molto più grande che si applica ulteriori trasformazioni al codice generato, quindi non posso fare qualcosa di simile:
(defn f [image]
(fn [] (.getRGB image 0 0)))
è solo eval che dà questo errore? i macro (ad esempio 'if') possono usarlo bene, presumo? se è così, allora è probabilmente perché eval forza le cose a passare attraverso il testo (che ha senso per la valutazione). se questo è un problema per te, potresti usare eval quando non è necessario - quando una macro può essere ciò di cui hai bisogno. –
@andrewcooke A quanto ho capito, 'eval' non impone realmente le cose per passare attraverso * text *. Eval (tramite compilazione) genera codice JVM che crea gli oggetti. Passare attraverso il testo (tramite serializzazione) è l'ultima risorsa utilizzata su oggetti sconosciuti. –
@mikera Tornando indietro, puoi commentare perché hai scelto di usare quoting ed eval rispetto a qualcosa di simile a '(defn f [a] (fn [] (.getRGB a 0 0)))'? – user100464