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

  1. #!/usr/bin/env tclsh
  2.  
  3. namespace eval ::shadowdict {
  4. namespace export create
  5. namespace ensemble create
  6. proc create {var args} {
  7. upvar 1 $var d
  8. set ns [uplevel 1 namespace current]::
  9. set d [::tcl::dict::create {*}$args]
  10. proc $ns$var {args} {
  11. set ns [uplevel 1 namespace current]::
  12. set rest [lassign $args cmd]
  13. set d_var $ns[lindex [info level 0] 0]
  14. if {$cmd in {exists filter for get info \
  15. keys map merge remove replace size values}} {
  16. upvar 1 $d_var d_val
  17. set d $d_val
  18. } else {
  19. set d $d_var
  20. }
  21. if {$cmd in {for map}} {
  22. set rest [lassign $rest varlist]
  23. dict $cmd $varlist $d {*}$rest
  24. } else {
  25. dict $cmd $d {*}$rest
  26. }
  27. }
  28. return $d
  29. }
  30. }
  31.  
  32. namespace eval baz {
  33. set key foo
  34. set value bar
  35. shadowdict create d sim za
  36. d set $key $value
  37. d set bog buzz
  38. puts [d get $key]
  39. d for {k v} {puts "$k -> $v"}
  40. puts [d map {k v} {string length "$v"}]
  41. }
  42.