KLIC述語マニュアル


klitcl_init -Stream
□ 機能
klitcl の初期化を行う
□ 引数
出力引数 Stream に、klitcl との通信に用いるストリームが返る。
□ 内部処理
klitcld との通信に用いる UNIX Domain Socket を開くと共に、シグナルハンドラを定義している。
□ 注意事項
一般に、ここで得られたストリームにユーザが直接文字列などを単一化することはない。

tcl_init +InStream -OutStream
□ 機能
klitcld の保持する Tcl インタープリタの生成を行う。
□ 引数
入力引数 InStream には、klitcl_init により得たストリームを指定する。tcl_init 処理が終了した後のストリームが、出力引数 OutStream に返る。
□ 内部処理
klitcld に、Tcl の初期化を指示するためのコマンド文字列を送っている。
□ 使用例
main :- klitcl:klitcl_init(S1),
        klitcl:tcl_init(S1,S2),
          :
          :
tcl_init 以後、klitcl 述語にストリームを渡すときには、S2 を渡すようにする。
klic の引数対の機能を用いて以下のように書くこともできる。
main :- klitcl:klitcl_init(S),
        klitcl:tcl_init-S,
          :
          :
□ 注意事項
klic ユーザプログラムから Tcl の機能を用いる際には必ずこの述語を呼ぶ必要があるが、Tk の機能もあわせて用いる場合の初期化には、この述語ではなく tcltk_init によること。

tk_init +InStream -OutStream
□ 機能
Tk メインウィンドゥの生成を行なう。
□ 引数
入力引数 InStream には、klitcl_init により得たストリームを指定する。tk_init 処理が終了した後のストリームが、出力引数 OutStream に返る。
□ 内部処理
klitcld に、Tk の初期化を指示するためのコマンド文字列を送っている。
□ 注意事項
この述語は、一般にユーザにより呼び出すことはせずに、初期化は tcltk_init によること。

tcltk_init +InStream -OutStream
□ 機能
klitcld 内部の Tcl/Tk の初期化を行なう。
□ 引数
入力引数 InStream には、klitcl_init により得たストリームを指定する。tcltk_init 処理が終了した後のストリームが、出力引数 OutStream に返る。
□ 内部処理
tcl_init と tk_init を(この順番で)両方呼んでいる。
□ 使用例
main :- klitcl:klitcl_init(S1),
        klitcl:tcltk_init(S1,S2),
          :
          :
tcltk_init 以後、klitcl 述語にストリームを渡すときには、S2 を渡すようにする。
klic の引数対の機能を用いて以下のように書くこともできる。
main :- klitcl:klitcl_init(S),
        klitcl:tcltk_init-S,
          :
          :
□ 注意事項
klitcl を用いる際の初期化は、基本的に、klitcl_init と tcltk_init によること。

tcl_eval +Command -Result +InStream -OutStream
□ 機能
Tcl のコマンドを評価し、結果を返す。
□ 引数
入力引数 Command は、評価すべき Tcl コマンドである。出力引数 Result は、その評価結果の文字列である。InStream, OutStream は、klitcl_init により得たストリームである。
□ 内部処理
Commandにより与えられた Tcl コマンドを klitcld に送り評価させ、その結果の文字列を (klitcld 内で保持されている interp->result) klitcld より受けとって Result に単一化している。
□ 使用例
main :- klitcl:klitcl_init(S),
        klitcl:tcltk_init-S,
        klitcl:tcl_eval("label .l -text Test",Res1)-S,
        io:outstream([print(Res1),nl]),
        klitcl:tcl_eval("pack .l",Res2)-S,
        io:outstream([print(Res2),nl]),
          :
          :
これは、wish において以下のコマンドを実行することと、ほぼ等価である。
% label .l -text Test
% pack .l

tcl_evalfile +FileName -Result +InStream -OutStream
□ 機能
Tcl のスクリプトファイルを評価する。
□ 引数
入力引数 FileName は、評価すべき Tcl スクリプトファイルである。出力引数 Result は、その評価結果の文字列である。InStream, OutStream は、klitcl_init により得たストリームである。
□ 内部処理
FileName により与えられたファイル名を klitcld に送り評価させ、その結果の文字列を (klitcld 内で保持されている interp->result) klitcld より受けとって Result に単一化している。
□ 使用例
main :- klitcl:klitcl_ini(S),
          :
        klitcl:tcl_evalfile("foo.tcl",Res)-S,
          :
Tcl スクリプトファイル foo.tcl を評価し、結果をRes に単一化している。
□ 注意事項
ファイル名を指定する際、カレントディレクトリは klitcld の実行されたときのカレントディレクトリになる。

tk_mainloop +InStream -OutStream
□ 機能
Tkイベント待ちループに入る。
□ 引数
入力引数 InStream には、klitcl_init により得たストリームを指定する。tk_mainloop 処理が終了した後のストリームが、出力引数 OutStream に返る。
□ 内部処理
klitcld に、Tk_Mainloop 関数を実行するようなコマンドを送り、(次に述べる)tk_wait を呼ぶ。
□ 注意事項
この述語の実行により、klitcld 側はイベント待ち状態になるが、klitcl 側の tk_mainloop 述語は、すぐに戻ってくる。

