RosettaCodeData/Task/Tokenize-a-string-with-escaping/Tcl/tokenize-a-string-with-escaping.tcl
2023-07-01 13:44:08 -04:00

34 lines
799 B
Tcl

oo::class create tokens {
constructor {s} {
puts [coroutine Next my Iter $s]
oo::objdefine [self] forward next Next
}
method Iter {s} {
yield [info coroutine]
for {set i 0} {$i < [string length $s]} {incr i} {
yield [string index $s $i]
}
return -code break
}
}
proc tokenize {s {sep |} {escape ^}} {
set part ""
set parts ""
set iter [tokens new $s]
while {1} {
set c [$iter next]
if {$c eq $escape} {
append part [$iter next]
} elseif {$c eq $sep} {
lappend parts $part
set part ""
} else {
append part $c
}
}
lappend parts $part
return $parts
}
puts [tokenize one^|uno||three^^^^|four^^^|^cuatro| | ^]