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

Brace Delimiters with qq Don't Interpolate Code in Raku

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

qq.raku

#!/usr/bin/env raku

say qq{"Two plus two": { 2 + 2 }};
say qq["Two plus two": { 2 + 2 }];
$ ./qq.raku 
"Two plus two": { 2 + 2 }
"Two plus two": 4

显然,这没什么大不了的,因为我可以使用一组不同的定界符,但我 运行 跨过它并认为我会问。

更新

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

Obviously, this isn't a big deal since I can use a different set of delimiters, but I ran across it and thought I'd ask.

你什么都没问。 :)

假设您收到了一些短信。并且您想使用双引号处理来进行插值,除非您不希望将大括号文本作为代码进行插值。你可以写,比方说,qq:!c '...'。但是你不觉得这样更容易记忆、书写和阅读吗qq{ ... }

漂亮的小触感,对吧?

这就是为什么它是现在这样的原因 -- 触感非常好。

也许还有为什么它没有记录在案 -- 它很少,而且一旦遇到它,您需要做什么就很明显了。

也就是说,Q 语言转义包括递归重新输入 Q 语言的转义:

say qq{"Two plus two": \qq[{ 2 + 2 }] }; # "Two plus two": 4 

这是否回答了您的问题? :)

引号语言“nibbler”(通过引号字符串吞噬的语法位)如下所示:

    [
        <!stopper>
        [
        || <starter> <nibbler> <stopper>
        || <escape>
        || .
        ]
    ]*

也就是说,直到我们看到一个塞子,吃哪个先到:

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

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