Clojure Java Interop

Clojureと🔖Javaのやりとりをまとめ.

Basics

ClojureからJavaを呼び出し.

  • メソッドを呼ぶには, メソッド名の前に . を書く.
  • クラスを生成するには, クラス名のあとに . を書く.

ClojureからJavaのライブラリを利用する

最も大事かもしれないトピック.

twitter-text/java をClojureから利用したいとする. このライブラリはClojureから使っている人がほぼいない.

Java LibraryのClojureプロジェクトへのインストール(deps.edn)

まず大抵のJava libraryはmvn経由でインストールでき, たとえばGitHubのREADME.mdにはこんな感じのxmlがある.

<dependencies>
  <dependency>
    <groupId>com.twitter.twittertext</groupId>
    <artifactId>twitter-text</artifactId>
    <version>3.1.0</version> <!-- or whatever the latest version is -->
  </dependency>
</dependencies>

deps.ednには以下のように / {:mvn/version } と記述すればいい.

com.twitter.twittertext/twitter-text {:mvn/version "3.1.0"}

これでClojureのライブラリインストールと同じようにインストールできる.

Java LibraryをClojureソースから読み込み(import)

twitter-text/TwitterTextParser.java を使うとする.

には com.twitter.twittertextのパッケージを import する. packageはソースを覗くと package という宣言のあとにpathがある.

以下のようにimportしてつかう.

(ns dev
  (:import
   (com.twitter.twittertext
    TwitterTextParser)))

Clojure-Java Array Interop

primitiveのarrayへの変換

into-array

Clojure-Java HashMap Interop

howto: Clojure - JavaのHashmapの変換

(def java-map (java.util.HashMap. test-data))
(def clj-map  (into {} java-map))

howto: Clojureのkeywordを stringにするには?

clojure.walkライブラリ使える. https://clojuredocs.org/clojure.walk

  • stringify-keys: keywords to string
  • keywordize-keys: string to keywords

Clojure-Java Class

howto: Javaのclassを生成するには?

ref: https://clojure.org/reference/compilation

namespaceに (:gen-class)を記述する. namespaceを持つ .classファイルが生成される.

default(AOT compile?) では compileするとバラバラのファイルが生成され, .classがない.

drwxr-xr-x 3 tsu-nera tsu-nera 4.0K 2月 16 13:40 ClojureHelloWorld -rw-r—r— 1 tsu-nera tsu-nera 1.4K 2月 16 13:40 ‘ClojureHelloWorldfn__275fn__275.class’ -rw-r—r— 1 tsu-nera tsu-nera 1.9K 2月 16 13:40 ‘ClojureHelloWorld$loading_6737__auto___271.class’ -rw-r—r— 1 tsu-nera tsu-nera 1.1K 2月 16 13:40 ClojureHelloWorld.clj -rw-r—r— 1 tsu-nera tsu-nera 2.4K 2月 16 13:40 ClojureHelloWorld__init.class

howto: JavaのスーパークラスをClojureで継承するには?

proxy マクロをつかう. これはJavaのクラスを引数にして無名のサブクラスを返すので適当な値にbindする.

ref: https://clojure.org/reference/java_interop#_implementing_interfaces_and_extending_classes

型ヒント

Clojure: 型ヒント(Type Hinting)へ移動.

up: 📂Clojure Core