lproc is like proc, except that the body is a list of lists and no string representation of the body is generated.
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] }