用 qq 括号分隔符不要在 Raku 中插入代码

Jus*_*Guy 6 quoting string-interpolation raku

对不起,如果这在某处记录,但我一直无法找到它。将大括号定界符与 一起使用时qq,不会插入代码:

qq.raku

#!/usr/bin/env raku

say qq{"Two plus two": { 2 + 2 }};
say qq["Two plus two": { 2 + 2 }];
Run Code Online (Sandbox Code Playgroud)
$ ./qq.raku 
"Two plus two": { 2 + 2 }
"Two plus two": 4
Run Code Online (Sandbox Code Playgroud)

显然,这没什么大不了的,因为我可以使用一组不同的分隔符,但我遇到了它并想我会问。

更新

正如@raiph 指出的那样,我忘了提出实际问题:这是它应该工作的方式吗?

Jon*_*ton 7

引用语言“nibbler”(通过引用字符串吃掉它的语法的一点)看起来像这样:

    [
        <!stopper>
        [
        || <starter> <nibbler> <stopper>
        || <escape>
        || .
        ]
    ]*
Run Code Online (Sandbox Code Playgroud)

也就是说,在我们看到塞子之前,先吃:

  • 一个启动器({你的情况下的开头),然后是一些内部的东西,然后是一个塞子(});这允许在字符串内部嵌套构造
  • 转义(并且闭包插值被认为是一种转义)
  • 任何其他字符

语法中的这种排序意味着所选引用开头/结尾的嵌套将始终胜过转义。这个问题是在语言设计的时候讨论过的;毕竟,我们可以对语法中的交替进行重新排序,使逃逸获胜。然而,总的来说,人们认为启动器/停止器的选择是比引用语言的一般属性更本地化的决定,因此应该优先。(这也与引用语言的构造方式一致:我们采用基本的引用字符串语法并将 starter/stopper 方法混合到其中。)