违反标识符规则的符号,例如 `sub ::("☺") { }`。

10

当前使用的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测试,涉及在符号引用中使用特殊字符。但是,除了不直接相关之外,该测试还包含“注意:我不确定这是否是合法的语法”的略微无用的注释。那个注释(和那个测试)已经添加了13年以上,所以这个领域似乎没有引起太多关注。)
我之所以问,部分原因是因为,如果是合法/预期的,这种语法似乎在某些特定情况下非常有用(特别是对于方法,在那里调用语法更好)。它让我想起Kotlin的语法,允许在反引号括起来的方法名中使用空格。因此,如果它是Raku的一部分,我想要(适度地)使用这种语法并将其添加到文档中。

似乎也适用于我的Rakudo版本(2021.06)。 - jubilatious1
1个回答

12

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

标识符的概念是一个语法概念:在解析Raku代码时,解析器需要对所见到的内容进行分类,并且标识符规则指示需要被识别为标识符的字符序列。

相比之下,存储空间、方法表和词法作用域最终都是类似散列表的数据结构:它们将字符串键映射到存储的值上。就像散列表中没有限制可以放入哪些键一样,在这里也没有限制。由于元对象可以是用户定义的,即使考虑到其可取性,也不清楚能够可靠地强制实施限制。

在声明性上下文中,::(...)间接命名语法仅有一个限制,那就是你放置其中的必须是编译时常量。就解析而言,括号内部的内容是一个表达式。编译器希望得到一个字符串,以便将某个符号安装到某处;对于标识符,它直接来自程序源代码,而对于间接名称语法,则通过计算找到其中的常量。在任何情况下,都用于在符号表中创建一个条目,因此两者之间,你有一种获得没有标识符语法的符号表条目的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接