Posted to tcl by bairui at Fri Apr 06 10:20:28 GMT 2018view pretty

#!/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"}]
}