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

What counts as a newline for Raku *source* files?

我有点惊讶地发现下面的代码

# comment 
say 1;
# comment 
say 2;
# comment say 3;
# comment say 4;

打印 1234

这里是“#comment”后的相关字符:

say "

".uninames.raku;
# OUTPUT: «("PARAGRAPH SEPARATOR", "LINE SEPARATOR", "<control-000B>", "<control-000C>").Seq»

请注意,其中 many/all 个字符在大多数字体中是不可见的。至少对于我的编辑器,none 导致以下文本在新行上打印。并且至少有一个(<control-000C>,又名 Form Feed,有时打印为 ^L)在 Vim/Emacs 中被广泛用作部分分隔符。

这提出了几个问题:

  1. 这是故意的还是错误?
  2. 如果是故意的,用例是什么(除了赢得混淆代码竞赛!)
  3. 是只有这4个字,还是还有其他的? (我找到这些是因为它们共享 mandatory break Unicode 属性。是否 属性(或其他一些 Unicode 属性?)管理 Raku 认为的换行符?)
  4. 只是,真的,哇。

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

Raku 的语法定义为 Raku 文法。解析这样一条评论的规则是:

token comment:sym<#> {
   '#' {} \N*
}

也就是说,它吃掉 # 之后不是换行符的所有内容。与 Raku 中的所有内置字符 类 一样,\n 及其否定是 Unicode 识别的。 language design docs 状态:

\n matches a logical (platform independent) newline, not just \x0a. See TR18 section 1.6 for a list of logical newlines.

这是对Unicode standard for regular expressions的引用。

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