You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.9 KiB
73 lines
2.9 KiB
2 years ago
|
proc pipedata {data args} {
|
||
|
#puts stderr "'$args'"
|
||
|
set r $data
|
||
|
for {set i 0} {$i < [llength $args]} {incr i} {
|
||
|
set e [lindex $args $i]
|
||
|
if {[catch {llength $e} seglen]} {
|
||
|
#not a list - assume script and run anyway
|
||
|
set r [apply [list {data} $e] $r]
|
||
|
} else {
|
||
|
if {[llength $e] == 1} {
|
||
|
if {$e eq {>}} {
|
||
|
#output to calling context. only pipedata return value and '> varname' should affect caller.
|
||
|
incr i
|
||
|
uplevel 1 [list set [lindex $args $i] $r]
|
||
|
} elseif {$e in {% pipematch ispipematch}} {
|
||
|
incr i
|
||
|
set e2 [lindex $args $i]
|
||
|
#set body [list $e {*}$e2]
|
||
|
#append body { $data}
|
||
|
|
||
|
set body [list $e {*}$e2]
|
||
|
append body { {*}$data}
|
||
|
|
||
|
|
||
|
set applylist [list {data} $body]
|
||
|
#puts stderr $applylist
|
||
|
set r [apply $applylist $r]
|
||
|
} elseif {$e in [list pipeswitch pipeswitchc]} {
|
||
|
#pipeswitch takes a script not a list.
|
||
|
incr i
|
||
|
set e2 [lindex $args $i]
|
||
|
set body [list $e $e2]
|
||
|
#pipeswitch takes 'args' - so expand $data when in pipedata context
|
||
|
append body { {*}$data}
|
||
|
#use applylist instead of uplevel when in pipedata context!
|
||
|
#can use either switchdata/data but not vars in calling context of 'pipedata' command.
|
||
|
#this is consistent with pipeswitch running in a % / .= pipeline which can only access vars in immediate calling context.
|
||
|
set applylist [list {data} $body]
|
||
|
#puts stderr $applylist
|
||
|
set r [apply $applylist $r]
|
||
|
} else {
|
||
|
#puts "other single arg: [list $e $r]"
|
||
|
append e { $data}
|
||
|
set r [apply [list {data} $e] $r]
|
||
|
}
|
||
|
} else {
|
||
|
set r [apply [list {data} $e] $r]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $r
|
||
|
}
|
||
|
|
||
|
set s " supercalifragilistichespiralitoso "
|
||
|
pipedata $s {string trim $data} {split $data {}} {lsort -unique $data} {join $data {}} > s \
|
||
|
{string length $data} > l
|
||
|
puts $s
|
||
|
puts $l
|
||
|
|
||
|
#test running of patternmatching pipelines within pipe*
|
||
|
set x [list a b blah etc]
|
||
|
puts "-1"
|
||
|
pipedata $x {,'a'@0/0= |@0> {puts $data; set data} <| $data} {val $data}
|
||
|
|
||
|
puts "-2"
|
||
|
pipedata $x {,'a'@0/0= |@0> {
|
||
|
puts $data
|
||
|
set data
|
||
|
} <| $data} {val $data}
|
||
|
|
||
|
pipeset pipe1 ,'a'@0/0= |/0-1> {puts $data; set data} |> string toupper <|
|
||
|
puts "-3"
|
||
|
pipedata $x pipematch $pipe1
|