Clojure: Babashka
Clojureをbashシェルのように実行するためのClojureインタプリタ.
ClojureはJVM上のプログラムなので起動も遅いしメモリも必要なのでbashスクリプトやRuby/Pythonのような軽量インタプリタ言語のように気軽な処理に不向きだった. この課題を解決する.
開発のモチベは, bashのように気軽に使えてbashのような複雑な文法でなくClojureのようなシンプルに処理が書けたらいいなあということかららしい.
🔧GraalVMを活用し, さらにライブラリを厳選することで高速にしている.
Babashka Basics
bb
babashkaのcli.
bb.edn
npm scriptsのpackages.jsonやMakefileに相当するものがbb.ednで, このファイルを起点にしてbbコマンドをつかっていろんな操作をする.
通常はproject rootに置く. deps.ednと同一フォルダ
{:deps {your-org/your-project {:local/root "."}}}
スクリプト実行
#!/usr/bin/env bb
スクリプトのノリで書くには以下の一行目に(#!/usr/bin/env bb)をつければおけ.
#!/usr/bin/env bb
これで, chmod +x hogehogeで実行権限をつければ ./hogehogeで実行可能.
Babashka Task Runner
Bahashkaをタスクランナーとして使う方法.
Babashka外部ライブラリ
省リソースがBabashkaの売りなので, ClojureのライブラリをそのままつかうのではなくなるべくカスタマイズされたBabashkaライブラリを使って処理をすることがポイント.
利用できるライブラリは以下. GitHub READMEにbabashka compatibleのバッジが使えるならば互換性は保証されている.
REST APIを叩くには?/HTTP Requestを扱うには?
REST APIを叩くには/HTTP Requestを扱うにはbabashka/http-clientをつかう.
https://github.com/babashka/http-client
JSONをパースするには?
🔧nbb
🔧Babashka(Clojure)のClojureScript版. 🔧npmライブラリが使える.
npmがつかえるということは, ライブラリでできることはなんでもできるということ. 実はbbよりもnbbのほうがよりClojureらしくスクリプテングをしたいという目的の最適解なのか?
🔧shadow-cljsと比べて, よりスクリプテング用途であり, 起動がより高速であるが, 実行速度はより遅い.
JSのPromise callbackをハンドリング
🔧funcool/promesaが組み込まれているのでこれをつかう.
https://github.com/babashka/nbb/blob/main/examples/axios/example.cljs
(p/let [resp (axios/get "https://clojure.org")
resp (js->clj resp :keywordize-keys true)]
(prn (:status resp)) ;; => 200
(prn (subs (:data resp) 0 10))) ;; => "<!DOCTYPE "
nbb with CIDER
🔧Emacs CIDERとの連携.
- nbb.edn を作成して,
M-x cider-jack-in-cljs
. - CLIからnbb nrepl-serverを実行して,
M-x cider-connect-cljs
.
References
- (iterate think thoughts): Making a Resume with Node.js Babashka (nbb)
- AWS Lambda, now with first class parentheses
- Serverless site analytics with Clojure nbb and AWS
Insights
🤔Babashkaはbash alternativeなスクリプトであり外部ライブラリやコード共有は期待しない
BabashkaからClojureの外部ライブラリが使えると行っても限定的. 速度最適化のために, Babashkaはスクリプティングに必要な機能のみをつかうように最適化されている.
Clojureのライブラリや既存プロジェクトの資産をフル活用しようとしても, エラー読み込めない場合がある.
BabashkaはClojureの資産ではなくシンタックスを活用する目的にしたほうがいい. その意味では, 用途は📝Schemeの代わりのような位置づけ.
もし, babashkaのような起動速度に外部ライブラリの用途を組み合わせるのならば, 🔧nbbがいいかもしれない. JavaはメモリやCPUをつかうがnode.jsそれよりも軽い. そしてnbbはnode.jsの資産を活用する.