Статическая переменная в Tcl - PullRequest
7 голосов
/ 25 мая 2011

Можно ли объявить статическую переменную в Tcl?
Я использую определенную функцию для перехвата неизвестных командных ошибок и хочу, чтобы она выводила сообщение об ошибке при первом появлении неизвестной команды - поэтому мне нужно сохранить что-то вроде статического списка внутри proc. Это возможно?

Ответы [ 4 ]

4 голосов
/ 25 мая 2011

Или вы можете просто использовать прямую глобальную переменную:

set varList {}

proc useCount {value} {
    global varList ;
    lappend varList $value
}

useCount One
useCount Two
puts $varList
2 голосов
/ 25 мая 2011

Tcl не поддерживает статические переменные.Вместо использования глобальной переменной или переменной внутри пространства имен, другой альтернативой является реализация вашей процедуры как метода внутри класса (см. [Incr tcl] или snit).Если вам необходимо реализовать статическую переменную, в вики Tcl есть страница, где обсуждается эта проблема: http://wiki.tcl.tk/1532

2 голосов
/ 25 мая 2011

Нет.Но вы можете использовать глобальный (обычно пространство имен), проиндексированный по имени процедуры, например:

namespace eval foo {
  variable statics
  array set statics {}
}
...
proc ::foo::bar args {
  variable statics
  upvar 0 statics([lindex [info level 0] 0]) myvar
  # use myvar
}
0 голосов
/ 27 мая 2011

Поскольку я не люблю глобальные переменные (если у вас нет небольшого скрипта), я объединяю решения из @kostix и @Jackson:

namespace eval foo {
    variable varList {}
}
proc foo::useCount {value} {
    variable varList
    lappend varList $value
}

foo::useCount One
foo::useCount Two

puts $foo::varList
...