Posted to tcl by Poor Yorick at Fri Sep 12 02:08:54 GMT 2014view raw

  1. variable knittemplate {
  2. set body [string map @map@ @template@]
  3. tailcall eval $body
  4. }
  5.  
  6. proc knit {name varnames body} {
  7. set proc [uplevel [
  8. list [namespace current]::knitbuild $name $varnames $body]]
  9. uplevel $proc
  10. }
  11.  
  12. proc knitbuild {name varnames body} {
  13. variable knittemplate
  14. foreach varname $varnames {
  15. lappend mapparts [string map [list @varname@ [list $varname]] \
  16. {\${@varname@} "\[lindex [list [set @varname@]]]" #{@varname@} [set @varname@]}]
  17. }
  18. set map [string map [
  19. list @mapparts@ [join $mapparts { }]] {[list @mapparts@]}]
  20. set body [string map [list @map@ $map @template@ [
  21. list $body]] $knittemplate]
  22. list proc $name $varnames $body
  23. }
  24.  
  25. set a 0
  26. until {$a == 10} {puts {needs more a}; incr a}

Comments

Posted by Poor Yorick at Fri Sep 12 02:09:49 GMT 2014 [text] [code]

knit until {expr body} { while {!(#{expr})} ${body} }