F# でテキストエディタ (kilo) を書く
Preview
はじめに
C 言語 約1,000 行で書かれた kilo というエディタがあり、184 のステップからなるチュートリアルをなぞらえることで誰でもハンズオンできます。他言語での記述も比較的容易であり、 Zenn 内でも先駆者様がいらっしゃいます。そんな kilo を F# で書いてみたので所感を綴ってみます🖋️
参考
チュートリアル。懇切丁寧な解説🧑💻
Rust の学習として取り組まれたようです🦀
Go 言語の勉強も兼ねて作られたようです🐹
所感
単一ファイルは辛い😖
外部ライブラリを使わない + 単一ファイルで約 800 行でした。 F# は同一ファイル内に複数のモジュールを定義可能なため、機能面での制約は特段ないのですが、さすがに数百行を超えてくるとあっちこっち行き来するのが億劫になりました……。モード機能や色設定などを追加で盛り込んだことで余計に肥大化した感じですが、コード総量自体は減っているみたいです。
アレンジが楽しい🎨
kilo は Windows のメモ帳に近い様相なのですが、慣れ親しんだ Vim ライクな操作感にしてみたり、チュートリアルでは ASCII のみサポートのところを UTF-8 ベースにして日本語や絵文字にも対応してみたりと、あれこれアレンジしていきました。ほかにもイミュータブルな状態管理をしたりループを for ではなく再帰でまわしたりと、 F# らしさを意識してみたりも。このあたりは使用する言語各々の特性に合わせて書くことで、よりその言語への理解が深まる部分な気がします。好き勝手に弄ったのでオリジナルとは若干毛色が異なっているかもです。
絵文字は複雑🧑🚀
いつの間にかワールドワイドに羽ばたいていた emoji 、華やかだし kawaii ので本稿でも多用していますが、ターミナル上で管理する場合はかなりの曲者でした。絵文字によってバイト数が変わってくるし、合成絵文字やサロゲートペアなどの仕様[1]も相まってカーソル位置や文字数計算などを自前でよしなにするのはかなり骨なので、大人しく外部ライブラリを使うべきですね……。
ANSI エスケープコードへの理解🔤
言わずと知れたターミナル上でのテキストの装飾などに使われる制御コードで、 \x1b[31m
で文字を赤くするといった類のものです。これまでは出力に色をつける程度でしか扱ったことがなかったため、仕様についてしっかりと触れる良い機会になりました。エディタ画面の描画やカーソルの形状変化など初めて使用するものがあったり、愚直に乱用するとパフォーマンスが悪くなったりちらつきが発生して一筋縄ではいかなかったりと、なかなかおもしろいです。たとえば .NET には標準でマウスカーソルの位置を設定する System.Console.SetCursorPosition
が存在しますが、今回は ANSI エスケープコードの出力により移動を表現するなど、 kilo に寄せた書き方をしてみました[2]。
実用性はない🦠
アンドゥ / リドゥ未実装、複数バッファ非対応、絵文字表示が不完全、ハードコーディング多数、などなど挙げればキリがないのですが、終わりがみえなくなりそうな予感もするので一旦はチュートリアルを終えたことで良しとします。あらためて既存のエディタ群がいかに作り込まれているのかを実感させられました。
車輪の再発明は良い🛞
とはいえ既存のプロダクトを模倣するいわゆる車輪の再発明も、初学者や他言語の導入における学習教材としてはかなり優秀な気がしています。新しく言語を学習するケースでも、その言語の特性やメリットを考えながら手を動かすことは体系的な学習への糸口となりますし、 (挫折しなければ) 約束された成果物という成功体験はモチベーションの維持・向上において非常に大きなメリットになり得るはずです。
フォント紹介🅰️
冒頭のプレビューで使用しているフォントは 『マルミーニャ』 というピクセルフォントです。0 (ゼロ) と O (オー) の見分けがつかないためプログラミング向けではないかもしれませんが、可愛くて日本語対応なので私は気まぐれで使っています。
おわりに
古式ゆかしい C 言語でも、気にあっているあの言語でも、譲れないこの言語でも、ぜひあなただけの kilo を書いてみてください🌙
Discussion