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.
64 lines
1.5 KiB
64 lines
1.5 KiB
1 year ago
|
|
||
|
|
||
|
|
||
|
proc p_digit str {
|
||
|
if {[string is digit -strict [string index $str 0]]} {
|
||
|
return [list [string index $str 0] [string range $str 1 end]]
|
||
|
} else {
|
||
|
return [list]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
proc p_char {str ch} {
|
||
|
if {[string index $str 0] eq $ch} {
|
||
|
return [list [string index $str 0] [string range $str 1 end]]
|
||
|
} else {
|
||
|
return [list]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
proc parser_of_char {ch} {
|
||
|
pipeset outparser @@ok/result.= {
|
||
|
pipeswitch {
|
||
|
pipecase .= list $input $ch |data/0,char/1> \
|
||
|
,'${ch}'@0.= {p_char $data $char}
|
||
|
|
||
|
return [list ok [list result [list]]]
|
||
|
}
|
||
|
} <ch/0,input/1| $ch
|
||
|
}
|
||
|
|
||
|
proc some {parser} {
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
#generate a functor on a pipeline targeting a specific section of the 'value' in: ok {result value}
|
||
|
proc fmap {cmdlist pipeline} {
|
||
|
pipeset functor .= {
|
||
|
pipeswitch {
|
||
|
pipecase .= list $cmd $p $input |cmd@,pipe@,input@> \
|
||
|
,'result'@@ok/@0.= {
|
||
|
.= list $pipe $input |p@,i@> {{*}$p $i}
|
||
|
} |result@@ok/result> =result>1/1
|
||
|
|
||
|
return nothing-functor
|
||
|
}
|
||
|
} <cmd@,p@,input@| $cmdlist $pipeline
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
proc charP {ch} {
|
||
|
pipeset parser .= {
|
||
|
pipeswitch {
|
||
|
#puts "-->$input"
|
||
|
pipecase = $input |> \
|
||
|
,'${ch}'@0.= {list [string index $data 0] [string range $data 1 end] } |> {
|
||
|
set data
|
||
|
}
|
||
|
return nothing
|
||
|
}
|
||
|
} <ch/0,input/1| $ch
|
||
|
}
|