(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

#渋谷Java 第十一回で Clojure 用の IDEA プラグインである Cursive の紹介してきた。

何をとち狂ったのかセッション枠という 20 分話せる枠をもらってしまったので話してきた。

元々は Clojure 入門みたいな話をしようと思ったんだけど、やっぱり入門以前にエディタとか IDE で「自分たちが普段使っているものが使えるのか」って大事だと思ったので今回は IntelliJ IDEA も使えるよって話をすることにした。
ちなみに何故 Eclipse じゃないのかと言われると、「 Clojure 使いが実際に使っていてシェアが高い」ことも同じくらい大事だと思ったので IDEA にした。あとはたまたま僕が IDEA のライセンスをたまたま持っていた*1からちょうど良いかってのもあった(もし、自分で試してみて納得行くなら Emacs から移ってもいいかなーと思ったしね)。

発表した内容

以下は発表したスライド

Youtube に実際に今日デモでやった内容と同じ内容をアップしているので興味ある人はどうぞ。

結局 Cursive ってどうなの?

スライドの最後に書いてある通りですが、 Emacs 使い的にはまだ「ちょっと微妙」です。ただ、今のところ一番夢見れる IDE なんじゃないですかね。 Light Table や Nightcode は普段から使ってないからなんとも言えないですけど、個人的に Cursive は「かなり、あり」です。あとは IntelliJ IDEA を普段使いしている、もしくは関連 IDE を使っている人なら簡単に使えるはずです。ちょっとマクロ展開ができたりできなかったりするお茶目な不具合とかもわりとヘビーに使った*2ので知ってますが、そのうち直ると思うし期待してます。

たぶん Emacs ユーザー、特に Cider ユーザーにとっては全然機能が足りないというか、ライブラリ開発者とかだとちょっと足りないと思うと思います。 Emacs なら簡単に定義元ジャンプが出来てなおかつ、読み取り専用バッファを書き込み出来るようにして修正して Clojure のコードを評価とか当たり前にやると出来るんですが、 Cursive では定義元ジャンプは出来ても修正して評価が出来ないです。そこが Cursive 使ってて、あーって思ったところですかね。勿論コピーして REPL の中で名前空間変えて評価するっていう方法もあるけど、 Emacs の方が簡単ですね。
それとなんだろう defxxx 系のマクロで定義されている変数/関数は「未定義」扱いされるので、「未定義だよー」ってハイライトされちゃいます*3。この未定義扱いは地味に不便で確かこれは定義元ジャンプ出来なかった気がする。 Paredit 相当の構造的編集機能めっちゃ便利だけど、強制的に括弧を消したり足したり出来ない気がするので、何かの拍子に括弧の対応が崩れるとそれを修正するのがめんどくさい*4

勿論逆に Emacs ユーザーから見た「あ、この機能いいなぁ」というのもちょくちょくあって、 Java のコードに到達したときにソースがなくてもデコンパイルした結果が見れるとか、ソースをダウンロードしてそっちを代わりに表示出来るとかいいなぁと。あと、特別な設定しなくても補完がほぼ完璧に効くのは良かった。デバッグ機能もちらっとしか触ってないので評価しにくいですけど、昔 Java 書いてたときみたいにグラフィカルに触れるのはいいなぁと。

Remote REPL に接続して開発出来るので今のところ Boot 使っている場合はそっちで対応する必要があります*5。まぁ仕事で使ってますが、あまり困ってないですね*6

まとめると Emacs の自由さは最強だと思うんだけど、 IDEA の簡単に色々出来ちゃう便利さはそれはそれでとてもいいので、このふたつを組み合わせた何かがあったらいいのになー*7

反省点

割と IntelliJ とか Clojure とか知っている体で話してしまったのはまずかったかなーと後で反省。あと、ちょっとテンパってデモの中で文字を大きくするの忘れてた。話し方も下手なのでもう少しちゃんと落ち着いて話したい。

余談

スライド中の IDEA のスクリーンショット途中から Macインターフェイスから StumpWM なインターフェイスになってますが、理由はあまりにも Macキーバインドが使いにくかったので諦めて普段の開発環境使ったというだけです。

余談 2

Scala 使ってる人で、「人類には早すぎた」って言ってる人 Clojure やりませんか?と思ったりした。

余談 3

ビズリーチ良いとこだった。

余談 4

次回は Clojure か ClojureScript の話を真面目にしにいきたい。
「ネタじゃない ClojureScript の話」とか。

残念だったこと


今日会えるのを楽しみにしていたので、残念でした。お大事に…。

*1:年に一度 Kotlin を書く時期に必要になる

*2:2 週間くらい開発のお供にしてた

*3:この機能はオフに出来る

*4:一度その機能をオフにして括弧の対応を揃えてから機能をオンにする必要がある

*5: Cursive 開発チームは Boot まだまだ issue 多いので、それ用の対応する気は今のところなく様子見ぽいです

*6:どちらにしても dev 用に watch タスクも一緒に走らせたいので都合がいい

*7:マテ