y2q_actionman’s ゴミクズチラ裏

内向きのメモ書きを置いてます

Common Lisp 漢数字プリンタの試みのメモ

Common Lisp の format で漢数字を出すという遊びをしているのだけれど、ちゃんとやろうとすると意外と面倒で困ったので、いくつかメモ

github.com

文字エンコーディング

1020 を示す "𥝱" という文字が、 Unicode で U+25771 という位置にある。 UnicodeBMP の外になってしまってとても面倒。

互換性を確保するためには、文字(列)リテラルとしての表記はあきらめて、何らかの方法でバイト列にエンコードして、それを読みこむようにせざるを得ない。 Common Lispbabel を使うことになる。

すると babel にあった悲しみを踏むことになった。

  • babel:octets-to-string は、 element-type が (unsigned-byte 8) でないとエラーを吐く。配列リテラルで埋めこもうとすると型がこれにならない。 #. の read-time eval でごまかす。
  • babel:string-to-octetsは、 CESU-8 相当の、サロゲートペアをそのまま UTF-8 にしちゃったバイト列を出してくることがある。逆変換するとエラーになるというナメた仕様。たぶん、 Allegro CL の文字が内部的に UTF-16 っぽいことに起因してる。自前で変換した。

字体

「一」の代わりに「壱」とか。フラグで対応した。

負の数

出力にアタマに何を付ければいいのかが曖昧。

浮動小数点数

「分」とか「厘」とかを使いたいが、浮動小数点数を正確に書き出すのは恐ろしく面倒なはず、なので要調査。