Tclはシンプルな文法を持ったスクリプト言語です。
cmd arg argarg
- Tclコマンドはスペースで区切られたワードによって形成されます。最初のワードはコマンド名で、残りのワードはそのコマンドへの引数です。
$foo
- ドル記号($)は変数の値を参照します。この例では、変数名はfooです。
[clock
seconds]
- 角括弧はコマンドの結果を置換します。例えば、あるコマンドの結果をコマンドの引数に渡したければ、この文法を使います。この例では、現在の時間を秒で返すclock
secondsコマンドの結果が置換されます。
"some stuff"
- ダブルクォートはコマンドへの1つの引数としてワードをグループ化します。ドル記号と角括弧はダブルクォート内で置換されます。
-
{some stuff}
- 中括弧も1つの引数としてワードをグループ化します。
しかし、中括弧内の要素は置換されません。
\
- バックスラッシュ(\)は特殊文字を表現するのに使われます。例えば、\nはニューラインを生成します。また、バックスラッシュはドル記号、角括弧、ダブルクォート、中括弧の特殊な意味を無効化するのに使われます。
-
;
- セミコロン(;)は1行に複数のコマンドを書くときのセパレータとして使われます。1行に1つのコマンドしか書かないときは省略できます。
-
#
- シャープ(#)はコメントを書くのに使われます。例えば、行の始まりが#で始まる行は、その行全体がコメント行になります。コマンドの後にコメントを書きたいときは、セミコロン(;)を置いてから#でコメントを書きます。
-
短い例
以下の例は、現在の時間を表示するTclコマンドです。3つのTclコマンド(set, clock, puts)を使っています。
setコマンドは変数を割り当てます。clockコマンドは時間を操作します。putsコマンドは値を表示します。
set seconds [clock seconds] puts "The time is [clock format $seconds]"
注意として、setコマンドで変数を割り当てる場合、$を使用しません。変数の値を使う場合に限り$を使います。
また、前の例に変数は必要ありません。現在の時間は1つのコマンドで表示できます。
puts "The time is [clock format [clock seconds]]"
グルーピングと置換
Tclの文法は3ステップ(引数のグループ化、結果の置換、コマンドの実行)を通して解析されます。
-
引数のグループ化.
Tclはコマンドへの引数を決定する必要があります。最も単純な場合では、引数をスペースで区切ります。前述のように、クォートと括弧の文法は複数のワードを1つの引数にグループ化するのに使われます。前の例で、ダブルクォートがputsコマンドへの1つの引数にグループ化するために使われています。
-
結果の置換.
引数がグループ化された後に、Tclは文字列の置換を行います。単純に$fooと変数fooの値を置換し、括弧でくくったコマンドとそのコマンドの結果を置換します。グループ化が確定された後にその置換を行います。このシーケンスは異常な値がコマンドの構造を複雑にしないことを保証します。
-
コマンドの実行.
置換後、Tclは実行テーブルへのキーとしてコマンド名を使い、テーブル内のCプロシジャを呼び出します。Cプロシジャはコマンドをインプリメントします。あなたもTclのコマンドプロシジャを書くことができます。引数の処理に関するシンプルな規則とエラーの処理があります。
別の例
これは別の例です。 set i 0 while {$i < 10} { puts "$i squared = [expr $i*$i]" incr i }
ここで、中括弧はどんな置換も行わず、引数をグループ化するために使われます。Tclパーサーはwhileコマンドに関して特別な事は何も知りません。他のコマンドと同様に扱います。whileコマンドは最初の引数が条件式で、第2引数が多くのTclコマンドであることを知っています。中括弧は2つの引数をグループ化します。式の真理値でループ本体のループとコマンドを制御します。
私たちはさらに真理値の比較と演算を行う2つの算術演算式(条件式)を見ます。whileコマンドは自動的に最初の引数を条件式として評価します。他の場合では、条件式を実行するためにexprコマンドを使わなければなりません。
コマンドの実行
最後に、Tclはハードな仕事をするために、他の何かを呼び出します。私たちはTclが数学関数を実行するためにexprを使い、出力機能を処理するためにputsを使い、変数を割り当てるためにsetを使うことを理解しました。それらのTclコマンドはTclで登録されたCプロシジャによって実装されます。CコマンドプロシジャはTclコマンドから文字列の引数を取り、それらの結果として新しい文字列を返します。Cコマンドプロシジャを書くことは非常に簡単です。それらはデータベースのアクセスからGUIの作成まですべてを行うことができます。Tcl言語はコマンドが実際に何を行うかを知りません。Tclは引数をグループ化し、結果を置換し、コマンドを実行するだけです。
最後の例
ここに階乗プロシジャがあります。 proc fac {x} { if {$x < 0} { error "Invalid argument $x: must be a positive integer" } elseif {$x <= 1} { return 1 } else { return [expr $x * [fac [expr $x-1]]] } }
|