【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

Tcl - Tool Command Language

目次

Tool Command Language

Tcl(「ティクル」と読む)は非常にシンプルなシンタクスを持ったスクリプト言語で GUIツールキットのTkとともにJohn Ousterhoutによって開発されました。

シンタクス

Tclのシンタクスは一つしかありません。すなわち、

 command argument argument argument ...

スペースで区切られた最初の部分がコマンドで残りがそれに与えられる引数になります。 制御構文もこのシンタクスに則っているし、関数の定義も変数への代入もこの形式に還元できます。

グルーピング

スペースをコマンドラインの区切り文字として認識させたくない場合には ダブルクォーテーション " " か中カッコ { } でくくります。 二つの違いは、前者は後で見る置き換えが行われるのに対して後者は行われないということ。 Perlでいうと前者がダブルクォーテーションで後者がシングルクォーテーションのような感じですね。

Hello Worldは以下のとおり。putsはPerlでいうprintですね。でもデフォルトで改行も付されます。

 puts "Hello World!"

もちろんこうでもOK。

 puts {Hello World!}

ダブルクォーテーションや中カッコの中には改行が含まれていてもかまいません。

 puts "Hello
 World"
 puts {Hello
 World}

の結果は

 Hello
 World
 Hello
 World

です。

置き換え

置き換えには2種類あります。 ひとつはコマンドラインに変数が出てきたらそれをその実体に置き換えることです。 もう一つはコマンドラインの中に入れ子になったコマンドがあったら その部分をコマンドの結果に置き換えることです。

変数の置き換え

変数の置き換えを説明する前に、まずTclで変数に代入する方法を見ましょう。

 set hoge Hello

これはsetコマンドで、変数$hogeにHelloという文字列が代入されます。 次のコマンドの結果がどうなるかわかりますね?

 puts $hoge

ドル記号で始まる引数は変数を意味します。 こういう行にぶつかるとTclは変数をその実体に置き換えてからコマンドを実行します。 だから上のコマンドはputs Helloと同じ物と解釈されるということですね。

ちなみにsetコマンドの最初の引数には$をつけてはいけません。

 set $hoge Hello

というコマンドだとTclはまず$hogeの置き換えを行い、 そのあとでsetコマンドを実行するわけですから。 以下の様にするとどういう結果になるかちょっと考えてみて、それから実際にやってみましょう。

 set foo hoge
 set $foo bar
 puts $foo
 puts $hoge

入れ子になったコマンドの置き換え

コマンドラインの中には [ と ] で括った別のコマンドを埋め込むこともできます。 例えばこんな感じです。

 puts [info tclversion]

info tclversionというのはTclのバージョンを返すコマンドです。 上のコマンドにぶつかるとTclはまず [ ] の中のコマンドを解釈し、 その結果を置き換えた後で全体のコマンドを解釈します。 info tclversionが8.3を返すとしたら、puts 8.3として解釈されるわけです。

条件分岐

他の多くの言語と同様に条件分岐に使われるシンボルはifで、 簡単な構文は次のようになります。

 if {$a == 0} {puts Hello}

Tclに関して特長的なのはifもTclの唯一のシンタクスの例外ではないということです。 つまりこれは「ifコマンド」とみなすことができるのです。 「ifコマンド」は最初の引数に条件を取り、 2番目の引数として条件が真のとき評価されるコマンドを取ります。

これらは中カッコで括るのが慣例的ですが、 置き換えのことをよく理解した上でダブルクォーテーションを使ってもかまいません。 以下の二つの形式は同じ結果になりますが後者の場合は条件の中の$aが実体に置き換えられてからifに渡される点で異なっています。

 if {$a == 0} {puts Hello}
 if "$a == 0" "puts Hello"

さらにいうと次のような(普通このように書くべき状況は少ないでしょうが)気持ち悪い書き方もできます。

 set a 0
 set eq ==
 set cmd puts
 if "$a $eq 0" "$cmd Hello"

さて、中カッコの中には改行を含むこともできますから次のような書き方も文法的です。

 if {$a == 0} {
     puts Hello
 }

注意して欲しいのはCなどとは異なり、次のような書き方は非文法的だということです。

 if {$a == 0}
 {
     puts Hello
 }

このような表現だとTclは「ifコマンド」の引数が{$a ==0}までと解釈し、 次の行からは別のコマンドとみなします。 その結果、「ifコマンド」に対する引数が足りないとみなし、エラーを出してしまいます。 これはTclをはじめたばかりだとTclインタプリタの非常に奇怪な挙動に見えますが、 ifがTclの唯一のシンタクスの例外ではないという点を理解すれば納得できると思います。

ちなみに条件が真の場合に評価されるコマンドの前にthenを入れてもかまいません。

 if {$a == 0} then {puts Hello}

もちろんelseやelseifも用意されています。

 if {$a == 0} {
     puts zero
 } elseif {$a == 1} {
     puts one
 } else {
     puts other 
 }

Tclと文字コード

Tclの8.1以降のバージョンでは多国語対応のために文字列を内部的にユニコードで表現するようになりました。 さらにユニコード以外の文字コードとの相互変換が標準で揃っています。 ソースファイル中に日本語などを含めた場合はロケールの設定によって解釈され、内部的にはユニコードに変換されます。

Tclの入手

ActiveStateのサイト内のhttp://www.activestate.com/Products/ActiveTcl/からWindows用、Solaris用、Linux用、HP-UX用のTcl/Tkがダウンロードできます。

Tclに関連したサイトへのリンク