Clojureの文法でFlutterが書けると聞いた時、これだ!と思った。ClojureDartはただClojureの文法をDartに変換するツールよりも、Flutterがメインだと感じた(個人的にDartもそうだと思っている)。ClojureDartはすごく短時間で「やるぞ」の発表から実際にだれでも試せるような形に発展した。あとからコミットログ見返すと、もっと前から作っていたらしいけど。

最近モバイルアプリ手掛けることになって、プロトタイプ作るにClojureDart試すことにした。困ったことはいろいろとあったが、後悔はしていない。

black and brown dart board

ちゃんと動く

まだまだ作っている途中ではあるが、基本はしっかりと動いている。letdefn などClojureの一般的な文法も、Dartとの接点(interop)も特に難なく使える。widgetマクロも、慣れるとFlutterの強いところを活かせる強力なツールで、Dartで実装するより読みやすいかもしれない。

コンパイラのログ出力はいい感じにできているし、想定外のところでエラー踏んでしまっても原因の特定は難しくない。ホットリロードがあるのでほぼ即時に変更が起動中のアプリに反映されるのは、REPLで (refresh)するより全然スムーズでスピード感ある。そして例えただのホットリロードでは反映されないような変更でも、Rの1キーだけで再起動できる。

マクロの魔法があまり好きじゃない

ClojureDartのFlutter対応のラッパーは、widgetというマクロが主役になっている。かなり簡潔に実装はできるものの、DSLが過ぎてそれだけの言語になりつつある印象がある。ステート管理まわりの :watch:bind の振る舞いも、スムーズというよりも罠と感じることが多い(トップレベル def にステート置くと関係ないけど)。どっちかというと spec.alpha のマクロ沼を思わせる…

まだまだ作っている途中

ドキュメントが充実しているとは言えないし、最新の機能や推奨の書き方がドキュメントに反映されてないことも少なからずある。メインの開発者が2人で逆にようここまでしっかりした実装例があるのが意外。また、開発者がClojuriansの#clojuredartチャンネルにいるので例えば実装例やドキュメント読んでもわからないことがあればスラックで教えてもらえるので、つむことはあまりない。Clojure経験と冒険心がある人が作るアプリならいいかもしれないけど、一般的な開発組織に打ち込むにはまだ早いと思う。