Tclは非常にシンプルなプログラミング言語です。もし、あなたにプログラミング経験があるならば、数時間で面白いTclプログラムを書くために十分に学習することができます。このページはTclの概要と主な特徴を提供します。これを読んだ後に、あなたは恐らく独力でシンプルなTclスクリプトを書き始めることができるでしょう。しかしながら、我々はあなたがより多くの情報を得るために、沢山あるTcl本の中から1つを読まれることを勧めます。
      

基本的な文法

Tclコマンドはニューラインまたはセミコロンによって区切られたコマンドから構成されます。コマンドは次の例のようにすべて同じ基本的な形式になります。

expr 20 + 10
このコマンドは、20と10の合計を計算し、結果として30を返します。あなたは、Tclアプリケーションにこのページのこの例およびすべての他の例をタイプすることにより、それらを試すことができます。例えば、tclshでコマンドが完了するとtclshはその結果を表示します。

各々のTclコマンドはスペースで区切られた1つ以上のワードから成ります。この例では、4つのワード(expr、20、+、10)があります。最初のワードはコマンド名で、その他のワードはそのコマンドへの引数です。Tclコマンドはすべてワードから成りますが、各々のコマンドの引数の扱いは異なっています。exprコマンドはすべての引数を合わせてに算術演算式として扱います。そしてその算術演算式の結果を計算し、文字列としてその結果を返します。exprコマンドにとってワードの分割は重要ではありません。あなたは容易に同じコマンドとして以下の様に呼び出すことができるでしょう。

expr 20+10
しかしながら、最も重要なことは、多くのコマンドのワード構造は各々のワードがまったく違う目的のために使われるということです。       

すべてのTclコマンドは結果を返します。もしコマンドが意味のある結果を持っていない場合、その結果として空の文字列を返します。
      

変数

Tclは、あなたが変数に値を格納し、コマンドの中で値をその後使うことを可能にします。setコマンドは変数の設定と参照をするのに使われます。例えば、以下のコマンドは値32を保持するために変数xを修正します。

set x 32
コマンドは変数の新しい値を返します。あなたは、setに1つだけ引数を渡して呼び出すことにより、変数の値を参照できます。
set x
あなたは、Tclの中で変数を宣言する必要はありません。最初にsetするときに自動的に生成されます。Tclの変数は型を持ちません。いかなる変数も任意の値を保持することができます。       

コマンド内で変数の値を使うために、以下の例のように変数の置換を使います。

expr $x*3
コマンド中に$が現れると、Tclは変数名としてそれに続く文字と数字を扱います。そしてその名前の場所に変数の値を置換します。この例では、exprコマンドの実際の引数は32*3になります(前の例で変数xが設定されていると仮定します)。あなたは、任意のコマンドの任意のワードに対してワード内で何度でも変数の置換を使うことができます。
set cmd expr
set x 11
$cmd $x*$x

コマンドの置換

さらにあなたは、あるコマンドの結果を別のコマンドの引数に使うことができます。これはコマンドの置換と呼ばれます。

set a 44
set b [expr $a*4]
コマンド中に [ が現れると、Tclは ] と一致する間のすべてをTclコマンドのネストとして扱います。Tclはネストしたコマンドを評価し、その結果で括弧で囲まれたコマンドを置換します。上の例では、setコマンドの第2引数は176に置換されるでしょう。    

ダブルクオートと中括弧

ダブルクオートは、あなたがスペースを含んでいるワードを指定することを可能にします。例えば、次のスクリプトをよく見てください。

set x 24
set y 18
set z "$x + $y is [expr $x + $y]"
これら3つのコマンドが評価された後に、変数zは24 + 18 = 42の値になるでしょう。クオート間のすべてのものはsetコマンドに1つのワードとして渡されます。コマンドと変数の置換はクォート間のテキスト上で行われますが、クォートそれ自身はコマンドに渡されないことに注意してください。もしクォートがなかったら、setコマンドは6つの引数を受け取り、エラーを生じさせていたでしょう。      

中括弧はワード内の情報をグループ化する別の方法を提供します。ダブルクォートとは中括弧の間のテキスト上で置換をしないという違いがあります。

set z {$x + $y is [expr $x + $y]}
このコマンドは変数zに値 "$x + $y is [expr $x + $y] " を設定します。       

制御構造

Tclはループやプロシジャ等の条件付き実行のためのコマンドを含む完全な制御構造のセットを提供します。Tcl制御構造は引数としてTclスクリプトをとる単なるコマンドです。以下の例は整数ベースの累乗を行うpowerというTclプロシジャを作成します。

proc power {base p} {
set result 1
while {$p > 0} {
set result [expr $result * $base]
set p [expr $p - 1]
}
return $result
}
このスクリプトは、procコマンド1つから成ります。procコマンドは3つの引数(プロシジャの名前、引数の名前のリスト、Tclスクリプトであるプロシジャの本体)をとります。最初の行の最後の中括弧から最後の行の中括弧までは文字通り1つの引数としてprocへ渡されることに注意してください。procコマンドは2つの引数を持つpowerという名前の新しいTclコマンドを生成します。あなたは、以下のようにコマンドとしてpowerを呼び出すことができます。
power 2 6
power 1.15 5

