如何编写跨越多行的字符串?
像许多其他语言一样,我试图在末尾使用行延续字符\
,但它似乎不起作用。以下内容如下:
val s = "line1\
line2";
生成一个错误:
/tmp/...:1: error: unexpected character l in \ ... \
/tmp/...:1: error: no matching quote found on this line
不使用任何行的连续(如下所示)会产生类似的错误:
val s = "line1
line2";
写多行字符串的正确方法是什么?
发布于 2022-01-17 03:00:37
您还必须将反斜杠放在下一行的开头:
print "this is\
\ a string on\
\ 3 lines\n";
发布于 2022-01-17 11:21:34
如果您使用的是SML/NJ,并且不太关心可移植性,那么有一个不太为人所知的特性,它不仅可以为您提供多行字符串,还可以为您提供变量内插。SML/NJ支持一种可扩展的报价机制,下面将对此进行更详细的描述:https://www.smlnj.org/doc/quote.html
现在,为了解决您的问题,我们可以定义以下引号解析器。我称它为s
,是为了与Scala的s"..."
语法进行比较,这一点很快就会变得更加清晰。
val s : string SMLofNJ.frag list -> string =
let
fun fold (SMLofNJ.QUOTE s, acc) = acc ^ s
| fold (SMLofNJ.ANTIQUOTE s, acc) = acc ^ s
in
List.foldl fold ""
end
注意,它使用SMLofNJ
结构访问编译器特定的数据类型和值(frag
、QUOTE
和ANTIQUOTE
)。
现在我们可以这样使用上面的内容(确保您使用的是命令行选项-Cparser.quotations=true
):
$ sml -Cparser.quotations=true
- val a = "var";
val a = "var" : string
-
- val b = `this is a raw quotation using ^a`;
val b = [QUOTE "this is a raw quotation using ",ANTIQUOTE "var",QUOTE ""] :
string SMLofNJ.frag list
-
- val c = s`this is an interpolated string: ^a`;
val c = "this is an interpolated string: var" : string
-
- print c;
this is an interpolated string: varval it = () : unit
-
- val d = s`this
… is
… a
… multiline string: ^a`;
val d = "this\nis\na\nmultiline string: var" : string
-
- print d;
this
is
a
multiline string: varval it = () : unit
如您所见,结合一个非常简单的自定义解析器( s
函数)使用引号,我们可以在SML/NJ中获得多行内插字符串。
在我的个人图书馆中,我用一种更结构化的方式来定义它:
structure Strings =
struct
structure Interpolated =
struct
local
open SMLofNJ
in
(**
* Support for multiline, interpolated strings.
*
* NB: requires SML/NJ quotations: sml -Cparser.quotations=true.
*
* ```sml
* - open Strings.Interpolated;
* - val v = "val";
* val v = "val" : string
* - val j = s`{
* = "key": "^v"
* = }`;
* val j = "{\n \"key\": \"val\"\n}" : string
* ```
*)
val s : string frag list -> string =
let
fun fold (QUOTE s, acc) = acc ^ s
| fold (ANTIQUOTE s, acc) = acc ^ s
in
List.foldl fold ""
end
end
end
end
https://stackoverflow.com/questions/70735887
复制相似问题