(define -ayalog '())

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

第 3 回かわいい Kotlin 勉強会で LT してきたよ #jkug

だいたい Kotlin の話してきました(嘘です、ごめんなさい)。

Twitter の TL 見ていると「殴り込み」とか「天下一 JVM 武闘会」とか言われてました。まじすまんかった。togetter.com

話した内容とか

タイトルはハッカーと画家の中で書かれている言葉をちょっと借りて最終的には Clojure から Kotlin を使うっていう話をしただけです。元々一ヶ月前にこのスライドも作り終わってて準備万端だったんだけど、話を貰ったタイミングでは何を話そうか迷っててスライドの中にある通り以下のようなものが候補に上がってた。

  • Clojure で Kotlin をパースする

これは昔 Emacs 用の kotlin-mode を作ったときに、そもそも正規表現でパースするのがしんどすぎたっていうだけなんですけど、 Kotlin って元々 BNF で言語の文法を定義していてそれを公開しているんですよね。
Grammar
なので、これを元にパースしたら一番正確だし楽だよね、って思ったのとちょうど Clojure に instaparse っていうライブラリがあって、これは BNF 情報を元にパーサーを定義出来てパース出来るという代物なんだけど、いい感じに出来そうじゃね?って思ったのでやろうと思った。
Engelberg/instaparse · GitHub
けど、思いの外、 BNF の定義が単純コピペで使えなくて例えばこんなん

RegularStringPart (used by stringTemplateElement)
  : <any character other than backslash, quote, $ or newline>
ShortTemplateEntryStart:
  : "$"
EscapeSequence:
  : UnicodeEscapeSequence | RegularEscapeSequence
UnicodeEscapeSequence:
  : "\u" HexDigit{4}
RegularEscapeSequence:
  : "\" <any character other than newline>

< any character other than newline > とかがちょいちょいあるので一気に単純置換もできなくて、めんどくさいなーというので途中でやめちゃいました。ちなみに単純にパーサーだけなら昨日書いたけど pygments が対応しています。なので gtags でシンボルタグなら生成出来るのが今ですね。あいにく ctags はなさそうなので、誰か書いてくれると Emacs/Vim ユーザーが歓喜します。

これは上記のが出来ればそもそも「パース出来るか」というところで出来なければ構文に不正があると見なせるので作れるんじゃないかなーと妄想しましたが、流石に時間とモチベーションの都合でやりませんでした。

やっても良かったんですけど Clojure ばっかり書いてて Kotlin ワカンネって思ったのでボツ企画です。

流石にたろうさんに怒られると思ったのでやりませんでした。

同上。

  • Kotlin-mode その後

これ、昨年の発表後からどうなったっていう話ですね。簡単に書いておくと、リポジトリごと消しました。理由として Kotlin を書いてないし、 JetBrains が作った言語だけあって IDE 使えっていう無言の圧力凄くて CLI 周りが全然発達していないので、もう Kotlin 書くなら IDEA 使うのがベターウェイじゃない?って思ったからです。まぁ自分が書いてない言語の mode なんて保守出来ないというのもあるんですけどね。

さて、まぁそんなこんなで今回話したように「 Clojure から Kotlin を使う」という話をしようと思ったわけですね。
今回話をした内容は「 Clojure から Kotlin を使おうっていう発想がやばい」とか言われていたんですが、僕が昔読んだ本で当時それなりに好評価を得ていた「 ThoughtWorks アンソロジー」という本がありそれの影響を大きく受けています。

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

今新品では手に入らないですね。中古も値段高騰しています。もし読みたければ僕が持っているので貸しますが。

さてこの本の中で第 4 章に「多言語プログラミング」という章があります。その中ではこう書かれています。

解決策を 1 つの言語に詰め込もうとしていた日々は、消え去ろうとしています。私たちは、 JavaCLR という優れたマネージド・ランタイムを持っているので、よりよいツールを使ってそれらのプラットフォームを利用するべきです。多言語プログラミングは、重要な仕事をする既存のすべてのコードを捨てることなしに、解決策をミックスし適用することを可能にしてくれます。これらの 2 つの実績あるプラットフォームで、爆発的に新しい言語が開発されています。開発者として、仕事により適したツールを使って、よりよいコードを書くことができるように、この成長を活用する方法を学ぶべきです。
多言語プログラミング/ThoughtWorks アンソロジー

まぁ僕の発表の仕方が悪かったのとスライドもだいぶ Clojure で全力で殴りに行っている感が否めないのであれなんですけど、いろんな言語がひとつのプロジェクトの中にあってそれぞれが相互にコミュニケーション出来るならそれはそれでいいと思うんですよ。だから僕にとってあれは普通だと思うので何もヤバくないです。ふつーです*1。例えば Kotlin を使えば型安全や null 安全という武器を簡単に手に入れることが出来て、 Clojure を使えばイミュータブルな世界を利用した並行/並列に有利なプログラムが書けると思うのでそういう道もあるのかなーと思ったりしながら今回書いたりしました。ついでに言うなら Clojure も Typed Clojure ってあって静的な型付けを手に入れることは出来るんですが…。

感想

同じ発表者である むろほしさん*2と少しお話していたんですが、完全に Kotlin が Android の人のための言語になってしまったんだなーという感じがあってちょっとさみしいなという気持ちがしました。たぶん 2 年くらい前僕が初めて書いたときくらいは僕みたいな「言語スキー」が好奇の目で見ているか、たろうさんみたいな熱狂的なファンが触っているかくらいだった気がしますが、ここ半年くらいからこっちはずっと Android 一色だなーと。なので、たぶん今回の発表も前回の勉強会であれば受け入れられたんだと思いますが、 Android 使いのための勉強会みたいな感じになってて完全にお呼びでない感あったなと*3

あと勉強会自体は悪くなかったんですが、発表者が変わる間の時間っていうのがタイムテーブル上存在してなかったので、ちょっとドキドキしましたね。発表者によって多少準備に時間がかかるとかあるかもしれないですし、その準備も与えられた時間内でやれっていうんだったらあれですけど、それだと話す時間が短くなるのでちょっと考えて欲しかったなーくらいです*4。夜だというのと懇親会までやるなら詰めるのが吉だったんでしょうけどね。

余談

懇親会ではそれなりに Clojure に興味持っている人がいることがわかったので良かったです。あともし Clojure に興味あるなら適当に僕にコンタクト取ってくれると、多少は教えることが出来ると思うし、弊社 Clojure 書きたい出来る人募集中です、よろしくお願いします。

*1: Clojure 推しすぎたのはごめんなさい

*2:@

*3:良いとか悪いとかじゃなくて素直な感想

*4:発表者が時間内に発表しきらないこともあるでしょうしクッションとなる時間はあったほうがいいと思う