Мне нужно разобрать входные потоки из сокета. Данные отправляются от клиента Telnet, и поэтому я хочу обработать входящие строки, найдя в потоке первый символ '\r'
, затем выберем байты перед возвратным символом и, наконец, обработаем любые цифры '\b'
.Анализ входящего потока TCP из символов Ascii, handle backspace char
Каким будет идиоматический способ иметь дело с битами '\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
Ах да, он должен быть не сложен, не понял разницы в f # –
@RyanWGough 'reduce' похож на' fold', но он падает, когда вход пуст. –
Спасибо, удивительный, это именно то, что я искал. –