ClojureでREPL駆動開発

ERDOS Balint
スタディスト Tech Blog
5 min readDec 21, 2018

--

Clojureや他のLispは、REPLが最大の強みの一つとして言われることが多いが、そのREPLとはいったい何なのかもピンと来ない人がいると思う。そこから始めて、REPL駆動開発で何がどう変わったかをざっくりとまとめたい。

REPLとは

REPLはread-eval-print-loopの略語であって、Lisp固有のコード実行環境である。固有とはいえ、インタプリタ型言語でそれを真似るようなコンソールがある:ルビーのIRBやパイソンとかJSのコンソールは馴染みあるだろう。

強力なペアプロツール

REPLのいいところは、Cみたいに長い長いコンパイル待ってから何とか実行して書いたコードを試せるのではなく、さくさくと瞬時のフィードバックループで開発が進めることだ。もちろんファイル編集からの環境のホットリロードや、コンソールからの関数の上書きなどもできる。

REPL使わないClojureのウェブ開発

ClojureはJVMのバイトコードにコンパイルされる言語であり、コンパイル自体も、そこからのJVMの起動も、時間は要する。REPLを使わないでウェブ開発を進めるなら、ファイルをかたっぱしから編集して、一定の「もう動くだろう」完成度まで持っていったら、例えば lein run でコンパイル・実行する。それともいっそjarを生成して、 java -jar hoge.jar で手間かけてやる。

タイポ直すだけで分単位でかかる

どっちにせよ、起動はかなり遅い。jarからやると、その生成だけでうん十秒がかかり、起動はそこからで。もしかしてコードに実行時に始めてぶつかるようなタイポ(ぬるぽやマップのキーの打ち間違いとか)があれば1分ぐらい待ってから始めてそれに気づく。

最近流行りのスピード感のある開発プロジェクトに対して、一つのタイポ直すだけで分単位でかかるのはスピードとは言い難い遅さは論外。

Photo by SpaceX on Unsplash

REPLを使ったClojureのウェブ開発

ちょっとした準備が必要ではあるが、REPLを使えば開発スピードが圧倒的に速くなる。そのちょっとした準備はリモートのREPLに接続するときに自動で読み込まれる user の名前空間を作っておくところぐらい。そこにREPL用の便利関数などを詰めて :dev でしか使われないパスに置くと、本番に影響なく作業効率が上がる。

user 名前空間を作成して、 :headless のREPLにリモート(Dockerの外や同僚のマシーン)からつなぐと、ホットリロードなど便利関数がすぐ手元に揃っているのでスピードあがる。

Party REPLというあれ

Clojure Conjで話があったClojure Party REPLはAtomのTeletypeを活かしたペアプロ用のREPL拡張。通常のREPLは一人用のものになるが、Teletypeを混ぜると瞬時フィードバックの強力なペアプロツールになる。

ローカルのファイルから定義をREPLで実行したり、説明する時にさくっとサンプルを書いたりできる。例えば言葉で伝わらなくても、コードを見て触って実行してでは伝わる。

式実行だけで名前空間が自動で変わってくれる、同時編集ができる、ハイライト付きのREPLなんて、Emacsの気高き民でも嬉しいと思う。

Photo by rawpixel on Unsplash

難易度は?

現状弊社でClojureでの新機能開発を進めている中で、言語自体にこれで始めて触れた一人と、REPL駆動開発を始めてやってみた一人がいるが、これでもほとんどの支障なく業務に活かせている。

Clojureはマニュアル作成・共有ツールのTeachme Bizの一部の機能の土台になって、これからもREPL駆動でスピード感のある開発を進める。そういう環境やチームにご興味があれば、気軽話かけてください!ビールの上でClojureの話するのもいいし、オフィスを見てみたいという方も対応する!ぜひ!

--

--