LoginSignup
3
1

More than 5 years have passed since last update.

配列にもリストにも使えるmember関数

Posted at

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]
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1