ADT!ADT!
公式サイトにある日本語の『OCamlチュートリアル』と、本としては『プログラミング in OCaml 〜関数型プログラミングの基礎からGUI構築まで〜』、という順番で読んだはず。本は延べ2.8周分ぐらい読んでそう。あんまりWebで読み物を読んでいないので珍しい感じ。
本を買って1年後ぐらいに、OCamlでCコンパイラを書き始めたり、TaPLを読み始めたり。普段はIntelliJファミリーかXcodeという生活だから何で書くか迷うことはないんだけど、OCamlはどうしていいか分からなくて、まずはIntelliJでReasonMLのプラグインを使うことにした。生活のメインマシンはWindowsなので、以下の構成で始めてみた。
| エディタ | ソースコード管理 | ビルド、パッケージ管理 |
|---|---|---|
| IntelliJ (ReasonML Plugin) | git | bash, opam他 |
| Windows | Windows | Ubuntu on WSL |
Qiitaに記事を書いてみたら、ocaml intellij wslでググると検索TOPに出たのでびっくりした。今も出る。完全に忘れてたけど全部bash経由で動かすんだね、なるほど。たしかCLionはsftpか何かでWSL側のCMakeその他と通信してたけど、汎用的な仕組みとしては公開されてないみたいだからOCamlでは諦めてWSLのbashを使ったんだった。ガチ勢は何を使うんだろう。別の勢力であるはずのReasonML勢も主流派が何を使ってるか分からないけど、そっちはVSCodeというのはありそうね。というわけで、割とすぐ次の構成に移った。
| エディタ | ソースコード管理 | ビルド、パッケージ管理 |
|---|---|---|
| VSCode (ReasonML Plugin) | git | bash, opam他 |
| Windows | Ubuntu on WSL | Ubuntu on WSL |
たしか補完とフォーマットをもうちょっと良い感じにするためにocp-indentを使いたいのが背中を押したんだったかな。VSCodeのWSLサポートが便利すぎて辛い。WSL2はまだ試してない。
書き始める前は、OCamlって構文が気持ち悪いと思っていて、F#はそこが完全に気持ちよくて感動してたりしたんだけど、書いてたらOCamlに慣れてしまって、何が気持ち悪かったのか思い出せない。最近は、シャドウイングできるのにlet ~ inじゃないRust気持ち悪い、みたいな偏見とともに生活してます。これもちゃんとRustを勉強して書けば慣れてしまいそう。そういやセミコロンなしの言語も嫌いだったのに慣れてしまったね。こういう体感の変化がプログラミング言語だと割と簡単に起きるのが楽しいね。
冒頭の話に戻ると、SwiftとかKotlinでADT的なものは書いてたはずだけど、OCamlのヴァリアントに出会ってから完全に蝕まれてしまった。Twitterその他の記録を漁っていたら、これはOCamlというよりむしろ『プログラミング in OCaml』のヴァリアントの章その他を繰り返し読んだ影響な気がしてきた。影響そのものが何だったのかも改めて考え直さなきゃ。
(OCamlで)Cコンパイラを書いてたときの一番の印象は、(OCamlの)コンパイルエラーが全然分からないということ。推論させればいいってもんじゃないな、という通過儀礼みたいな気持ちになった。文法が分かってくると変なところで間違えないからそういうことは減っていくかと思いきや、えいやと全体に関わる修正するときにコンパイルエラーの出てる場所もメッセージも頼りづらかったり、調子に乗って4つも型変数を持ってるヴァリアントの修正に泣いたり。そういうことにならないように書くのが正しいんだろうけど、おおきな絵の描き方が分からないな。これは単にGUIアプリケーション以外の経験が少なすぎるだけかもしれない。