aboutsummaryrefslogtreecommitdiff
path: root/stdlib.tcl
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-10-22 21:43:51 +1000
committerSteve Bennett <steveb@workware.net.au>2010-11-24 09:41:09 +1000
commit67cfaf5449800e49524377ccb61f6c8221f515dd (patch)
treea76ddd3598108a5f1959fc8b3027a138f8336532 /stdlib.tcl
parent96466972c70a61becc8c332d0b991038ab7028f1 (diff)
downloadjimtcl-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.tcl35
1 files changed, 35 insertions, 0 deletions
diff --git a/stdlib.tcl b/stdlib.tcl
index fe406ed..84e9120 100644
--- a/stdlib.tcl
+++ b/stdlib.tcl
@@ -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
+}