Я хочу создать вспомогательную команду array values arrayName
в качестве "оборотной стороны" команды "имена массивов".
Создать простой процесс просто:
proc array_values {arrayName} {
upvar 1 $arrayName ary
set values {}
foreach {name value} [array get ary] {lappend values $value}
return $values
}
array set a {foo bar baz qux}
puts [array_values a] ;# => bar qux
Однако у меня возникают трудности при создании команды в пространстве имен ::tcl::array
:
первая домашняя работа:
является array
ансамблем пространства имен? Да.
% namespace ensemble exists array
1
что такое пространство имен?
% namespace ensemble configure array -namespace
::tcl::array
Какие подкоманды?
% namespace ensemble configure array -subcommands
% namespace ensemble configure array -map
anymore ::tcl::array::anymore donesearch ::tcl::array::donesearch exists ::tcl::array::exists get ::tcl::array::get names ::tcl::array::names nextelement ::tcl::array::nextelement set ::tcl::array::set size ::tcl::array::size startsearch ::tcl::array::startsearch statistics ::tcl::array::statistics unset ::tcl::array::unset
ОК, все хорошо, вар. Давайте добавим этот array_values
proc в пространство имен
% namespace eval ::tcl::array {
proc values {arrayName} {
upvar 1 $arrayName ary
set values {}
foreach {name value} [array get ary] {lappend values $value}
return $values
}
}
% array set a {foo bar baz qux}
% puts [::tcl::array::values a]
can't set "values": variable is array
Откуда эта ошибка? Я попытался переименовать переменную «values» в proc для других имен, но она все равно выдает ошибку «variable is array».
примечание: я могу добавить первый ансамбль в процесс:
% namespace ensemble config array -map [list values ::array_values {*}[namespace ensemble config array -map]]
% array values a
bar qux
Но что не так с моей ::tcl::array::values
процедурой?