LINUX.ORG.RU

Tcl namespaces


0

0

Ничего не понимаю.
В каком ns переменная var?

package require BWidget

namespace eval ns {
namespace eval varns {
variable vars
}
proc createcombo {} {
set varns::vars {var}

foreach varname $varns::vars {
ComboBox .combo -textvariable $varname
}
grid .combo
}
proc createbutton {} {
button .b -text "bump" -command {
#Как здесь получить fully qualified name var ?
grid .b
}
}

ns::createcombo
ns::createbutton

anonymous

Она доступна по имени ::ns::varns::vars. Для получения текущего неймспейса используется [namespace current].

В твоём случа возможны следующие варианты:

1. Использовать команду variable и брать переменную из нужного неймспейса. При этом обработчик должен находиться в том же ns:

namespace ns {
namespace varns {

...

button .b -text "bump" -command processClick

proc process click {
#Как здесь получить fully qualified name var ?
variable vars

puts $vars

grid .b
}
}
}

2. Использовать магию tcl8.5 и передавать неймспейс в замыкание, а потом обращаться по полному имени:

button .b -command [ list apply {{ns} {
puts [ set $ns::vars ]
}} [ namespace current ] ]

gaa ★★
()
Ответ на: комментарий от gaa

ммм...
Я, похоже, сам не знаю, чего хочу.

Как-то так:
почему, если в контексте моего скрипта написать
процедуру createbutton так:

proc createbutton {} {
    button .b -text "bump" -command {
        puts $var
    }
, то к значению переменной (да?) я могу обращаться не по полному
имени?
Переменная -textvariable виджета .combo становится доступна...как или
в каком ns?

зы: чтобы не писать variable в каждой процедуре я, подглядев на вики, 
использую конструкцию типа:
    namespace eval ns {
        namespace eval vars {
             variable myvar
        }
        proc foo {} {
            set vars::myvar "bar"
        }
    }

ззы:
Сорри за бардак, я очень стараюсь объяснить ^^

anonymous
()
Ответ на: комментарий от anonymous

Re^2: Tcl namespaces

> почему, если в контексте моего скрипта написать
> процедуру createbutton так:

> proc createbutton {} {

> button .b -text "bump" -command {

> puts $var

> }

> , то к значению переменной (да?) я могу обращаться не по полному

> имени?


то, что написано после -command выполняется в глобальном пространстве имён. Поэтому переменная, определённая там же, доступна напрямую.

> Переменная -textvariable виджета .combo становится доступна...как или

> в каком ns?


-textvariable берётся опять же из глобального пространства имён.

gaa ★★
()
Ответ на: Re^2: Tcl namespaces от gaa

Большое спасибо.

/me пошел писать письмо в core team - 
    gaa в эксперты, gaa в эксперты )

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.