Posted to tcl by bairui at Fri Apr 06 10:20:28 GMT 2018view raw
- #!/usr/bin/env tclsh
- namespace eval ::shadowdict {
- namespace export create
- namespace ensemble create
- proc create {var args} {
- upvar 1 $var d
- set ns [uplevel 1 namespace current]::
- set d [::tcl::dict::create {*}$args]
- proc $ns$var {args} {
- set ns [uplevel 1 namespace current]::
- set rest [lassign $args cmd]
- set d_var $ns[lindex [info level 0] 0]
- if {$cmd in {exists filter for get info \
- keys map merge remove replace size values}} {
- upvar 1 $d_var d_val
- set d $d_val
- } else {
- set d $d_var
- }
- if {$cmd in {for map}} {
- set rest [lassign $rest varlist]
- dict $cmd $varlist $d {*}$rest
- } else {
- dict $cmd $d {*}$rest
- }
- }
- return $d
- }
- }
- namespace eval baz {
- set key foo
- set value bar
- shadowdict create d sim za
- d set $key $value
- d set bog buzz
- puts [d get $key]
- d for {k v} {puts "$k -> $v"}
- puts [d map {k v} {string length "$v"}]
- }