【问题标题】:Symbols that break the identifier rules, e.g. `sub ::("☺") { }`违反标识符规则的符号,例如`sub ::("☺") { }`
【发布时间】:2022-01-17 22:07:32
【问题描述】:

使用当前的 Rakudo 编译器 (v2021.10),以 ::(…) 形式声明的 symbols 不需要遵循 rules for identifiers,即使它们声明了例程的名称。

这意味着以下代码会产生指定的输出:

class C { method ::("A method name that's also a sentence!") { say "this works"} }
sub ::("☺") { say "also works" }

C."A method name that's also a sentence!"();  # OUTPUT: «this works»
&::("☺")();                                   # OUTPUT: «also works»

我的问题是这是否是有效的Raku/一个有意的功能,或者它是否是偶然的或特定的 Rakudo。我在 Raku 文档中没有看到任何提及此语法的内容,也没有看到 Roast 测试涵盖创建这样的符号。

(有一个有点相关的Roast test 关于在符号de引用中使用特殊字符。但是,除了不直接在点之外,该测试包含稍微无用的评论“注意:我不是 100% 确定这是合法的语法”。该评论(和该测试)是 13 多年前添加的,因此该领域似乎没有引起太多关注。)

我问的部分原因是,如果合法/有意,这种语法似乎在特定情况下可能非常有用(特别是对于调用语法更好的方法)。它让我想起了一点Kotlin's syntax`for allowing spaces in backtick delimited method names`。因此,如果它是 Raku 的一部分,我想使用这种语法(谨慎使用!)并将其添加到文档中。

【问题讨论】:

    标签: methods symbols raku identifier rakudo


    【解决方案1】:

    简而言之,是的,这是合法的。

    标识符的概念是一个句法概念:解析Raku时,解析器需要对它看到的东西进行分类,标识符规则表明哪些字符序列应该被识别为标识符。

    相比之下,存储、方法表和词法范围最终都是类似于哈希的数据结构:它们将字符串键映射到存储值。就像一个可以放入散列的键没有限制一样,这里也没有一个。鉴于元对象可以是用户定义的,因此尚不清楚是否可以可靠地实施限制,即使它被认为是可取的。

    声明性上下文中的::(...) 间接名称语法仅具有以下限制:您放在那里的内容必须是编译时常量。就解析而言,括号内的内容是一个表达式。编译器想要得到一个字符串,它可以用来在某处安装符号;使用标识符,它直接来自程序源文本,并通过评估在那里找到的常量来使用间接名称语法。在任何一种情况下,它都用于在符号表中创建一个条目,而那些并不关心,因此在两者之间,您可以获取没有标识符语法的符号表条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多