程序可以在repl中运行,但没有其他地方吗?

时间:2019-03-07 06:28:47

标签: clojure clojure-java-interop

我怀疑这可能与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?

1 个答案:

答案 0 :(得分:3)

我怀疑您遇到的问题是“ for”没有按照您的想法做。它生成一个惰性序列。在REPL,打印机通常会评估这些,但是独立代码不会。

尝试用剂量q代替。这将急切地执行您的副作用并应改善情况。

非法访问警告是红色鲱鱼。自从Java模块系统问世以来,就有一些互操作模式可以生成它们。有关如何解决警告的详细信息,请参见https://clojure.org/guides/faq#illegal_access

的Clojure常见问题解答。