Potrzebuję przeanalizować strumienie wejściowe z gniazda. Dane są wysyłane z klienta Telnet, a zatem chcę przetworzyć ciągi przychodzące, znajdując pierwszy znak '\r'
w strumieniu, a następnie wybierz bajty przed zwracaniem znaku i ostatecznie przetworzyć dowolny znak backspace
'\b'
.Parsowanie przychodzącego strumienia TCP znaków Ascii, uchwyt Backspace char
Jaki byłby idiomatyczny sposób radzenia sobie z bitami '\b'
tutaj? Aktualnie używam stosu zmiennego i wciskam na niego znaków, a jeśli jest tam backspace, wyskakuję ostatni znak. Następnie wystarczy przekształcić wynik w ciąg znaków.
Ale myślę, że jest prawdopodobnie jakiś dobry sposób, aby to zrobić z dopasowaniem do wzorca i rekurencją ogona. Jak można to zrobić w sposób F #?
let receiveInput (inputBuffer:StringBuilder) (received:Tcp.Received)=
let text = Encoding.ASCII.GetString(received.Data.ToArray());
inputBuffer.Append(text) |> ignore
let all = inputBuffer.ToString()
match all.IndexOf('\r') with
| enter when enter >= 0 ->
let textToProcess = all.Substring(0,enter)
inputBuffer.Remove(0,enter+2) |> ignore
//this is the part I'm wondering about
let stack = new Stack<char>()
for c in textToProcess do
if c = '\b' then stack.Pop() |> ignore
else stack.Push c
let input = new System.String(stack |> Seq.rev |> Seq.toArray)
Some(input)
| _ ->
None
Ach tak, powinno się spasować, nie zmniejszać, nie zdawałem sobie sprawy z różnicy w f # –
@RyanWGough 'reduce' jest podobne do' fold', ale ulega awarii, gdy wejście jest puste. –
Dzięki, niesamowite, właśnie tego szukałem. –