lproc

lproc is like proc, except that the body is a list of lists and no string representation of the body is generated.

See Also

ycl proc lproc
The implementation of lproc shown below.
Playing newLISP
Employs a similar pattern.

Implementation

proc lproc {name args list} {
    uplevel 1 [list ::interp alias {} [namespace current]::$name {} ::apply [
        list [list list {*}$args] {
            ::apply [list {} {
                upvar 1 list list 
                ::foreach line $list[unset list] {
                    if {[catch {::uplevel 1 $line} cres copts]} {
                        dict incr copts -level
                        return -options $copts $cres
                    }
                }
            } [namespace current]]
        } [uplevel 1 {namespace current}]
    ] $list]
}