This example illustrates difference of precedence by resolving of not fully-qualified namespace variables in procedure using variable and global.
The test creates several nested namespaces and uses procedure tv acquiring the variable using supplied arguments, testing its access and finally output the access-method, the var-name and namespace where it is called from and the value of variable (or error if it unresolvable).
So ::P::C::tv global P::v tries to access NFQ variable P::v from procedure of namespace ::P::C using global, whereas ::P::C::tv variable P::v does the same using variable.
The test calling it 4 times is repeated twice (without and with additional nested namespaces/variables).
variable v "::v" namespace eval ::P { proc tv {h n} { puts -nonewline [format "%.4s %4s from %-7s -> " $h $n [namespace current]]; catch { $h $n; set v } res; puts $res } variable v "[namespace current]::v"; namespace eval C { variable v "[namespace current]::v"; proc tv {h n} [info body ::P::tv] } } proc test {ns} { puts " ================ test $ns === " namespace eval $ns { tv global P::v tv variable P::v tv global v tv variable v } } puts "================== without ::P::P::v and ::P::C::P::v ==================" test ::P::C; test ::P puts "================== create ::P::P::v and ::P::C::P::v ==================" foreach n {::P::C::P ::P::P} { namespace eval $n { variable v "[namespace current]::v" } } test ::P::C; test ::P
results in:
================== without ::P::P::v and ::P::C::P::v ================== ================ test ::P::C === glob P::v from ::P::C -> ::P::v vari P::v from ::P::C -> can't define "P::v": parent namespace doesn't exist glob v from ::P::C -> ::v vari v from ::P::C -> ::P::C::v ================ test ::P === glob P::v from ::P -> ::P::v vari P::v from ::P -> can't define "P::v": parent namespace doesn't exist glob v from ::P -> ::v vari v from ::P -> ::P::v ================== create ::P::P::v and ::P::C::P::v ================== ================ test ::P::C === glob P::v from ::P::C -> ::P::v vari P::v from ::P::C -> ::P::C::P::v glob v from ::P::C -> ::v vari v from ::P::C -> ::P::C::v ================ test ::P === glob P::v from ::P -> ::P::v vari P::v from ::P -> ::P::P::v glob v from ::P -> ::v vari v from ::P -> ::P::v