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)へ移動.
👉Related
up: 📂Clojure Core