Tcl 8.5 の lassign で多重代入 [Tcl]
以前 Tcl には多重代入がないといって自分で実装 [1] していた裏ではすでに開発中の 8.5 で lassign コマンドが導入されていた。安定版じゃなくてもちゃんとチェックしていないと余計なことを書くはめになるということだ。
lassign list varName ?varName ...?
私が作ったのとは違って、リストが先に来て変数が後に来る。他にも (1) リストの要素数より変数名が多い場合は "" が代入されるとか、(2) 変数名の方が少ない場合はリストの「残り」がコマンドの戻り値になる、とかいうボーナス機能がある。
Tcl 8.5 の lassign は C で実装されているようだが、前回と同様 Pure Tcl でも以下のように書ける。
% proc lassign {l args} { for {set i 0} {$i < [llength $args]} {incr i} { set var [lindex $args $i] set val [lindex $l $i] uplevel 1 [list set $var $val] } return [lrange $l $i end] } % lassign {a b c} x y z % puts $x; puts $y; puts $z a b c % lassign {d e} x y z % puts $x; puts $y; puts $z d e % lassign {f g h i} x y h i % puts $x; puts $y f g
Tcl 8.5 ではもうひとつ lrepeat というリストコマンドが追加になっている。これは名前から予想されるとおりリストを指定回数繰り返して新しいリストを返す。
[1] http://blog.so-net.ne.jp/rainyday/2006-07-28
ActiveTcl付属のサンプルで多重代入には
foreach $vars $vals {}
というのがよく使われているのを見たので、
私はこれを使っています。
by ゆーすけ (2007-09-03 11:06)
foreach がスコープを導入しないが故のイディオムですね。
by ether (2007-09-04 21:53)