Version 0 of Tip187 in pure Tcl

Updated 2004-04-22 23:40:01

# Pure Tcl implementation of TIP 187 (Procedures as Values)

 # Copyright(C) 2004 Salvatore Sanfilippo <antirez (at) invece (dot) org>
 # Under the Same license as Tcl8.4

 namespace eval tip187 {set counter 0}
 rename unknown tip187::unknown

 proc unknown args {
    set func [lindex $args 0]
    set funcargs [lrange $args 1 end]
    if {[llength $func] == 3 && [lindex $func 0] eq {lambda}} {
        set c [incr ::tip187::counter]
        set t [list proc ::tip187::lambda$c [lindex $func 1] [lindex $func 2]]
        if {![catch {uplevel $t}]} {
            set retval [uplevel ::tip187::lambda$c $funcargs]
            rename ::tip187::lambda$c {}
            return $retval
        }
        catch {rename ::tip187::lambda$c {}}
    } else {
        uplevel ::funcval::unknown $args
    }
 }

 proc lambda {arglist body} {
    list lambda $arglist $body
 }