tk_wait +InStream -OutStream
□ 機能
klitcld 側からの、新たな klic 述語呼び出し要求を待ちうける。
□ 引数
入力引数 InStream には、klitcl_init により得たストリームを指定する。tk_wait 処理が終了した後のストリームが、出力引数 OutStream に返る。
□ 内部処理
ストリームから呼ばれるべきモジュール名および述語名を受けとり、引数をリストにして、実際に述語を call している。
□ 使用例
Tcl側である条件を見たすと(klic main foo が実行されると)、klic述語 foo が呼ばれるときの例である。
main :- klitcl:klitcl_init(S),
          :
        klitcl:tk_mainloop-S,
        S=[].

foo(Args,I,O) :-
          :
         klitcl:tk_wait(I,O).
Tcl 側から呼ばれる述語である foo は、tk_wait で終っている。これにより、次の Tcl 側からのイベントを待ちうける。

tcl_quit +InStream -OutStream
□ 機能
klitcld が保持している Tcl インタープリタを破棄し、klitcl と klitcld 間の通信用ソケットを閉じて、klitcld の実行を終了させる。
□ 引数
入力引数 InStream には、klitcl_init により得たストリームを指定する。tcl_quit 処理が終了した後のストリームが、出力引数 OutStream に返る。
□ 内部処理
klitcl は、klitcld に対して「klitcldの終了」を指示し、klitcld は、Tcl インタープリタを破棄、および、klitclとの通信ソケットを閉じて終了する。
□ 注意事項
klitcld 終了時には、通信用のソケットのクローズに失敗したときには1 を、クローズに成功したときには 0 を klitcld を実行していた環境に対して返す。

klitcl_quit +Stream +Status
□ 機能
klitcl ユーザプログラムの実行を終了する。
□ 引数
Stream は、klitcld との通信に用いたストリームである。Status は、環境に返す終了ステータスである、正常終了の場合は通常 0 にする。
□ 使用例
quit(_,I,O) :- 
               klitcl:tcl_quit(I,O1),
               klitcl:klitcl_quit(O1,0).
まず、tcl_quit を呼び klitcld を終了させ、その直後に klitcl_quit を呼ぶことで、終了コード0を持って終了している。
□ 注意事項
klitcl_quit によりプログラムを終了させる場合には、その直前に tcl_quit を必ず呼ぶこと。
なお、この述語は klitcl_exit と全く同じ役割を持つ。

klitcl_exit +Stream +Status
□ 機能
klitcl ユーザプログラムの実行を終了する。
□ 引数
Stream は、klitcld との通信に用いたストリームである。Status は、環境に返す終了ステータスである、正常終了の場合は通常 0 にする。
□ 使用例
quit(_,I,O) :- 
               klitcl:tcl_quit(I,O1),
               klitcl:klitcl_exit(O1,0).
まず、tcl_quit を呼び klitcld を終了させ、その直後に klitcl_exit を呼ぶことで、終了コード 0 を持って終了している。
□ 注意事項
klitcl_quit によりプログラムを終了させる場合には、その直前に tcl_quit を必ず呼ぶこと。
なお、この述語は klitcl_quit と全く同じ役割を持つ。

token +Strings -Token -FollowStrings
□ 機能
文字列から先頭のトークン (半角スペースを区切りとした一単語) を切り出す。
□ 引数
Strings が入力引数であり、この文字列の先頭トークンを Token に単一化し、その残りの文字列を FollowStrings に単一化する。
□ 使用例
        :
   klitcl:token("foo bar",Token,Follow),
        :
これにより、Token は "foo" に、Follow は "bar" に、それぞれ単一化される。
□ 注意事項
半角スペースを含まない Strings に対して token を実行した場合、FollowStrings は "" に単一化される。
現在のバージョンでは、トークンの区切りとなる文字を変更することはできない。

chop +Strings -ChoppedStrings
□ 機能
文字列の最後の一文字を削除する。
□ 引数
Strings が入力引数であり、これの最後の一文字(正確には 1 バイト)を削除し、その結果を ChoppedStrings に単一化する。
□ 使用例
        :
   klitcl:chop("Hello world!",Strings),
        :
これにより、Strings は、"Hello world" に単一化される。
この述語は、主として文字列の最後に付いた余分な改行コードの削除などに用いる。
□ 注意事項
空文字列("")に対してこの述語を実行した場合、ChoppedStrings には空文字列("")が単一化される。
また、Strings の最後の文字が2バイト文字だった場合の動作は未定義である。

atoi +Strings -IntValue
□ 機能
数字のみからなる文字列を整数アトムに変換する。
□ 引数
Strings が入力引数であり、10進数を表わす数字文字のみからなる必要がある。これを整数アトムに変換した結果が IntValue に単一化される。
□ 内部処理
klic の Cコードのインライン挿入を用いて、Cのatoi関数を用いて変換を行っている。
□ 使用例
        :
   klitcl:atoi("8086",Int),
        :
これにより、Int は整数アトム 8086 に単一化される。
□ 注意事項
Strings に、10進数を表わす数字文字以外が含まれたときの動作は未定義である。

itoa +IntValue -Strings
□ 機能
整数アトムを文字列に変換する。
□ 引数
IntValue が入力引数であり、整数アトムである必要がある。これを文字列に変換した結果が Strings に単一化される。
□ 内部処理
klic の Cコードのインライン挿入を用いて、Cのsprintf関数を用いて変換を行っている。
□ 使用例
        :
   klitcl:atoi(6809,Strings),
        :
これにより、Strings は文字列"6809"に単一化される。
□ 注意事項
IntValue が整数アトムでなかったときの動作は未定義である。