proc pipe* args { set r [uplevel 1 [lindex $args 0]] for {set i 1} {$i < [llength $args]} {incr i} { set e [lindex $args $i] if {[llength $e] == 1} { if {$e eq {>}} { incr i uplevel 1 [list set [lindex $args $i] $r] } else { set r [uplevel 1 [list $e $r]] } } else { set cmd {} set substdone 0 foreach arg $e { if {$arg eq {*}} { lappend cmd $r set substdone 1 } else { lappend cmd $arg } } if {$substdone == 0} { lappend cmd $r } set r [uplevel 1 $cmd] } } return $r } set s " supercalifragilisticexpialidocious " #set s " supercalifragilistichespiralitoso " pipe* {string trim $s} {split * {}} {lsort -unique} {join * {}} > s \ {string length} > l puts $s puts $l #test running of patternmatching pipelines within pipe* set x [list a b blah etc] pipe* {set x} {,'a'@0/0= |@0> {puts $data; set data} <| *} {val *} pipe* {set x} {,'a'@0/0= |@0> { puts $data set data } <| *} {val *}