Вызов java-функций из Clojure

Я могу использовать (.toUpperCase "GOOD" ) в clojure, так как "GOOD" - это строка java, а строка java имеет метод toUpperCase.

Я также могу использовать (java.io.File/separator) из clojure как способ вызова java-функций.

Но почему я не могу позвонить (java.lang/Object wait 3) или (java.lang.System/println "привет" )?

  • Разве мы не можем использовать все java-функции из Clojure?
  • Если нет, есть ли правило для их вызова? Если да, то где ссылка для этих функций?

Ответ 1

Вы можете использовать все функции Java из Clojure. См. Замечательную страницу в Clojure Java interop.

В частности, вам просто нужно получить синтаксис права в зависимости от того, какую конструкцию Java вы имеете в виду, например. выполнение метода println на статическом элементе "out" из java.lang.System:

(.println (System/out) "hi")

Ответ 2

Как уже отмечал предыдущий плакат, два примера, которые вы даете, просто немного:

(.wait (java.lang.Object.) 3) ;; this actually throws an IllegalMonitorStateException

(.println java.lang.System/out "hi")

Должен работать!

Ответ 3

Во-первых, функция Object.wait() не является статической, ее следует использовать как:

(.wait (java.lang.Object.) 3)

Во-вторых, функция Object.wait() должна вызываться после получения блокировки. В противном случае он выбросит IllegalMonitorStateException.