【发布时间】:2015-12-24 09:41:04
【问题描述】:
我需要解析来自套接字的输入流。
数据是从 Telnet 客户端发送的,因此我想通过在流中查找第一个 '\r' 字符来处理传入的字符串,然后选择返回字符之前的字节,最后处理任何 backspace '\b' 字符。
在这里处理'\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
【问题讨论】: