Version 11 of dict tips and tricks

Updated 2008-06-09 12:26:47 by LV

dicts are just like name value pair lists (but you shouldn't rely on any particular order of the pairs!) RS 2008-06-09: In fact, this is no longer true - from 8.5.1 or so, dicts have a "chronological" order - each added element appears at the end. So you can even apply custom sorting of dict keys for display purposes:

 proc dict'sort {dict args} {
    set res {}
    foreach key [lsort {*}$args [dict keys $dict]] {
        dict set res $key [dict get $dict $key] 
    }
    set res
 }

#-- Test:

 set d1 {foo 1 bar 2 grill 3}
 puts 1:[dict'sort $d1]             ;# 1:bar 2 foo 1 grill 3
 puts 2:[dict'sort $d1 -decreasing] ;# 2:grill 3 foo 1 bar 2

Just like the results of [array get], so you can [array set X [dict filter]]] or (conversely) [dict get [array get X] key].

So, you can define a proc fred {args} and then immediately treat $args as a dict, if (and only if) the values passed have the form of a dict - no special processing is required (rather, the shimmering occurs in the background.

This is useful for passing named arguments to a proc, sort of like the various options packages: [dict get $args -option] will fetch any value passed as -option value.

[dict with] alters the enclosing scope

So if you have a dict X, [dict with X {}] will construct and initialize variables with the same names and values as X's contents.

This is useful for passing around collections of named values.

You could use it to populate the variables in a namespace (for, say, a collection of defaults) [namespace eval dict with $dv {}]