如何在SML中将转义序列转换为适当的字符?

时间:2013-02-01 23:25:18

标签: escaping sml

我正在编写一个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但是转换了所有转义序列。

2 个答案:

答案 0 :(得分: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所示。

答案 1 :(得分:1)

您似乎对您的示例中发生的转义量感到困惑。

写作时

val s1 = "Hello \n world!"

然后,转义已由SML解析器解释,s1本身在运行时不会包含任何转义。您可以按原样打印字符串。

实际上在运行时包含转义的字符串将是例如是

val s2 = "Hello \\n world!"

因为这里SML解析器将\\解释为(单个)斜杠。然后,您可以使用s2在运行时转换String.fromString,生成与s1相同的字符串。

回到你的例子,esc表示运行时字符串

Hello \  Bob 
 Newman

斜线后跟空格。这不是一个有效的转义序列,因此String.fromString仅将字符串转换为“解析”错误(即SML中所有fromString函数的语义 - 如果使用底层scan 1}}直接运行,你也可以找回其余的字符串。)