# Testing flexible return of lots of values without temporary accumulating them locally # proc test {args} { set i 0 set args [dict merge [dict create cmd {} somethingelse abc nochwas def] $args] # Returning some example Values foreach {id path} {1 test1 2 test2 3 test3} { uplevel [format [dict get $args cmd] $id $path] incr i } return $i } proc callback {arg1 arg2} { puts "$arg1 $arg2" } puts [test cmd {lappend liste %s %s}]; # building a list puts $liste puts [test cmd {set arr(%s) %s}]; # building an array out of the values parray arr puts [test cmd {callback %s %s}]; # calling a callback to do something else puts [test cmd {puts "Test: %s %s"}]; # outputting (another callback) puts [test cmd {dict set d %s %s}]; # building a dictionary puts $d # A wrapper (but overhead) proc testAsList {} { test cmd {lappend liste %s %s} return $liste } puts [testAsList] # Alternative: specifying type of return and rewriting own proc accordingly (to be cont'd later) # Testing coros puts [coroutine t test cmd {yield "%s %s"}]; # despite of UPLEVELing yield, it works :-D puts [t] puts [t] puts [t] puts "[catch {puts [t]} ret] $ret"
pyk 2019-11-20: See also, Iterator Protocol and ycl coro call.