Posted to tcl by colin at Sun May 23 23:54:21 GMT 2010view raw
- # A combination of *dict with* and *apply*, this procedure creates a
- # new procedure scope populated with the values in the dictionary
- # variable. It then applies the lambdaTerm (anonymous procedure) in
- # this new scope. If the procedure completes normally, then any
- # changes made to variables in the dictionary are reflected back to
- # the dictionary variable, otherwise they are ignored. This provides
- # a transaction-style semantics whereby atomic updates to a
- # dictionary can be performed. This procedure can also be useful for
- # implementing a variety of control constructs, such as mutable
- # closures.
- #
- proc apply {dictVar lambdaExpr args} {
- upvar 1 $dictVar dict
- set env $dict ;# copy
- lassign $lambdaExpr params body ns
- if {$ns eq ""} { set ns "::" }
- set body [format {
- upvar 1 env __env__
- dict with __env__ %s
- } [list $body]]
- set lambdaExpr [list $params $body $ns]
- set rc [catch { ::apply $lambdaExpr {*}$args } ret opts]
- if {$rc == 0} {
- # Copy back any updates
- set dict $env
- }
- return -options $opts $ret
- }