例題(Calc)


この例は、Tcl/Tk の GUI から入力された数字を、受け取り KLIC 側で計算を行い、その結果を、再び Tcl/Tk の GUI に設定するものです。
GUI の「plus」、「minus」の各ボタンを押すことにより、2数の和と差が計算されます。その結果が、Tcl/Tkのラベルウィジェットに表示されます.

プログラム

プログラムを以下に示します。
 1: % calc
 2:
 3: :- module main.
 4:
 5: main :- klitcl:klitcl_init(P),
 6:         klitcl:tcltk_init-P,
 7:         klitcl:tcl_eval("entry .e1",_)-P,
 8:         klitcl:tcl_eval("entry .e2",_)-P,
 9:         klitcl:tcl_eval(".e1 insert 0 1",_)-P,
10:         klitcl:tcl_eval(".e2 insert 0 2",_)-P,
11:         klitcl:tcl_eval("button .b1 -text plus \
12:                 -command {klic main plus [.e1 get] [.e2 get]}",_)-P,
13:         klitcl:tcl_eval("button .b2 -text minus \
14:                 -command {klic main minus [.e1 get] [.e2 get]}",_)-P,
15:         klitcl:tcl_eval("button .b3 -text Quit \
16:                 -command {klic main quit hoehoe}",_)-P,
17:         klitcl:tcl_eval("label .l -text 0",_)-P,
18:         klitcl:tcl_eval("pack .e1 .e2 .b1 .b2 .l .b3",_)-P,
19:         klitcl:tk_mainloop-P,
20:         P=[].
21:
22: plus(S,I,O) :- S = [VS1|[VS2]] ,
23:         klitcl:atoi(VS1,V1),
24:         klitcl:atoi(VS2,V2),
25:         Ans := V1 + V2,
26:         klitcl:itoa(Ans,AnsS),
27:         generic:join(".l configure -text ",AnsS,Com),
28:         klitcl:tcl_eval(Com,_,I,O1),
29:         klitcl:tk_wait(O1,O).
30:
31: minus(S,I,O) :- S = [VS1|[VS2]] ,
32:         klitcl:atoi(VS1,V1),
33:         klitcl:atoi(VS2,V2),
34:         Ans := V1 - V2,
35:         klitcl:itoa(Ans,AnsS),
36:         generic:join(".l configure -text ",AnsS,Com),
37:         klitcl:tcl_eval(Com,_,I,O1),
38:         klitcl:tk_wait(O1,O).
39:
40: quit(_,I,O) :- 
41:         klitcl:tcl_quit(I,O1),
42:         klitcl:klitcl_quit(O1,0).

コンパイル

このプログラムは、sample/calc のディレクトリにあります。
このプログラムを利用する前に、トップディレクトリで make を行い、 klitcld をコンパイルしておいてください。
このプログラムをコンパイルするには、このディレクトリで make すればOKです。
コンパイルが終了すると、calc という名前の実行ファイルが出来ていると思います。

実行

まず、klitcld を実行します。これは、Tcl/Tk を実行するためのプログラムです。
% ./kltcld &
のようにして、バッググラウンドで実行させるとよいでしょう。
このあと、
% ./calc
とすると、プログラムが動作します。
Tcl/Tk の GUI は、

calc

のようになります。
ここで、上の2つのエントリに適当に数字を入力し、「plus」あるいは「minus」と書かれたボタンを押すことにより,2つの数字の和あるいは差を表示します。
プログラムを終了するには、「quit」と書かれたボタンを押します。

プログラムの説明

述語 main の中は、そのほとんどが tcl_eval であり、実際の画面を作るための Tcl コマンドを実行しています。
3つのボタンを生成していますが、それぞれに klic の述語がバインドしてあり、ボタンが押されたときにはそれぞれの述語が実行されるようになっています。

述語 plus および minus は、Tcl 側から引数として 2つの数値を受けとるようになっています。
Tcl 側からの引数は、文字列のリストの形で渡されるため、呼ばれる述語側で整数アトムに変換しています(22,23,24,31,32,33 行目)。
その後、必要な演算を行ない(25,34行目)、Tcl に演算結果を渡すために文字列に変換し(26,35行目)、Tcl 命令を生成して(27,36行目)、実際に評価しています(28,37行目)。
その後、再び、次のイベント待ちに入ります(29,38行目)。

このプログラムは、エラーチェックが充分でありません。
実際のアプリケーションを作成する場合には、Tcl 側から受け取った引数についての正当性のチェックなどをする必要があります。