Posted to tcl by aspect at Thu May 11 11:01:59 GMT 2017view raw

  1. # nested foreach.
  2. proc foreach* {args} {
  3. set script [lindex $args end]
  4. set args [lrange $args 0 end-1]
  5. set dictval [concat {*}[lmap {k _} $args {string cat "[list $k] \[set [list $k]\]"}]]
  6. set script "set values \[dict create $dictval\]\n $script"
  7. foreach {b a} [lreverse $args] {
  8. set script [list foreach $a $b $script]
  9. }
  10. tailcall {*}$script
  11. }
  12. foreach* {*}{
  13. compartment {5compt}
  14. generator {one two three}
  15. switchboard {on two three}
  16. } {
  17. puts [list PERMUTATION {*}$values]
  18. }
  19.