0

SML プログラムを作成していて、エスケープ シーケンスを含む文字列をエスケープ シーケンスを含まない文字列に変換しようとしています。

私はこれを試しましたが、うまくいかないようです(単に印刷します"Hello "

fun test x  =
let val esc = "Hello \\  Bob \n Newman"
    val fixed = String.fromString esc
in
    print (valOf(fixed))
end

関数を使用する必要があるかもしれないと思いますがString.scan、その仕組みが正確にはわかりません。

関数のシグネチャは

scan       : (char, 'a) StringCvt.reader
                   -> (string, 'a) StringCvt.reader

だから私はいくつかの質問があります:

1) このスキャン署名が何を言っているのか正確に説明できますか...関数はどのような引数を取り、何を返しますか?

2) これは私が使用すべき機能ですか?

3) この機能を使用する際のガイダンスを教えてください。ありがとう

編集:わかりました、上記の例は単純化しましたが、単純化しすぎた可能性があります...これがまさに私がやっていることです。と呼ばれるグローバル文字列とstr、文字/文字列の入力ストリームがあります...入力ストリームを読み取るときに、読み取ったstrばかりの文字と連結します。すべての文字を読み取った後、戻りたいのですstrが、すべてのエスケープ シーケンスが変換されています。

4

2 に答える 2

1

PolyML を起動して、次のことを試しました。

Poly/ML 5.5.0 Release
> val a = "Hello \\ Bob \n Newman";
val a = "Hello \\ Bob \n Newman": string
> print a;
Hello \ Bob 
 Newmanval it = (): unit
> print (String.toString a);
Hello \\ Bob \n Newmanval it = (): unit
>

つまり、エスケープ シーケンスはデフォルトで、それらが表す文字として既に解釈されており、String.toString特殊文字を「エスケープ解除」する必要があります (元のエスケープ シーケンスを含む文字列を取得します)。または、Andreas が示したように、エスケープ シーケンス自体を使用してエスケープ シーケンスをエンコードすることもできます。

于 2013-02-01T23:32:11.477 に答える
1

あなたの例で発生するエスケープの量について混乱しているようです。

あなたが書くとき

val s1 = "Hello \n world!"

その場合、エスケープは SML パーサーによって既に解釈されており、s1それ自体には実行時に何も含まれません。文字列をそのまま印刷できます。

実行時に実際にエスケープを含む文字列は、たとえば次のようになります。

val s2 = "Hello \\n world!"

ここでは、SML パーサー\\が (単一の) スラッシュに解釈するためです。s2その後、を使用して実行時に変換しString.fromString、 と同じ文字列を生成できますs1

例に戻ってesc、ランタイム文字列を示します

Hello \  Bob 
 Newman

スラッシュの後にスペースが続きます。これは有効なエスケープ シーケンスではないため、String.fromStringその「解析」エラーまでの文字列のみを変換します (これは、fromStringSML のすべての関数のセマンティクスです。基になるscan関数を直接使用すると、残りの文字列も返されます)。

于 2013-02-02T11:01:24.107 に答える