什么算作 Raku *源* 文件的换行符?

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;\n
Run Code Online (Sandbox Code Playgroud)\n

打印1234

\n

以下是“#comment”后的相关字符:

\n
say "\xe2\x80\xa9\xe2\x80\xa8".uninames.raku;\n# OUTPUT: \xc2\xab("PARAGRAPH SEPARATOR", "LINE SEPARATOR", "<control-000B>", "<control-000C>").Seq\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,许多/所有这些字符在大多数字体中都是不可见的。至少对于我的编辑器来说,没有一个会导致以下文本打印在新行上。至少有一个(<control-000C>,又名Form Feed,有时打印为^L)在 Vim/Emacs 中相当广泛地用作节分隔符。

\n

这提出了几个问题:

\n
    \n
  1. 这是故意的还是错误?
  2. \n
  3. 如果是故意的,那么用例是什么(除了赢得混淆代码竞赛!)
  4. \n
  5. 是只有这4个角色,还是还有其他角色?(我发现这些是因为它们共享强制中断Unicode 属性。该属性(或其他一些 Unicode 属性?)是否控制 Raku 认为的换行符?)
  6. \n
  7. 只是,真的,哇。
  8. \n
\n

(我意识到#4 在技术上不是一个问题,但我觉得有必要说一下)。

\n

Jon*_*ton 7

Raku 的语法被定义为 Raku 语法。解析此类评论的规则是:

token comment:sym<#> {
   '#' {} \N*
}
Run Code Online (Sandbox Code Playgroud)

也就是说,它会吃掉除#换行符之外的所有内容。与 Raku 中的所有内置字符类一样,\n它的否定是 Unicode 感知的。语言设计文档指出:

\n 匹配逻辑(与平台无关)换行符,而不仅仅是 \x0a。有关逻辑换行符的列表,请参阅 TR18 第 1.6 节。

这是对正则表达式的 Unicode 标准的引用。

我有点怀疑是否曾经有过类似“让我们在 Unicode 中启用所有类型的换行符,这会很酷!”这样的特定语言设计讨论。相反,决定是 Raku 应遵循 Unicode 正则表达式技术报告,并且 Raku 语法将根据 Raku 语法进行定义,从而利用 Unicode 感知的字符类。支持一系列不同的换行符是始终遵循这些原则的结果。

  • 我想我们只需要其他人像我一样在代码审查中对遗留注释掉的代码脾气暴躁。:-) (2认同)