Программа работает в repl, но больше нигде? - PullRequest
0 голосов
/ 07 марта 2019

Я подозреваю, что это может быть как-то связано с 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"))

Правильно генерируется изображение сетки.

Однако, если я делаю Cc Ck, оно генерирует пустое изображение.

Теперь, когда я вставляю его ви я запускаю ее через 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.

Я считаю, что мой код написан правильно (хотя и плохо), это проблема с моим кодом или ошибка?

1 Ответ

3 голосов
/ 07 марта 2019

Я подозреваю, что у вас проблема в том, что «для» не делает то, что вы думаете, что делает. Это генерирует ленивую последовательность. При REPL принтер обычно оценивает их, а автономный код - нет.

Попробуйте заменить for на dosq. Это с готовностью выполнит ваши побочные эффекты и должно улучшить положение.

Предупреждение о незаконном доступе - красная сельдь. Поскольку появилась система модулей Java, существуют определенные шаблоны взаимодействия, которые генерируют их. Подробная информация о том, как устранить предупреждения, приведена в FAQ Clojure по адресу https://clojure.org/guides/faq#illegal_access

...