ソケットから入力ストリームを解析する必要があります。 データはTelnetクライアントから送信されます。したがって、ストリーム内の最初の'\r'
文字を見つけて、戻り文字の前のバイトを選択し、最後にbackspace
'\b'
文字を処理することによって、受信した文字列を処理します。Asciiの入力TCPストリームの解析、バックスペース文字の処理
ここで'\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'と似ていますが、入力が空のときにクラッシュします。 –
ありがとう、素晴らしい、それはまさに私が探していたものです。 –