Daha sonra bir eval
d olabilen Clojure kodunda bir Java nesnesi (bu durumda bir BufferedImage) gömmek istiyorum. kod oluşturmaClojure kodunda rastgele nesneleri gömme
çalışıyor:
(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
çalışırken bir istisna olsun Ancak:
(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)
bu işin böyle bir şey yapmak için herhangi bir yolu var mı?
DÜZENLEME:
Bunu yapmaya çalışıyorum sebebi bir görüntü numuneler almakta kodu oluşturmak için mümkün istiyorum olmasıdır. Görüntü, kod nesnesini (yukarıdaki f
eşdeğeri) yapan işleve iletilir, ancak (çeşitli nedenlerle) daha sonra derlenmiş kod için bir parametre olarak iletilemez.
(defn f [image]
(fn [] (.getRGB image 0 0)))
Sadece bu hatayı veren bir değerlendirmedir? Makrolar (örneğin "if") bunu kullanabilir, sanırım? eğer öyleyse, o zaman muhtemelen büyük olasılıkla şeyleri bir şeyleri metinden geçmeye zorladığı için (çünkü değerlendirmek için mantıklıdır). Bu sizin için bir sorunsa, gerekmediğinde değerlendirmeyi kullanıyor olabilirsiniz - bir makro ihtiyacınız olduğunda olabilir. –
@andrewcooke Bunu anladığım kadarıyla, “değerlendirme” gerçekten bir şeyleri zorlamak için zorlamıyor * metin *. Eval (derleme yoluyla) nesneleri oluşturan JVM kodunu oluşturur. Metin aracılığıyla (serileştirme yoluyla) bilinmeyen nesnelerde kullanılan son çare. –
@mikera Geri adım atıyorsunuz, neden alıntı ve değerlendirmeyi tercih ettiğinizi açıklayabilir misiniz? (Defn f [a] (fn [] (.getRGB a 0 0))) '? – user100464