TL;DR
Clojure のランタイムの 1 つ。Clojure でスクリプトを手軽に作成・実行できる。
なぜ必要か
Babashka はネイティブバイナリなので、JVM で動かす Clojure と比べて処理時間が短く、メモリの消費も少ない。
仕組み
Babashka は SCI(Small Clojure Interpreter)というインタプリタを内蔵しており、GraalVM でネイティブバイナリにコンパイルされている。
bb.edn には、Makefile や npm scripts のようなタスクの定義と、依存関係の追加を書ける。書式は edn である。
{:paths ["src"]
:tasks {:requires ([babashka.fs :as fs]
[journal.list :as list])
welcome (println "ようこそ")
clear (fs/delete-if-exists "entries.edn")
list (list/list-entries nil)
add (exec 'journal.add/add-entry)}}依存関係はスクリプトに直接追加することもできる。
(require '[babashka.deps :as deps])
(deps/add-deps '{:deps {medley/medley {:mvn/version "1.3.0"}}})REPL もサポートしており、Calva からも使える。
Babashka Pods を使うと、Pods プロトコルに従って Babashka と外部のプログラムの間でデータをやり取りできる。使えるプログラムは pod-registry にまとまっている。
例
.clj ファイルを直接スクリプトとして実行できる。1 ファイルで完結するなら、名前空間の宣言(ns)は省略できる。
(require '[clojure.string :as str])
(prn (str "Hello from " *ns* ", inner world!"))bb script.cljShebang を書けば、ファイルを直接実行できる。
#!/usr/bin/env bb
(prn (str "Hello from " *ns* ", inner world!"))式をその場で評価することもできる。
bb -e '(+ 1 2 3)'CLI を作るための cli や、ファイル操作のための fs など、ユーティリティのライブラリも豊富である。bbin を使うと、Babashka のスクリプトやプロジェクトを PATH にインストールできる。
bbin install io.github.babashka/neil
bbin install https://github.com/bhauman/clojure-mcp-light.git注意点
当然ながら、コンパイル済みのコードを実行するほどの性能は出ない。スクリプトの実行に数秒以上かかる場合や、ループが多い場合は、JVM で動かすほうが良いこともある。