005 '98,5 Mule上の、Roget Thesaurusが、WIN95/NT上で動かない


患者・症状:日本のエディターは、やはりスペルチェック・Thesaurus(同意・反意語辞典)と連動している物が少ない。その点、Muleは両方あり、英文を作るときにはやはり便利。で、最近、Mule for WIN32が安定してきたので、WIN95とかNTに導入。Spell Checkは無事動作した。が、Perlのスクリプトを使う、Roget Thesaurusは、これも、最近安定してきたPerl for WIN32を入れても動作しない。

Debug:まずは、Perlのスクリプトは、UNIXと違いそのままでは、 WIN32上では、実効形とみなされない。(#! /xxx/xxx/perl が効かない)。で、次の様な バッチを作る。(th.bat)
(もちろん、その前に、perl.exeのパス、このth.batのパスを設定しておく。perl の read.me では、pl2batなるツールがあるとのことだが、最新のdistribution setは無かった)

@echo off
perl e:\usr\local\lib\roget\thr.pl %1 %2 %3 %4

で、これを、MuleのLISP スクリプト、thesaurus.el が呼ぶ。
(defvar thesaurus-program "th"
"This is the name of the program that extracts data from the thesaurus. Some sites may have to give a full path name here.")

で、WIN95の場合ここは問題ない。引数等も無事渡っている様だ。
Perlのスクリプト、thr.pl (もともとは、th.plだが、revisedと言うので、r をつけた) が問題。デバッガーをあげて、がたがたやった。で、トラブルは、hashを使ったindexingがちゃんと動作してないようだ。この為のバイナリーファイルが、offsets.dir offsets.pag で、まずは、このファイルを作る別のスクリプト、buildoffsets.plを、perl for win32 で走らせてみると、unixでのファイルとサイズが違う。で、作り直した物で、動作させると、それでも何かおかしい、どうも、cr/lfでカウントが変る様である。時間がかかったが、結論を言うと、2個のtext file である、辞書ファイル(roget.txt)、Indexファイル(word_index)を、バイナリーファイルで開く事で解決。(buildoffsets.pl thr.plともに)

(buildoffset.pl)
open (INPUT, "<$thesaurus") || die "Can't open \"$thesaurus\": $!\n";
# ADD for WIN32
binmode ( INPUT );

(thr.pl) open (INPUT, "<$thesaurus") || die "Can't open \"$thesaurus\": $!\n";
open (WORDS, "<$word_index") || die "Can't open \"$word_index\": $!\n";
# ADD for WIN32
binmode( INPUT); binmode(WORDS );

途中、perl5では、使わないほうが良いという、dbmopenを、tie(use sdmfile)に変えたが、 これは、関係なく、両方で動作。


が、NT4.0では、このままでは、動作しなかった。どうも、shellを介してのBAT ファイル の引き数の癖が違う。しかも、LISPからの実効形にパスが効かないのと大変。
なんとか、動作するようにしたが、良く見ると変数の渡りがまだ変。

[まず、thesaurus.elで、\の代わりに\\にフルパスでth.batを指定、しかも、最後に、空白が必要]
(defvar thesaurus-program "c:\\xxx\\yyyy\\th.bat "
"This is the name of the program that extracts data from the thesaurus. Some sites may have to give a full path name here.")

次に、これを起動するところ、このままでは、引数がぐちゃぐちゃになるんで
(start-process "thesaurus" thesaurus-buffer thesaurus-program "-W" word)
(start-process "thesaurus" thesaurus-buffer thesaurus-program "-V" word)


(start-process "thesaurus" thesaurus-buffer thesaurus-program (concat "-W " word))
(start-process "thesaurus" thesaurus-buffer thesaurus-program (concat "-V " word))

のようにする。あと、何個所かあるので同様。
NTの方は、会社なので、記憶違いがあるかもしれない。