Clojure 1.12.0
互換性
Java 8 - 互換性終了のお知らせ
- Clojure 1.12 は Java 8 バイトコードを生成するが、Java 8 を使用する最後のリリースである。
- 今後のリリースは新しい Java LTS リリースへ移行する予定である。
Java 21 - ユーザーコードでの仮想スレッドのピン留め
- JDK 21 で仮想スレッドを使用したい Clojure ユーザー向けに、1.12 では
lazy-seq と delay が synchronized ブロックの代わりにロックを使用する。
セキュリティ
- CVE-2024-22871 のセキュリティ脆弱性を修正。
シリアライズ
- Clojure のデータ型は Java のシリアライズインターフェースを実装している。
- 1.11.0 では 2 つのクラスのシリアライズ識別子が変更されたが、1.11.1 でこれを元に戻した。
- 1.12.0 では残りのクラスに対する作業を完了した。
依存関係
spec.alpha 依存関係を 0.5.238 に更新。
core.specs.alpha 依存関係を 0.4.74 に更新。
機能
ライブラリの対話的追加
- JVM を再起動せずにライブラリを追加できる新しい関数を提供。
add-lib、add-libs、sync-deps 関数が追加された。
外部プロセスの起動と制御
- 新しい名前空間
clojure.java.process を追加。
start と exec 関数で外部プロセスを制御できる。
メソッド値
- Java メソッドを高階関数として使用できる機能を追加。
- コンパイラが自動的にラッパー関数を生成する。
修飾メソッド
Classname/method、Classname/.method、Classname/new 構文を使用して、修飾メソッドを値として使用できる。
:param-tags メタデータ
- 修飾メソッドに :param-tags メタデータを提供することで、オーバーロードされたメソッドを解決できる。
配列クラス構文
- 配列クラスを表す構文を追加。例:
String/2 は 2 次元文字列配列を表す。
関数型インターフェース
- Java 関数型インターフェースを Clojure 関数に変換して使用できる。
Java Supplier 相互運用性
IDeref 実装体が теперь Supplier インターフェースを直接実装する。
ストリームサポート
stream-seq!、stream-reduce!、stream-transduce!、stream-into! 関数により、ストリームを Clojure 方式で処理できる。
PersistentVector の Spliterable 実装
PersistentVector は теперь 並列処理をサポートするカスタムスプリッテレータを提供する。
効率的な drop と partition
drop、nthrest、nthnext 関数の性能が向上。
- 新しい関数
partitionv、partitionv-all、splitv-at を追加。
Var の intern ポリシー
- 名前空間で var を intern する際に安定した参照を生成する。
- 1.11.0 で発生した問題を解決。
GN⁺のまとめ
- Clojure 1.12.0 は Java 8 を使用する最後のリリースであり、今後のリリースは新しい Java LTS リリースへ移行する予定である。
- 新機能として、ライブラリの対話的追加、外部プロセス制御、メソッド値の使用などがある。
- Java との相互運用性が大幅に向上し、効率的な drop と partition 機能が追加された。
- Clojure ユーザーにとって有用なアップデートであり、開発生産性を高められる。
1件のコメント
Hacker Newsのコメント
add-libs機能がいちばん気に入っているspec2を待っているが、今はMalliを使っているadd-libsとsync-deps機能はとても有用だspecの現状について気になっているという意見がある