我怀疑这可能与java-interop有关,因为我在代码中调用了许多Java功能。
当我在REPL中(通过emacs)运行以下命令时,它完全可以正常工作
(def height 100)
(def image (BufferedImage. width height BufferedImage/TYPE_INT_ARGB))
(def graphics (.createGraphics image))
(.setColor graphics Color/black)
(for [x (range 0 width 10)]
(.drawLine graphics x 0 x height ))
(for [y (range 0 height 10)]
(.drawLine graphics 0 y width y))
(ImageIO/write image "png" (io/file "output.png"))
已正确生成网格图像。
但是,如果我进行C-c C-k操作,它将生成空白图像。
现在,当我将其粘贴到函数中并通过lein run
运行它时,会收到一条我不明白的警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by clojure.lang.InjectedInvoker/1832669781 (file:/home/n/.m2/repository/org/clojure/clojure/1.10.0/clojure-1.10.0.jar) to method sun.java2d.SunGraphics2D.setColor(java.awt.Color)
WARNING: Please consider reporting this to the maintainers of clojure.lang.InjectedInvoker/1832669781
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
我对clojure的了解甚少,对Java的了解甚少,但是我正在运行openjdk 10。
我相信我的代码编写正确(尽管效果不佳),这是我的代码存在问题还是Clojure?
答案 0 :(得分:3)
我怀疑您遇到的问题是“ for”没有按照您的想法做。它生成一个惰性序列。在REPL,打印机通常会评估这些,但是独立代码不会。
尝试用剂量q代替。这将急切地执行您的副作用并应改善情况。
非法访问警告是红色鲱鱼。自从Java模块系统问世以来,就有一些互操作模式可以生成它们。有关如何解决警告的详细信息,请参见https://clojure.org/guides/faq#illegal_access
的Clojure常见问题解答。