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]
