Clojure is designed to be a hosted language, sharing the JVM type system, GC, threads etc. It compiles all functions to JVM bytecode.
Clojure is a great Java library consumer, offering the dot-target-member notation for calls to Java. Class names can be referenced in full, or as non-qualified names after being imported. Clojure supports the dynamic implementation of Java classes and interfaces using proxy.
Here's a small Swing app:
(import '(javax.swing JFrame JLabel JTextField JButton)
'(java.awt.event ActionListener)
'(java.awt GridLayout))
(defn celsius []
(let [frame (new JFrame "Celsius Converter")
temp-text (new JTextField)
celsius-label (new JLabel "Celsius")
convert-button (new JButton "Convert")
fahrenheit-label (new JLabel "Fahrenheit")]
(. convert-button
(addActionListener
(proxy [ActionListener] []
(actionPerformed [evt]
(let [c (. Double (parseDouble (. temp-text (getText))))]
(. fahrenheit-label
(setText (str (+ 32 (* 1.8 c)) " Fahrenheit"))))))))
(doto frame
(setLayout (new GridLayout 2 2 3 3))
(add temp-text)
(add celsius-label)
(add convert-button)
(add fahrenheit-label)
(setSize 300 80)
(setVisible true))))
(celsius)
