CHISE_Value (Re: chise_swig_perl)

守岡知彦 / MORIOKA Tomohiko tomo @ kanji.zinbun.kyoto-u.ac.jp
2006年 11月 30日 (木) 00:10:50 JST


>>>>> [chise-ja : No.00515] にて
>>>>> KAMICHI Koichi <kamichi @ fonts.jp> さま曰く:

> この1ヶ月間、守岡さんとやり取りをして、libchiseのPerlバインディング
> (chise_swig_perl)をCygwinで再びビルドできるようになりました。(libtool
> を使うようになったlibchiseとconcordをCygwinでビルドできなくなったため放
> 置していたのですが、できるようになりました)

> 詳しくはこちらをご覧ください。
> http://fonts.jp/chise_swig_perl/

ぱちぱち。

上地さんの Cygwin での知見は一般化できるような気がするので、concord,
libchise の installer にも取り込めるようにしたいと思います。


> そこでchise_swig_perlの今後としては、ラッパーライブラリ(chiseperl.pl)
> の整備が必要ということで3つ考えています。

> ・基礎関数の整備(chise.hに記述される主な関数を網羅する)
> ・応用的な関数を用意する。もともとのPerl/CHISEに追いつく
> ・モジュール化

> やっとlibchiseの大枠が見えてきたところで、すでに整備されているPerl/CHISE
> をlibchise化する(モジュールの書き方も理解する)作業がイメージできるよう
> になり、すこしやる気が出てきました。

Emacs Lisp と同等(以上)の機能が実現できそうですね。


> ところで、chise.hのなかの「CHISE_Value」について、よくわかっていません。

> static inline int chise_ds_load_char_feature_value
> int chise_char_load_feature_value
> int chise_feature_load_property_value

> これらの関数で使われるCHISE_Valueとは何でしょうか?文字列データの抽象ク
> ラスのような気がしますが、unsigned charを用いる関数との関係を教えてくだ
> さい。

素性値を格納するための型で、現在の実装ではその実体は Berkeley DB の
DBT です。

;; ちなみに、CHISE_Value* = CONCORD_String です。

素性値を抽象的に扱いたい気持と、メモリー管理やコピーを避けたい気持が相
反する訳ですが、とりあえず、抽象化された CHISE_Value* 型のデータをアク
セス関数を介して操作するという方式にしとけば、高レベルのアクセス関数を
用意することで、拡張も可能になるかなあという意図でこうなってます。

;; 将来、Berkeley DB 以外のバックエンドが登場した時に、
;; CONCORD_String_Tank の実装が変わっても、API/ABI を変更せずに済むよ
;; うにしたいという意図もあります。

CHISE_Value の実体は不定長の byte 列なのですが、Pascal 式文字列のよう
に、byte 長 + 0 が終端とはいえない byte 列になっています。

そういう訳で、C の文字列にするには chise_value_size で長さを得て、
chise_value_data でポインターの先頭位置を得て、バッファーにコピーする
必要があります。

;; chise_value_to_c_string は、素性値が C の文字列であることが判ってい
;; る場合にしか使えない手抜き関数なので、使わない方が良いです。
;;; Concord ではこれに相当する関数は止めてしまいました。


また、get 系関数には CHISE_Value* に格納する
chise_char_load_feature_value の他に、chise_char_gets_feature_value が
ありますが、これは大きさが size である unsigned char* 型のバッファー
dst に C の文字列として格納する関数です。なお、素性値の長さが size を
越えた場合は処理は失敗します。また、素性値の途中に \0 があった場合、そ
こでデータはちょん切れてしまいます(現在の所、途中に \0 がある素性値を
書くことは原理的に可能(特に escape はされない筈)なので、C の文字列で
ある保証がない場合は gets 系関数の利用はお勧めしません。


ところで、言語処理系等での parser(Lisp の read 等)と失敗を表すオブジェ
クトを chise_ds_set_read_object_function, chise_ds_set_object_failure 
で登録しておけば、chise_char_read_feature_value で対象アプリケーション
でのオブジェクトを返すことができます。

;; この方式が良いようなら、シリアライザー(Lisp の print 等)も登録で
;; きるようにして、set 系も付けたいと思います。

-- 
┯━…‥・懐かしい未来の記憶をふと思い出しかけた・‥…━━┯━━━┯━
││ ─ │  ─  /    ─   ┼─     ┬                ─   ─┼ ┬┴─
┼┼─┼|〓━─┼ 守岡 知彦 (MORIOKA Tomohiko) <tomo @ m17n.org> ─ ─┬
┻┻━┻━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━




More information about the CHISE-ja mailing list