首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用SML编写多行字符串?

如何用SML编写多行字符串?
EN

Stack Overflow用户
提问于 2022-01-17 02:27:10
回答 2查看 127关注 0票数 0

如何编写跨越多行的字符串?

像许多其他语言一样,我试图在末尾使用行延续字符\,但它似乎不起作用。以下内容如下:

代码语言:javascript
运行
复制
val s = "line1\
line2";

生成一个错误:

代码语言:javascript
运行
复制
/tmp/...:1: error: unexpected character l in \ ... \
/tmp/...:1: error: no matching quote found on this line

不使用任何行的连续(如下所示)会产生类似的错误:

代码语言:javascript
运行
复制
val s = "line1
line2";

写多行字符串的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-17 03:00:37

您还必须将反斜杠放在下一行的开头:

代码语言:javascript
运行
复制
print "this is\
\ a string on\
\ 3 lines\n";
票数 2
EN

Stack Overflow用户

发布于 2022-01-17 11:21:34

如果您使用的是SML/NJ,并且不太关心可移植性,那么有一个不太为人所知的特性,它不仅可以为您提供多行字符串,还可以为您提供变量内插。SML/NJ支持一种可扩展的报价机制,下面将对此进行更详细的描述:https://www.smlnj.org/doc/quote.html

现在,为了解决您的问题,我们可以定义以下引号解析器。我称它为s,是为了与Scala的s"..."语法进行比较,这一点很快就会变得更加清晰。

代码语言:javascript
运行
复制
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结构访问编译器特定的数据类型和值(fragQUOTEANTIQUOTE)。

现在我们可以这样使用上面的内容(确保您使用的是命令行选项-Cparser.quotations=true):

代码语言:javascript
运行
复制
$ 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中获得多行内插字符串。

在我的个人图书馆中,我用一种更结构化的方式来定义它:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70735887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档