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

variable knittemplate {
    set body [string map @map@ @template@]
    tailcall eval $body
}

proc knit {name varnames body} {
    set proc [uplevel [
        list [namespace current]::knitbuild $name $varnames $body]]
    uplevel $proc
}

proc knitbuild {name varnames body} {
    variable knittemplate
    foreach varname $varnames {
        lappend mapparts [string map [list @varname@ [list $varname]] \
            {\${@varname@} "\[lindex [list [set @varname@]]]" #{@varname@} [set @varname@]}]
    }
    set map [string map [
        list @mapparts@ [join $mapparts { }]] {[list @mapparts@]}]
    set body [string map [list @map@ $map @template@ [
        list $body]] $knittemplate]
    list proc $name $varnames $body
}

set a 0
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} }