Jank – シームレスなC++相互運用性を備えたネイティブClojure方言
Jank – The native Clojure dialect with seamless C++ interop (jank-lang.org)
要約
JankはC++上に構築されたClojureの方言であり、C++の機能(テンプレート、仮想関数、例外、オーバーロード解決、RAIIなど)とシームレスに連携できる点が特徴です。LLVMベースのJITコンパイラによるREPL駆動開発をサポートし、ゲーム開発などの分野でC++のパフォーマンスを活かしながら、関数型・イミュータブルなデータ構造とREPL開発の利便性を提供します。
全文翻訳
jank は Clojure を基盤としています
シームレスなC++相互運用性を備えたネイティブClojure方言
jank は C++ 上の Clojure です。 他のどの言語にもない C++ との相互運用性を備えています。テンプレート、仮想関数、例外、オーバーロード解決、RAII がすべて jank で機能します。ボイラープレートは一切不要です。ヘッダーをインクルードして開始するだけです!
jank は堅牢な Clojure 方言です。 Clang ベースの C++ JIT コンパイラによって強化された、インタラクティブな REPL 駆動開発を提供します。
(ns my.app.filesystem
(:include "boost/filesystem.hpp")
(:refer-global :rename {boost.filesystem.file_size file-size}))
(defn file-info [file-path]
(try
(let [bytes (file-size (cpp/cast std.string file-path))]
{:path file-path
:size bytes})
(catch boost.filesystem.filesystem_error e
{:path file-path
:error (.what e)})))
(file-info "/etc/passwd")
; {:path "/etc/passwd", :size 4025}
(file-info "/root/.bash_history")
; {:path "/root/.bash_history"
; :error "boost::filesystem::file_size: Permission denied [system:13]: \"/root/.bash_history\""}
jank は Clojure です
jank は完全な Clojure 方言であり、Java ではなく C++ との相互運用性を備えています。必要に応じて :jank リーダー条件を使用できます。
jank は C++ です
jank は任意の C++ ソースをインクルードでき、任意の C または C++ ライブラリにリンクでき、C++ の型システムを使用します。jank は C++ にコンパイルされます!
Cargo にインスパイアされたツール
jank は Leiningen ベースのプロジェクト管理を使用し、豊富なネイティブビルドシステムを備えています。プロジェクトに C および C++ の依存関係を追加するのは簡単です。
REPL とネイティブ JIT コンパイラ
お気に入りの nREPL エディタプラグインを使用してください。jank には、C++ コードをオンザフライでコンパイルするための LLVM ベースの JIT ランタイムが含まれています。
簡単なプロジェクト管理
jank のネイティブビルドシステムは、インストール済みのネイティブ依存関係を見つけたり、ソースからビルドしたりできます。新しい依存関係の追加は、1行の変更で済みます。
(defproject imgui+glfw "0.1-SNAPSHOT"
:dependencies [[org.jank-lang.commons/imgui-glfw-sys "2026.06-6"]
[org.jank-lang.commons/imgui-opengl2-sys "2026.06-6"]
[org.jank-lang.commons/gl-sys "2026.06-1"]]
:plugins [[org.jank-lang/lein-jank "2026.06-2"]]
:middleware [leiningen.jank/middleware]
:main imgui+glfw.main
:profiles {:base {:jank {:target-dir "target/debug"
:optimization-level 0}}
:release {:jank {:target-dir "target/release"
:optimization-level 3}}})
jank はゲーム開発に最適です
jank は、関数型でイミュータブルなデータと REPL 駆動開発をゲーム開発ワークフローにもたらします。jank を使用すると、追加のパフォーマンスが必要な場合にいつでも C++ にアクセスできます。ブリッジ、関数/型の登録、マーシャリング、コールバックは一切不要です。
(ns imgui+glfw.main
(:include "GLFW/glfw3.h"
"imgui.h" "imgui_impl_glfw.h" "imgui_impl_opengl2.h"))
(defn -main []
(cpp/glfwInit)
(let [window* (cpp/glfwCreateWindow 400 300
"jank"
cpp/nullptr cpp/nullptr)]
(cpp/glfwMakeContextCurrent window*)
(cpp/ImGui.CreateContext)
(cpp/ImGui_ImplGlfw_InitForOpenGL window* true)
(cpp/ImGui_ImplOpenGL2_Init)
(while (cpp/! (cpp/glfwWindowShouldClose window*))
(cpp/glfwPollEvents)
(cpp/ImGui_ImplOpenGL2_NewFrame)
(cpp/ImGui_ImplGlfw_NewFrame)
(cpp/ImGui.NewFrame)
(when (cpp/ImGui.Begin "jank")
(cpp/ImGui.Text "Hello, jank and imgui!"))
(cpp/ImGui.End)
(cpp/ImGui.Render)
(cpp/ImGui_ImplOpenGL2_RenderDrawData (cpp/ImGui.GetDrawData))
(cpp/glfwSwapBuffers window*))
(cpp/glfwTerminate)))
[[
[画像: Jank のデモアプリケーションのスクリーンショット]
]]