octahedron

LemとSKKとCommon Lispでたたかうプログラマのブログ

Rosaに謎のシリアライズ機能が登場

 先日こんなものが完成しました。

octahedron.hatenablog.jp

 まあ用途や有用性の不明な、なんだかよくわからんプロジェクトだとぼく自身も思うわけですが、なんなんでしょうね(ぼく自身ではわりと使ってます)。

Rosaについて

Rosaとは

 文字列に名前を付けて、それをプレーンテキストで表現できる言語です。そして、それをパースするライブラリ・コマンドでもあります。

 機能の弱いJSONとかYAML、のような感じと見做すこともできるかもしれません。
 「タイトル」「著者名」「更新日付」「本文」「あとがき」などのテキスト情報をひとつのファイルに、人間が書きやすい構文(=インデントや妙な括弧がない)で書き表せる言語です。小説とかブログの一記事とか、そういうのを一ファイルで書くのに使おうと思ってつくりました。

 ちなみに、中のテキストのマークアップは感知しないので、別の言語(Markdown、reStructured text、あおぞら文庫形式)を選択できます。というかしてください。

Rosaでパースしたテキストデータ

 Rosaで定められた形式で、key-value的なデータを表すことができます。たとえば、ポケモンとその登場作品の対応、とか。

CL-USER> (setf pokemon "
:diamond-pearl ブイゼル
:sun-moon モクロー
:sun-moon クワガノン")
CL-USER> (with-input-from-string (in pokemon)
           (rosa:peruse-as-plist in))
(:|diamond-pearl| #("ブイゼル")
 :|sun-moon| #("モクロー" "クワガノン"))

テキストをパースすると、rosa:peruseでハッシュテーブル、rosa:peruse-as-plistでプロパティリストになります。これから所望のデータを抜き出して、wc -mするもよし、grep -n hogeするもよしです。

謎のシリアライズ機能 (new!)

 それでとりあえず何が増えたのかというと、ハッシュテーブルやプロパティリストを与えると、それを表現するrosaの文字列に変換する関数が増えました!

CL-USER> (with-input-from-string (in pokemon)
           (rosa:peruse in))
#<HASH-TABLE :TEST EQL :COUNT 2 {1002956813}>
CL-USER> (with-input-from-string (in pokemon)
           (rosa:indite (rosa:peruse in)))
":diamond-pearl ブイゼル
:sun-moon モクロー
:sun-moon クワガノン
"

 それだけです。やったぜ。

 いったいどんなユースケースあるのかは謎ですが、おもしろかったので実装しました。

おもしろいなと思ったこと

 peruseinditeの対が、マセマティカル・モルフォロジーにおける膨張と侵食の関数みたいに、随伴っぽい関係になっているなあ、とふと気づきました。

 まとまっていないし、検証も証明もされていないけど、おもしろげであると思ったことをざっと列挙

  • peruseinditeを使うと、二つの領域(文字列、ハッシュテーブル)を行き来できる
    • peruseすると、文字列はkey-valueなデータに写される
    • inditeすると、key-valueなデータはrosaの言語に写される
  • (indite (peruse in))という関数(モルフォロジの閉包作用素っぽい)を考えると、これは冪等っぽい
  • どんなテキストファイルでもperuseによりrosaの言語の世界に引き込むことができる
    • あとはinditeperuseで二つの領域をぐるぐるする

 なんとなく類似を感じた概念等はこちらの本の6章を参照のこと: 『非線形画像・信号処理  (モルフォロジの基礎と応用)』。

おわりに

 大学で学んだ抽象的な概念がこのような形で姿を見せるとは、学問とはおもしろいものだなあと思った。