diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-10-22 21:43:51 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-11-24 09:41:09 +1000 |
commit | 67cfaf5449800e49524377ccb61f6c8221f515dd (patch) | |
tree | a76ddd3598108a5f1959fc8b3027a138f8336532 /stdlib.tcl | |
parent | 96466972c70a61becc8c332d0b991038ab7028f1 (diff) | |
download | jimtcl-67cfaf5449800e49524377ccb61f6c8221f515dd.zip jimtcl-67cfaf5449800e49524377ccb61f6c8221f515dd.tar.gz jimtcl-67cfaf5449800e49524377ccb61f6c8221f515dd.tar.bz2 |
Add support for [dict] size, merge, with
Implement 'dict with' and 'dict merge' as scripts since this is simpler.
Use 'dict size' to implement 'array size'
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'stdlib.tcl')
-rw-r--r-- | stdlib.tcl | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -113,3 +113,38 @@ proc {info nameofexecutable} {} { } return "" } + +# Script-based implementation of 'dict with' +proc {dict with} {dictVar args script} { + upvar $dictVar dict + set keys {} + foreach {n v} [dict get $dict {*}$args] { + upvar $n var_$n + set var_$n $v + lappend keys $n + } + catch {uplevel 1 $script} msg opts + if {[info exists dict] && [dict exists $dict {*}$args]} { + foreach n $keys { + if {[info exists var_$n]} { + dict set dict {*}$args $n [set var_$n] + } else { + dict unset dict {*}$args $n + } + } + } + return {*}$opts $msg +} + +# Script-based implementation of 'dict merge' +# This won't get called in the trivial case of no args +proc {dict merge} {dict args} { + foreach d $args { + # Check for a valid dict + dict size $d + foreach {k v} $d { + dict set dict $k $v + } + } + return $dict +} |