Tclを使っていて、ある添字に対しての配列の要素や、リストにある値が存在するか調べたいときがあります。
配列の場合は array get arr $foo 、リストの場合は lsearch $l $foo を使えば目的は達成できますが、配列とリストで書き方を変えないといけません。特に、配列は$が不要で、リストは$がいるというのがややこしいです。そこで、配列に対しても、リストに対しても使えるmember関数を作りました。
特に、別の人が作ったTclソースをメンテする時に活躍します。
member.tcl
# container の中に 要素 elememt があるとき1を返す。無い時は0を返す。
proc member { container elememt } {
upvar $container upver_container
if [array exists upver_container] {
# array の処理
if {[array get upver_container $elememt] != ""} { return 1 } else { return 0}
}
# list の処理
if {[lsearch $upver_container $elememt] != -1} {return 1} else {return 0}
}
# 使い方
# 配列の場合
set arr(a) 1
set arr(b) 2
set arr(c) 3
set arr(d) 4
set arr(e) 5
set arr(f) 6
# 1 1 1 0が正解
puts [member arr a]
puts [member arr b]
puts [member arr f]
puts [member arr g]
# リストの場合
set lt {a b c d e f}
# 1 1 1 0が正解, リストに$不要
puts [member lt a]
puts [member lt b]
puts [member lt f]
puts [member lt g]