Common Lisp 漢数字プリンタの試みのメモ
Common Lisp の format で漢数字を出すという遊びをしているのだけれど、ちゃんとやろうとすると意外と面倒で困ったので、いくつかメモ
文字エンコーディング
1020 を示す "𥝱" という文字が、 Unicode で U+25771 という位置にある。 Unicode の BMP の外になってしまってとても面倒。
互換性を確保するためには、文字(列)リテラルとしての表記はあきらめて、何らかの方法でバイト列にエンコードして、それを読みこむようにせざるを得ない。 Common Lisp の babel を使うことになる。
すると 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 っぽいことに起因してる。自前で変換した。
字体
「一」の代わりに「壱」とか。フラグで対応した。
負の数
出力にアタマに何を付ければいいのかが曖昧。
浮動小数点数
「分」とか「厘」とかを使いたいが、浮動小数点数を正確に書き出すのは恐ろしく面倒なはず、なので要調査。