cod*_*ons 6 unicode comments newline rakudo raku
我有点惊讶地发现下面的代码
\n# comment \xe2\x80\xa9say 1;\n# comment \xe2\x80\xa8say 2;\n# comment say 3;\n# comment say 4;\nRun Code Online (Sandbox Code Playgroud)\n打印1、2、3和4。
以下是“#comment”后的相关字符:
\nsay "\xe2\x80\xa9\xe2\x80\xa8".uninames.raku;\n# OUTPUT: \xc2\xab("PARAGRAPH SEPARATOR", "LINE SEPARATOR", "<control-000B>", "<control-000C>").Seq\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n请注意,许多/所有这些字符在大多数字体中都是不可见的。至少对于我的编辑器来说,没有一个会导致以下文本打印在新行上。至少有一个(<control-000C>,又名Form Feed,有时打印为^L)在 Vim/Emacs 中相当广泛地用作节分隔符。
这提出了几个问题:
\n(我意识到#4 在技术上不是一个问题,但我觉得有必要说一下)。
\nRaku 的语法被定义为 Raku 语法。解析此类评论的规则是:
token comment:sym<#> {
'#' {} \N*
}
Run Code Online (Sandbox Code Playgroud)
也就是说,它会吃掉除#换行符之外的所有内容。与 Raku 中的所有内置字符类一样,\n它的否定是 Unicode 感知的。语言设计文档指出:
\n 匹配逻辑(与平台无关)换行符,而不仅仅是 \x0a。有关逻辑换行符的列表,请参阅 TR18 第 1.6 节。
我有点怀疑是否曾经有过类似“让我们在 Unicode 中启用所有类型的换行符,这会很酷!”这样的特定语言设计讨论。相反,决定是 Raku 应遵循 Unicode 正则表达式技术报告,并且 Raku 语法将根据 Raku 语法进行定义,从而利用 Unicode 感知的字符类。支持一系列不同的换行符是始终遵循这些原则的结果。