cod*_*ons 10 methods symbols identifier rakudo raku
使用当前的 Rakudo 编译器 (v2021.10),使用形式声明的符号::(\xe2\x80\xa6)不需要遵循标识符规则,即使它们声明例程的名称也是如此。
这意味着以下代码会产生指定的输出:
\nclass C { method ::("A method name that\'s also a sentence!") { say "this works"} }\nsub ::("\xe2\x98\xba") { say "also works" }\n\nC."A method name that\'s also a sentence!"(); # OUTPUT: \xc2\xabthis works\xc2\xbb\n&::("\xe2\x98\xba")(); # OUTPUT: \xc2\xabalso works\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n我的问题是这是否是有效的Raku /有意的功能,或者它是否是偶然的或 Rakudo 特定的东西。我在 Raku 文档中没有看到任何提及此语法的内容,也没有看到 Roast 测试涵盖创建这样的符号。
\n(有一个关于在符号引用中使用特殊字符的有点相关的Roast测试。但是,除了不直接切中要点之外,该测试还包含稍微无用的评论“注意:我不能 100% 确定这是合法的”语法”。该注释(以及该测试)是在 13 年前添加的,因此该领域似乎并未引起太多关注。)
\n我问的部分原因是,如果合法/有意,这种语法似乎在特定情况下非常有用(特别是对于方法,其中调用语法更好)。它让我想起了一点Kotlin 的语法 `for allowing spaces in backtick delimited method names`。因此,如果它是 Raku 的一部分,我想使用此语法(谨慎!)并将其添加到文档中。
Jon*_*ton 13
简而言之,是的,这是合法的。
标识符的概念是一个语法概念:在解析 Raku 时,解析器需要对其看到的事物进行分类,标识符规则指示应将哪些字符序列识别为标识符。
相比之下,存储、方法表和词法作用域最终都是类似散列的数据结构:它们将字符串键映射到存储的值。正如可以将哪些键放入哈希中一样没有限制,这里也没有限制。鉴于元对象可以是用户定义的,目前尚不清楚是否可以可靠地强制执行限制,即使它被认为是可取的。
声明性上下文中的间接名称语法::(...)仅存在这样的限制:您放置的内容必须是编译时常量。就解析而言,括号内的内容是一个表达式。编译器想要获取一个可用于在某处安装符号的字符串;对于标识符,它直接来自程序源文本,而对于间接名称语法,则通过评估在那里找到的常量。在任何一种情况下,它都用于在符号表中创建条目,而这些条目并不关心,因此在两者之间,您有一种方法来获取没有标识符语法的符号表条目。