Posted to tcl by aspect at Sun May 15 10:47:53 GMT 2011view raw
- # Illustration for how [global] and [variable] (mostly) can be implemented
- # in terms of [upvar]
- # http://www.tcl.tk/man/tcl8.6/TclCmd/global.htm
- proc global {args} {
- foreach name $args {
- uplevel 1 [list upvar #0 $name [namespace tail $name]]
- }
- }
- # http://www.tcl.tk/man/tcl8.6/TclCmd/variable.htm
- proc variable {args} {
- # from outside a [proc] this should just do set
- if {"namespace" == [lindex [dict get [info frame 1] cmd] 0]} {
- if {[llength $args] == 1} {
- # we cannot create undefined variables, so we break the spec
- # but setting $var = {}
- uplevel 1 [list set $args {}]
- } else {
- foreach {name val} $args {
- uplevel 1 [list set $name $val]
- }
- }
- } else {
- set ns [uplevel 1 {namespace current}]
- if {[llength $args] == 1} {
- set localname [namespace tail $name]
- if [string match ::* $name] {
- set upname $name
- } else {
- set upname $ns::$name
- }
- uplevel 1 [list upvar #0 $upname $localname]
- }
- foreach {name val} $args {
- set localname [namespace tail $name]
- if [string match ::* $name] {
- set upname $name
- } else {
- set upname $ns::$name
- }
- uplevel 1 [list upvar #0 $upname $localname]
- uplevel 1 [list set $name $val]
- }
- }
- }