• 作成:
  • 更新:

OCamlをテキスト処理のために使ってみました

欲しかったもの

KEINOS/google-ime-user-dictionary-ja-en: ✅GoogleIME用カタカナ語辞書プロジェクトのアーカイブです。Project archive of Google IME user dictionary from Katakana word ( Japanese loanword ) to English. を追加してみたら短い文字が鬱陶しかったので読みが1文字の単語を消したかった.

こういう小さなスクリプトを書く時こそ今まであまり触ったことのない言語を体感するチャンスなのでOCamlを使うことにしました.

Reasonはちょっと触ったけどOCamlは実はろくに触ってなかったので.

書いたもの

getContentsがない

HaskellのgetContentsに値するものが見つからない.

まあこれは普通の言語だと当たり前のことで, 標準入力を全部読み込ませてしまうとパイプの利点が活かされにくいからでしょうね. HaskellのgetContentsが遅延になるのもunsafeのおかげですし.

letで複数定義できない

letで複数の変数を定義できないのでlet inを繰り返す必要があります. まどろっこしい.

しかし非純粋の言語だから順序を意識させた方が良いのかもしれません. それにRustと同じくインデントセンシティブな言語ではないのでよく考えてみると他に手段はないですね.

無引数アクションにUnitをいちいち渡す必要がある

非純粋の正格言語なので仕方がない.

標準で文字数を取得できない

# String.length "あ";;
- : int = 3

になってしまいます.

うーんこの2020年に実用的な汎用言語なのに標準ライブラリでUnicode処理が出来ないのは苦しくないですか.

まあ外部ライブラリを使えばもちろんカウント可能です. yoriyuki/Camomile: A Unicode library for OCaml を使うためにopamをセットアップしてライブラリをインストールしたのですが, Error: Unbound module CamomileLibrary と言われ続けて何もわからなくなりました. 最終的に#use "topfind"と書けば読み込めることがわかりました.

StackやCabalと違ってopam自体がexecするようなことは想定してなくて, ocamlコマンドはあくまで独立しているからパス探索も独立しているんですかね.

真面目にやるならtuaregを使った方が良さそう

今回は雑に触って見るだけなのでcaml-modeを使いましたが真面目にocaml書くなら当然ですがtuaregを使った方が良さそうですね. caml-modeはREPLとの連携機能とか全然ないどころかなんかコマンド指定ミスってたりしてるので.

lsp環境がよく分からない状態になっている

LSPサーバにはocaml-language-serverを使いました. 構文エラーやopenの失敗などコンパイル時にエラーになるものもflycheckに出してくれない(構文エラーは出してくれる時もある)一方で, 補完はサクサクと行われたりどこかちぐはぐな印象を受けました.

TypeScript実装だからですかね?

補完に間してはグローバル空間に関数がドバーッとimportされるHaskellに比べればどこもサクサクなのかもしれませんが.

補完にはLSP使うか直にmerlin使ってflycheckのバックエンドには flycheck/flycheck-ocaml: OCaml support for Flycheck using Merlin とか使った方が良さそうですかね.