程序在 repl 中工作但无处可寻?

Program working in repl but nowhere else?

我怀疑这可能与 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,但我正在 运行ning openjdk 10.

我认为我的代码编写正确(尽管很差),这是我的代码的问题还是 clojure?

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

尝试用 doseq 替换 for。这将急切地执行你的副作用,应该会改善问题。

非法访问警告是转移注意力的问题。自从 Java 模块系统出现以来,有一些特定的互操作模式可以生成它们。 https://clojure.org/guides/faq#illegal_access

的 Clojure 常见问题解答中提供了如何解决警告的详细信息