Devo analizzare i flussi di input da un socket. I dati vengono inviati da un client Telnet e pertanto desidero elaborare le stringhe in entrata trovando il primo carattere '\r'
nello stream, quindi selezionare i byte prima del carattere di ritorno e infine elaborare qualsiasi carattere backspace
'\b'
.Analizzare il flusso TCP in ingresso di caratteri Ascii, gestire il carattere di backspace
Quale sarebbe il modo idiomatico di gestire i bit '\b'
qui? Attualmente sto usando uno stack mutabile e spingo caratteri su di esso, e se c'è un backspace, inserisco l'ultimo carattere. Quindi basta trasformare il risultato in una stringa.
Ma immagino ci sia probabilmente un bel modo per farlo con il pattern matching e la ricorsione della coda. Quindi, come può essere fatto il modo 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
Ah sì, dovrebbe essere fold non ridurre, non aveva capito la differenza in f # –
@RyanWGough 'reduce' è simile a' fold', ma si blocca quando l'input è vuoto. –
Grazie, fantastico, è esattamente quello che stavo cercando. –