概要
jank は、 Clojure のインタラクティブ性と ネイティブコンパイル の両立を目指す汎用プログラミング言語。 C++ をホストとし、 LLVMベースJIT で高性能とREPL開発を実現。 Clojureと高い互換性を持ち、 コード-as-データ 哲学と強力なマクロシステムを継承。 ネイティブコードとのシームレスな連携や ツーリング への配慮も特徴。 現在も積極的に開発中で、多くの機能が計画・実装段階。
jankの特徴と概要
- Clojure と互換性を持つ 方言 として設計
- C++ 上で動作し、 LLVM JIT による高速な実行環境
- REPL によるインタラクティブ開発体験
- ネイティブコード へのシームレスなアクセス
- コード-as-データ の哲学、強力な マクロシステム
- 不変データ構造 を標準装備、関数型プログラミング重視
- ソフトウェアトランザクションメモリ や リアクティブエージェント によるスレッド安全な設計
Clojureライクなイテレーション
- REPL で反復的にプログラム構築が可能
- エディタから離れずに開発体験
- 例:(defn -main [& args] (loop [game-state (new-game!)] (if (done? game-state) (end-game! game-state) (recur (next-state game-state)))))
ネイティブ連携とインラインC++
- C++ コードを Clojure ソース内にインラインで記述可能
- Clojureコードと 相互運用性 を保持
- 例:(defn create-vertex-shader! [] (c++/glCreateShader c++/GL_VERTEX_SHADER))
マシンコードへのコンパイル
- LLVMベースJIT による高速なAOTコンパイル
- 静的・動的リンク な実行ファイル生成に対応
- 起動時間 ・ メモリ使用量 が非常に少ない
- jank: real 0m0.086s, user 0m0.045s, sys 0m0.040s
エラー報告とツール連携
- 高品質なエラー報告、分かりやすいエラーメッセージ
- JVM由来の冗長なスタックトレース が不要
- :jankリーダー条件 でClojure JVM/ClojureScriptとの互換性
- nREPL、 Leiningen、 LSP などツール連携を重視した設計
データ変換・操作の例
-
reduce、 zipmap、 repeat、 merge-with で複雑なデータ変換も簡潔に記述
-
ネストしたデータも lenses 不要で扱いやすい
-
例:ジャンルから映画IDへのインデックス生成
- (def movies {...})
- (def genre->movie (reduce ...))
- (->> (genre->movie :thriller) (map movies) (sort-by :tomatometer))
バイト数の人間可読変換
- loop マクロによる命令型ループもサポート
- 例:(defn size->human-readable ...)
文字列の最大長切り詰め
- 文字列やデータ構造の不変性 を維持
- 強力なデータ操作ツールで 可変性の必要性を低減
- 例:(defn truncate ...)
varの再定義とテスト
- def/defn は全てvarとして管理
- with-redefs で一時的な再定義が可能
- 副作用の排除やテスト容易化 に役立つ
- 例:(with-redefs [post! ...] ...)
このように、 jank はClojureの強みを活かしつつ、 ネイティブパフォーマンス や ツール連携、 高い拡張性 を実現する 新世代Lisp方言。今後の発展にも注目。