【问题标题】:Program working in repl but nowhere else?程序在 repl 中工作,但在其他地方没有?
【发布时间】:2019-03-07 06:28:47
【问题描述】:

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

【问题讨论】:

    标签: clojure clojure-java-interop


    【解决方案1】:

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

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

    非法访问警告是一个红鲱鱼。由于 Java 模块系统的出现,因此产生了某些互操作模式。 Clojure 常见问题解答中提供了有关如何解决警告的详细信息,地址为 https://clojure.org/guides/faq#illegal_access

    【讨论】:

    • Doseq 解决了这个问题。
    • 顺便说一句,您也可以将for 调用包装在doall 中。 doseq 在这里是一个更好的解决方案,但有时你不想摆脱惰性序列但又想强制它实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多