Version 4 of Namespace variables

Updated 2002-06-29 21:49:50

if {0} { Martin Lemburg here some procedures ...

  • ... to get the full qualified name of ...
  • ... to check the existence of ...
  • ... to connect (with upvar) to ...

... a variable in the current or any parent namespace: }

 proc getFullNspcVarName {args} {
   switch -exact -- [llength $args] {
      1   {
         set nspc    [uplevel namespace current];
         set varname [lindex $args 0];
      }
      2   {
         foreach {nspc varname} $args {break;}

         if {[catch {namespace parent $nspc}]} {
            error "no such namespace \"$nspc\"";
         }
      }
      default   {
         error "wrong # args: should be \"getFullNspcVarName ?namespace? varname\"";
      }
   }

   while {![info exists ${nspc}::$varname]} {
      if {$nspc == "::"} {
         return "";
      }

      set nspc [namespace parent $nspc];
   }

   return ${nspc}::$varname;
 }

(See also namespace which.)

 proc varExistsInNspc {args} {
   if {[catch {set result [uplevel getFullNspcVarName $args]} reason]} {
      error $reason;
   }

   if {$result == ""} {
      return 0;
   }

   return 1;
 }

 proc nspcVar2LocalVar {args} {
   if {[catch {set result [uplevel getFullNspcVarName $args]} reason]} {
      error $reason;
   }

   if {$result == ""} {
      return 0;
   }

   set varname [namespace tail $result];

   if {[uplevel info exists $varname]} {
      error "namespace var \"$result\" already exists";
   }

   uplevel upvar $result $varname;

   return 1;
 }

 # demo and test: