Kakau で Lisp コードを書いてみる

Posted on June 29, 2021

(仮称 Lattic の正式名称が Kakau に決まりました。)

今回は半分ネタです。 Kakau を使ってコードを書くとどんな感じになるか気になったのでやってみました。言語はなんでも良かったのですが、構造化エディタの歴史に深い関わりのある Lisp を選択しました。まずはスクリーンキャプチャをどうぞ。1

完成形のイメージは以下になります。

何をやっているか簡単に説明します。構造の操作に使っているキーは Enter, Tab, Shift+Tab, Ctrl+i の4つです。最初の3つはそれぞれ、改行、インデント、アンインデントを意味し、通常のアウトラインエディタと同じように動作します。最後の Ctrl+i は、(正確性を犠牲にして言えば)横方向版の改行です。これは他のエディタには存在しない Kakau 特有の操作です。

式を書く際は、Ctrl+i(横方向版の改行)と Enter(通常の改行) のどちらを使うかその都度選択しながら書いていきます。たとえば、

(or (= n 0) (= n 1))

のように一行に収めたいときは Ctrl+i を使い、

(+ (fib (- n 1))
   (fib (- n 2)))

のようにパターンを表現したいときは Enter を使う、という具合になります。

経験上、 Ctrl+iEnter を使い分けるには相当な慣れが必要です。そこで「アウトラインビュー」という機能を提供しています。この機能を使えば、 Ctrl+i で作ったノードも「行」として表示・編集できます。上記の完成形をアウトラインビューで表示すると以下のようになります。

ちゃんと構造化されていることがわかります。2ちなみに、 (defun fib (n)fib(n) を二段インデントしているのは、それらが関数定義本体と揃うのを避けるためです。一方、 (if (or (= n 0) (= n 1))(or (= n 0) (= n 1)) は一段インデントなので then, else に揃っています。

最近はコードフォーマッタが主流になりつつあるようです。コードの見た目を手で調整するのは時代遅れなのかもしれません。しかしながら、だいぶ端折りますが、コードフォーマッタを利用する場合でも、複雑な見た目を制御可能にするには制御文字の拡張が不可欠です。そしてそれは Kakau が本質的に先取りしているものです。 Kakau によって、コードのみならずさまざまな表現の見た目が現実的なコストで制御可能になったのは、歴史的に見て非常に意義深いことではないかと考える昨今です。


  1. ビュレットポイントや括弧は適宜無視してください↩︎

  2. 小さなレベルで構造化されていないのは気にしない約束↩︎