powerが呼び出された時、そのプロシジャの本体が評価されます。本体を実行している間だけその引数の変数にアクセスすることができます。baseは最初の引数を保持し、pは第2引数を保持するでしょう。

powerプロシジャの本体は、3つのTclコマンド(set, while, return)から成ります。whileコマンドはプロシジャのほとんどの仕事を行います。whileは2つの引数(条件式($p > 0)と別のTclスクリプトである本体)をとります。whileコマンドはC言語のそれらに似たルールを使ってその条件式の引数を評価します。そしてもしその結果が真(ゼロでない)時は、Tclスクリプトである本体を評価します。条件式の評価が偽(ゼロ)になるまでそれは何度もプロセスを繰り返します。この場合、whileコマンドの本体はresultにbaseを乗じて、それからpをデクリメントしています。pはゼロになるまでbaseの階乗が続けられます。returnコマンドは変数resultの値をそのプロシジャの結果として出し、プロシジャを終了します。  

コマンドはどこから来るのか?

あなたが見たように、Tcl内の面白い特徴のすべてはコマンドによって代表されます。ステートメントはコマンドです。算術演算式(条件式)は実行するコマンドにより評価されます。制御構造はコマンドです。プロシジャもコマンドです。       

Tclコマンドは3つの方法で作成されます。第1のコマンドのグループはTclインタプリタそれ自身によって提供されます。これらのコマンドはビルトイン・コマンドと呼ばれます。それらは、あなたがここまで見たコマンドおよびさらに多くのすべてを含んでいます(以下を参照)。ビルトイン・コマンドはすべてのTclアプリケーションの中にあります。

第2のコマンドのグループはTclの拡張メカニズムを使用して作成されます。Tclはコマンドを実装するCまたはC++の中でコマンドプロシジャを書くことにより、あなたが新しいコマンドを作成することを可能にするAPIを提供します。あなたTclにプロシジャが実装するコマンドの名前を伝えることにより、Tclインタプリタを備えたコマンドプロシジャを登録します。特にその名前がTclコマンドのために使用される場合は、常に今後Tclはコマンドを実行するためにあなたのコマンドプロシジャを呼ぶでしょう。ビルトイン・コマンドはさらに同じ拡張メカニズムを使用して実装されます。それらのコマンドプロシジャは単にTclライブラリの一部です。

Tclがアプリケーションの内部で使用される場合、アプリケーションは拡張メカニズムを使用してTclにその重要な特徴を組み込みます。したがって、利用可能なTclコマンドのセットはアプリケーションによって様々です。任意のTclアプリケーションに組み込むことができるさらに多数の 拡張パッケージがあります。最も名高い拡張の1つは、GUIを構築するための強力な機能を提供するTkです。他の拡張は、オブジェクト指向プログラミング、データベースアクセス、よりグラフィカルな能力および様々な他の特徴を提供します。統合アプリケーションを構築するためのTclの最も大きな利点のうちの1つは、新しい特徴を組み込むかあるいは他の資源と通信するために、拡張することのできる容易さです。

第3のコマンドのグループは、上記powerコマンドのようにprocコマンドで作成されたプロシジャから成ります。典型的に、拡張は、Cプログラミングが便利なところで、より低いレベルの機能のために使用され、プロシジャはTclの中で書くことがより容易なところで、より高いレベルの機能のために使用されます。

その他の特徴

Tclは、前の例の中で使用されるものに加えて他の多くのコマンドを含んでいます。ここにTclビルトイン・コマンドによって提供される特徴のうちいくつかの例があります。       

  • より多くの制御構造、 例えば if, for, foreach, switch         
  • 強力な正規表現を含む文字列操作、数字と同じく容易に操作できる任意の長さの文字列         
  • ディスク、ネットワークソケットおよびシリアルポートのようなデバイス上のファイルを含むI/O、Tclは特にインターネット上のソケット・コミュニケーションのためにシンプルな機能を提供します         
  • ファイル管理、Tclはファイル名、ファイル属性の読み込みと書き込み、ファイルのコピーと削除、ディレクトリの作成することなどいくつかのコマンドを提供します        
  • サブプロセスの起動、あなたはexecコマンドで他のアプリケーションを起動できます。それらと実行中に通信をします。        
  • リスト、Tclは値(リスト)の収集を作成し、様々な方法でそれらを操作することを容易にします。         
  • 配列、あなたは名前のための任意の文字列値および値を持つ名前と値ペのアから成る構造化した値を作成することができます。         
  • 時間および日付の操作        
  • イベント、Tclはスクリプトが確かに発生するイベントを待つことを可能にします。例えば、時間の経過およびネットワーク・ソケット上の有効な入力データ。

関連情報