Ways to return values

# 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.