Tcl – evalコマンドと{*}構文について

evalコマンド

[書式]

eval arg ?arg ...?

evalコマンドの引数はTclコマンドを1つ以上含むTclスクリプトを構成した引数をとります。

evalコマンドはconcatコマンドと同じ方法で引数を展開します。

[使用例1]

set a 10
set b {20 30 40}
set c 50

list $a $b $c
⇒ 10 {20 30 40} 50

concat $a $b $c
⇒ 10 20 30 40 50

eval list $a $b $c
⇒ 10 20 30 40 50

listコマンドでは$bを1つの値として展開します。

これをevalコマンドの引数で指定すると$bを3つの値として展開します。

Tclインタプリタは基本的に展開したものをさらに展開することはしませんが、evalコマンドを使うと展開した値をさらに展開することができます。

[使用例2]

set script {
    puts "hello! hello!"
    puts "Good morning!"
}

eval $script
⇒ hello! hello!
   Good morning!

上の例では変数scriptを展開した文字列をTclコマンドとして再評価しています。

[使用例3]

set prog "wish hello-w.tcl"

eval exec $prog &

execコマンドは外部プログラムを実行します。

上の例では「wish hello-w.tcl」を「wish」と「hello-w.tcl」の2つの値として展開しています。

execコマンドについては「外部プログラムの実行について」で説明します。

{*}構文について

{*}の構文は、concatコマンドと同じ方法でリストを複数の引数として展開します。

{*}は8.5から使えるようになりました。

[使用例1]

set a 10
set b {20 30 40}
set c 50

list $a $b $c
⇒ 10 {20 30 40} 50

eval list $a $b $c
⇒ 10 20 30 40 50

list $a {*}$b $c
⇒ 10 20 30 40 50

複数の引数をまとめた変数を展開する場合など、単なる文字列のリストを展開するだけであれば、evalコマンドよりも「{*}」を使用した方がシンプルで見やすいです。

[使用例2]

set prog "wish hello-w.tcl"

exec {*}$prog &

{*}構文を使った例は「外部プログラムの実行について Windowsでの使用例」でも紹介しています。

コメント

タイトルとURLをコピーしました