2007年05月10日

私も不安ですが、生きていますの報告と、久しぶりに触った camomile のお話

久しぶりに書くのがこういうことなのはいいことなのかどうなのか、
は置いておく。
書きたいことは別にもあるような気もしないでもなく。

- / - / - / - / - / - / - / - / - / - / - / - / - / - / - /
http://camomile.sourceforge.net/index.html.ja.jis
変態オコジョではなくて、文字コードごにょごにょライブラリの話。

しばらくO'Caml でCGIを書きたい熱から離れていたので、
0.7.* になっていたことには気づかずに。

なんとすばらしいことに、
> 2006/08/14 Camomile 0.7.0がリリースされました。
> README これまでハードコードされていたデータファイルのディレクトリがファンクターにより変更できるようになりました。
だそうで。
レンタルサーバーみたいなところに設置するケースを考えて、
可搬性を持たせるために、
$ ./configure --datadir='./camomiledata'
みたいなことをしていた私としては大歓迎であります。

というわけで、早速 configure & make
……

- * - make 時の出力 ここから - * - * - * - * - * -
(前略)
cc -E -P -I -I internal -I public -I toolslib -I . -o public/main.ml -x c public/main.mlp
In file included from public/main.mlp:10:
public/iMap.mli:8:13: missing terminating ' character
(中略)
public/uText.mli:51:35: missing terminating ' character
public/uText.mli:67:29: missing terminating ' character
In file included from public/main.mlp:46:
public/xString.mli:33:29: missing terminating ' character
make: *** [public/main.ml] Error 1
rm internal/uReStrParser.ml
- * - make 時の出力 ここまで - * - * - * - * - * -

……あれ?
というわけで、
public/main.mlp から public/main.ml を生成するときに
cc -E を使っているようですが、
ソースコードは C言語じゃあないので、
プリプロセッサに怒られています。

main.mlp をみるに、大げさなことをしているわけではなく、
各 module をinline展開させているだけなので、

# 話は少しそれますが、module の相互関係がよく設計されています
# 最近研究室でそういう話をしていたので、
# signature が気になったりしました。 fibration 万歳!
# ……実例を見ると、やっぱりあまり、気持ちよくはないなぁ

- * - preproess_cheat.pl ここから - * - * - * - * - * -

#!/usr/bin/perl
use strict;

while(my $line = <STDIN>){
if($line =~ /#include +"(.+)"/){
for my $cand ('internal/'.$1,
'public/'.$1,
'toolslib/'.$1 ){
if(-e $cand ){
system('cat '.$cand);
last;
}
}
}else{
print $line;
}
}

- * - preproess_cheat.pl ここまで - * - * - * - * - * -

なんてものを用意して、
$ perl preprocess_cheat.pl < public/main.mlp > public/main.ml
でごまかしてみました。
これでまあ一応ビルドできるわけです。

make が走り始めてすぐに、module Main を使わないなら、
Makefile から main 関連を削ればよかったのかも、とも思いましたが、
結果が cc -E が動いたときと同じになるはずなので、
こっちの方が真っ当でしょう。

楽だし(笑

- / - / - / - / - / - / - / - / - / - / - / - / - / - / - /
open CamomileLibrary

さて、
module CharEncoding の設計に変更が入っているようで、
functor Make に代えて、
データディレクトリに関する設定を受け取って、
以前の CharEncoding 相当の module を作る
functor Interface が実装されています。

また、ハードコードの設定を用いる、
以前の CharEncoding 相当の module が Default.Camomile.CharEncoding として
用意されています。

# README には Main.Camomile と書かれているのですが
# どうやら、Default.Camomile だと思います。

- * - こんなかんじ ここから - * - * - * - * - * -

open CamomileLibrary

module Hard_coded_Istr =
Default.Camomile.CharEncoding.Make(UTF16)

module Config =
struct
let datadir = "./camomile/database"
let localedir = "./camomile/locales"
let charmapdir = "./camomile/charmaps"
let unimapdir = "./camomile/mappings"
end

module CEInterface = CharEncoding.Configure(
struct
let datadir = "./camomile/database"
let localedir = "./camomile/locales"
let charmapdir = "./camomile/charmaps"
let unimapdir = "./camomile/mappings"
end
) (* or CharEncoding.Configure(Config) *)

module Istring = CEInterface.Make(UTF16)

- * - こんなかんじ ここまで - * - * - * - * - * -
# ほんとは Main.Make を使う方が想定された使い方なのかも
# でも、Main って名前は衝突しやすいし、ちょっと変な気もする。
# CamomileLibrary.Make(Config : ConfigInt.Type)
# と
# CamomileLibrary.Default
# みたいな並列のほうが私には直感的な気がする。
# signature の fibration も少しは気持ち悪くなくなるかも?(ぉ

## O'Caml の module 設計ではどういうやり方が主流なのかなぁ。
posted by Hacky=SugarSun at 05:20| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。