📝Clojure Java Interop
up: 📂Clojure Core refs: 🏷Java
ClojureとJavaのやりとりをまとめ.
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 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 'ClojureHelloWorld$fn__273.class'
-rw-r--r-- 1 tsu-nera tsu-nera 1.1K 2月 16 13:40 'ClojureHelloWorld$fn__275$fn__276.class'
-rw-r--r-- 1 tsu-nera tsu-nera 1.3K 2月 16 13:40 'ClojureHelloWorld$fn__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) #
Clojureは動的型付け言語だが動的型付け言語のJavaの上に構築されているため, 暗黙的な型はリフレクションによって型推論されている.
そのため型hintを設定することで型推論の効率化をすることができ, コンパイルや実行速度の最適化をすることができるかもしれない.
Clojureでは, ^ という記号を Record/Type/Protocol/Java Classに設定して 変数を宣言することで型ヒントを実現する.
ref: [Clojure] 型を指定すると速い | Basic Werk
Clojureは型ヒントを使ってコンパイラを助けることで, パフォーマンスの重要なコード領域に対してリフレクションを避けることができる.
ClojureはローカルコンテキストにおけるJavaの基本型を使った高速な計算や算術演算をサポートする. すべてのJava基本型(int, float, long, double, boolean, char, short, byte)がサポートされている。
Active Recalls #
ClojureからJavaのメソッドの呼び出すには? #
メソッド名の前に.をおいて呼び出す. (.methodName )
ClojureからJavaのクラスを生成には? #
クラス名のあとに.をおいて呼び出す. (Classname. )