抽象类§

通用计算机科学术语“抽象类”定义了类的接口API。在 Raku 中,这是使用带有存根方法的角色实现的。

role Canine {
    method bark { ... }          # the ... indicates a stub 
}
 
class Dog does Canine {
    method bark { say "woof" }   # *MUST* be implemented by class 
}

降临节日历§

在 Raku 的语境中,每年从 12 月 1 日到 25 日,每天发布一篇博客文章,可以在 https://raku-advent.blog 找到。

副词§

一般来说,副词是函数的命名参数。还有一些特定的语法形式允许副词被放置在一些方便的位置

q:w"foo bar";   # ":w" is a Quotelike form modifier adverb 
m:g/a|b|c/;     # ":g" is too 
@h{3}:exists;   # ":exists" is too, but is known as a subscript adverb 

副词通常用冒号对表示法表示,因此冒号对表示法也被称为副词对形式

:a(4)          # Same as "a" => 4

一些其他形式使用冒号的方式具有类似副词的语义,被称为副词形式。一种特殊形式以一个整数值开头,后面跟着一个名称(作为键)

:20seconds     # same as seconds => 20

另请参阅 冒号对和冒号列表

副词对§

对表示法的通用形式。它们都以冒号开头,如下面的示例所示

副词对对表示法
:foo<bar>foo => 'bar'
:foo(42)foo => 42
:42foofoo => 42
:$foofoo => $foo
:foofoo => True
:!foofoo => False

另请参阅 副词冒号对和冒号列表

同形异义词§

一种具有两个相关值的类型,这些值可能会根据上下文使用。例如 IntStr 同形异义词一个 Int 和一个 Str,因此它将被任何期望 IntStrIntStr 的东西接受。请记住,某些结构(例如 集合、包和混合)关心对象标识,因此不会接受同形异义词作为其组件的等效项。

同形异义词类型 IntStrNumStrRatStrComplexStr 可能是解析用尖括号引起来的字符串的结果

say <42>.^name;     # OUTPUT: «IntStr␤» 
say <42.1e0>.^name# OUTPUT: «NumStr␤» 
say <42.1>.^name;   # OUTPUT: «RatStr␤»

注意:尖括号也可以用来创建通常需要使用某些运算符(例如 Rat/Complex+)的字面量。这允许您在不允许表达式的地方使用此类字面量,例如,作为签名中的字面量

# Wrong, can't use an operator there: 
multi foo (1/3{ say "It's one third!" }
# Right, a Rat literal: 
multi foo (<1/3>{ say "It's one third!" }

如果您确实想要一个同形异义词而不是一个字面量 Numeric,那么在尖括号周围包含空格

say <42/1>.^name;    # OUTPUT: «Rat␤» 
say <42+0i>.^name;   # OUTPUT: «Complex␤» 
say < 42+0i >.^name# OUTPUT: «ComplexStr␤» 
say < 42/1 >.^name;  # OUTPUT: «RatStr␤»

有关如何使用这些变体形式的更完整描述,请参见 数字页面

匿名§

如果子例程、方法或子方法无法通过名称调用,则称为匿名

# named subroutine 
sub double($x{ 2 * $x };
 
# anonymous subroutine, stored in a named scalar 
my $double = sub ($x{ 2 * $x };

请注意,仍然允许它具有名称,但您不能通过该名称调用它。

# anonymous, but knows its own name 
my $s = anon sub triple($x{ 3 * $x }
say $s.name;        # OUTPUT: «triple␤» 
say triple(42);     # OUTPUT: «Undeclared routine: triple␤» 

API§

应用程序编程接口。理想情况下,使用您的系统或库的人应该能够仅凭对 API 的了解来做到这一点,而不必了解任何内部细节或实现细节。

另请参见 抽象类

启示录§

最初由 TimToady 编写的文档,他在其中处理了来自 Perl 社区的最初一批 RFC。现在仅作为历史参考文档保留。另请参见 释经概要

元数§

运算符、子例程、方法或可调用块期望的 位置 操作数的数量。

sub infix:<+>(Foo $aFoo $b{ $a.Int + $b.Int }  # arity of "+" is 2 
sub frobnicate($x{ ... }                         # arity of 1 
sub the-answer() { 42 }                            # arity of 0 
-> $key$value { ... }                            # arity of 2 

可调用对象的元数是 多重分派 中的主要选择器之一。

ASCII 运算符§

非 ASCII Unicode 运算符符号 的 ASCII 变体。例如,(elem) 对应于来自集合论的 (“这是该集合的元素吗?”)运算符。ASCII 运算符是解决人们还不知道如何输入 Unicode 的问题的变通方法。从文化上讲,虽然我们鼓励人们以一种模糊的方式使用 Unicode 符号,但我们并不贬低使用 ASCII 变体。好吧,也许只是一点点……

自动穿线§

如果您将 连接 传递给期望类型为 任何 或其子类型的参数的子例程(例如任何 ),则会发生自动穿线。然后对连接的每个值执行调用。这些调用的结果将组装在一个与原始连接类型相同的新的连接中。

sub f($x{ 2 * $x };
say f(1|2|3) == 4;    # OUTPUT: «any(False, True, False)␤»

这里 f() 是一个带有一个参数的子例程,并且由于它没有显式类型,因此它被隐式类型化为 任何。该 连接 参数导致 f(1|2|3) 调用在内部执行为 f(1)|f(2)|f(3),并且生成的连接为 2|4|6。然后将它们全部与 4 进行比较,从而得到一个连接 False|True|False。将连接参数分离为对函数的多个调用的过程称为自动穿线

如果您在布尔上下文中使用生成的连接,例如使用 if,它将折叠成一个单个布尔值,如果连接中的任何值都为 True,则该布尔值为 True

if f(1|2|3) == 4 {    # fires because f(2) == 4 is true 
    say 'success';
}

回溯§

回溯是正则表达式匹配的默认方式。引擎被允许探索几种在字符串字符中向后移动的方式,以允许正则表达式的每一部分匹配某些内容。有关更多信息,请参见 正则表达式回溯部分

绑定器§

当您将参数列表传递给函数(或任何其他可调用对象,如方法或块)时,参数列表将绑定到签名中的参数。执行此操作的代码称为绑定器

§

是具有自身词法范围的代码对象,这使得它们能够定义变量而不会干扰包含块中的其他变量。

字节码§

虽然 Raku 看起来像是一种解释型语言,因为它使用 #! 形式来运行其脚本(并且它们被称为脚本),但它实际上是 编译为在虚拟机中运行,因此编译器(目前是 Rakudo)生成 字节码,该字节码在 MoarVM 或 Java 虚拟机中运行,这两个虚拟机是目前支持的两个虚拟机。

山茶花§

一个蝴蝶图像,主要用于代表 Raku 语言。

冒号对和冒号列表§

冒号对是一种简写语法,用于创建或直观地呈现 Pair 对象。两种最常见的形式是

:a(4)          # Same as "a" => 4,   same as Pair.new("a", 4) 
:a<4>          # Same as "a" => "4", same as Pair.new("a", val("4"))

这也被称为副词对形式。

注意:当冒号之后和平衡分隔符之前的内容不是合法的标识符时,将应用其他语义,并非所有语义都会生成 Pair 对象。

另外两种常见的形式是

:a             # Same as :a(True) 
:!a            # Same as :a(False)

冒号列表只是意味着一个只包含冒号对的列表,不需要逗号,甚至不需要空格

:a(4):c:!d:c   # Same as a => 4, c => True, d => False, c => True

最后,如果存在与预期副词对同名的变量,则无需两次指定名称,只需使用适当的符号指定副词即可

仅变量与以下相同
:$foofoo => $foo
:@barbar => @bar
:%mappermapper => %mapper
:&testtest => &test

另请参阅 副词

社区§

有关如何参与友好的 Raku 社区的更多信息,请访问 https://raku.perl5.cn/community/

Damian Conway§

释经(以及许多其他内容)的最初作者。另请参阅 https://en.wikipedia.org/wiki/Damian_Conway

decont§

"decontainerize" 的缩写,表示从 Scalar 容器中 删除项目,通常是为了获得 具有该项目的不同行为

diffy§

请参阅 运算符。这意味着运算符结果的类型与它的参数有足够的差异,以至于 op= 几乎没有意义。

释经§

最初由 TheDamian 编写的文档,他在其中试图向普通(女)人解释 启示录。现在仅作为参考的历史文档保留。另请参阅 概要

前向声明§

使用 "存根" 运算符 声明函数实体(类或例程)的范围和/或类型,而无需实际声明其代码;代码将在同一文件中的后面声明。

grammar Quux {
    my regex future {...};
    say "foobarbaz" ~~ /<future>/;
    regex future { f \w** 2 b \w ** 2 }
}

在这种情况下,正则表达式充当方法;请注意,范围只声明一次。

fiddly§

对它应用元运算符过于复杂。请参阅 运算符

句柄§

句柄是一种数据结构,用于存储有关某些输入/输出操作的信息,例如文件或套接字的读写。Raku 使用 IO::Handle 作为文件句柄的基类,使用 IO::Socket 作为套接字的基类。

Huffmanize§

参考 霍夫曼编码,"霍夫曼化" 是指使常用事物更容易,通常更短地键入。对于不常使用的事物,键入更长的代码片段并不麻烦,而且通常需要更长、更具描述性的命名,以便轻松地记住很少使用的功能的作用。

例如,打印输出是一项常见的任务,而在原生原子安全整数上执行线程安全的原子加法则要少得多。需要对任务打印进行“霍夫曼编码”,这就是为什么你只需输入三个字母就可以执行 put。但没有必要对很少使用的原子操作进行“霍夫曼编码”,这就是为什么你输入更长的名称,例如 atomic-inc-fetch。名称 put 有点模糊,但由于它经常使用,所以很容易学习它的功能。另一方面,名称 atomic-inc-fetch 比较少见,更具描述性的名称有助于更好地回忆起它的用途。

iffy§

通常用作布尔值。参见 operator。通过 use 关键字 创建。

import§

将模块中的函数包含在当前命名空间中。

Instance§

类的实例在其他一些编程语言中也称为对象。它具有用于属性的存储空间,通常是调用名为 new 的方法或字面量的返回值。

大多数类型的实例被定义为 True,例如,defined($instance)True

my Str $str = "hello";  ## this is with built-in types, e.g. Str 
if defined($str{
    say "Oh, yeah. I'm defined.";
}
else {
    say "No. Something off? ";
}
 
## if you wanted objects... 
class A {
    # nothing here for now. 
}
 
my $an_instance = A.new;
say $an_instance.defined.raku;# defined($an_instance) works too.

换句话说,类包含方法和属性的蓝图,而实例将它带入现实世界。

Interface§

接口是一个 抽象类

Invocant§

调用者,调用或调用者。方法的调用者将是调用该方法的对象,或者在某些情况下,是类本身。调用者用于代替调用者,因为后者指的是作用域

IRC§

互联网中继聊天。Raku 开发人员和用户通常在 irc.libera.chat#raku 频道中闲逛。该频道也由许多友好的机器人填充,这些机器人允许你与 Raku 及其代码库进行交互,以及发送延迟消息和其他好东西。在 raku.org 的社区页面 中查看完整列表。

IRC lingo§

以下术语经常在与 Raku 相关的 IRC 频道中使用

ALAP§

尽可能晚

autopun§

自我引用的双关语,例如“你是无知还是冷漠?” - “我不知道,也不在乎。”

backlog§

你在 IRC 频道上错过的讨论部分。如果它不在你的 IRC 客户端中或不再可用,你可以访问 http://colabti.org/irclogger/irclogger_logs/raku 等网站查看为你记录的内容。

Bot§

一个程序,它通过像普通用户一样(就 IRC 服务器而言)在一个或多个 IRC 频道上执行自动任务,并执行一些可能涉及响应用户请求的任务。示例可以在 raku.org 的 IRC 页面 中找到。

Compilation unit or compunit§

一个 compunit> 是一个 Raku 代码片段,它被分析并编译为一个单独的单元。通常,这段代码将包含在一个单独的文件中,但 EVAL 中的代码也被认为是一个 compunit。

DWIM§

Do What I Mean。编程语言设计者的座右铭。DWIM 的反义词是 WAT

flap§

有时测试会在某些条件下失败,但在其他条件下不会;当测试在某些测试运行中通过而在其他测试运行中失败时,称为 flapping。

fossil§

在通常最新的文档中,不再真实但尚未通过更正或删除来修复的内容。

FSVO§

For Some Value Of...

FTFY§

Fixed That For You

gradual typing§

您不必指定变量和参数的类型,但如果您这样做,它有助于早期确定不可能的调度并更好地优化。另请参阅 https://en.wikipedia.org/wiki/Gradual_typing

IIRC§

If I Read (or Remember) Correctly.

IMHO§

In My Humble Opinion.

IWBN§

It Would Be Nice

LHF§

Low Hanging Fruit。通常用于指代由(相对)新手执行的(相对)简单的任务。

LGTM§

Looks Good To Me

LTA§

Less Than Awesome。通常用于指代描述性不强或与实际错误无关的错误消息。

NST§

No Such Thing

Opt§

“optimization” 的缩写,通常用于 spesh 或 JIT 的上下文中。

PB§

“problem” 的缩写。例如“那不是 pb”。

PR§

参见 Pull request

P5§

Perl 5

P6§

Raku(原名 Perl 6)

RSN§

Real Soon Now。

RT§

Request Tracker (https://rt.perl.org/)。所有与 Rakudo 相关的错误曾经存在的地方。如今,rakudo/rakudo 存储库的 Github 问题跟踪器被用于此目的。

TIMTOWTDI§

这是 TIMTOWTDI 的另一种形式,明确地包含了缩写词 "There's" 中的 "is"。

TMI§

信息过载。

TMTOWTDI§

"有多种方法可以做到",Perl 的座右铭。

UGT§

"通用问候时间" - 也就是说,永远是 "早上"。

WFM§

对我来说有效

WIP§

进行中

WP§

维基百科

WW§

wrong window 的缩写。在 IRC 上,有人在某个频道中输入了原本打算发到另一个频道或私信的内容。

Larry Wall§

Perl 的终身仁慈独裁者,以及其他许多身份。另请参见 https://en.wikipedia.org/wiki/Larry_Wall

Lexing§

执行 词法分析,通常在解析之前进行的一步。

Literal§

字面量 是代码的一部分,它直接代表一个(通常是内置的)对象,并且也指代该对象本身。

my $x = 2;      # the 2 is a literal 
say $x;         # $x is not a literal, but a variable 
my $s = "Foo";  # the "Foo" is a literal, the $s is a variable

不同类型的字面量在 语法文档 中有描述。

LHS§

作为首字母缩略词左侧,它通常指代表达式的左侧,更具体地说,指代表达式(如 $lhs = "this would be the right-hand side")的左侧。由于这些表达式的左侧会修改其值,因此当某事物表现为 LHS 时,意味着它可以被读取和写入。

lvalue§

lvalue左值 是任何可以出现在赋值运算符 = 左侧的东西。它是任何你可以赋值的东西。

典型的 lvalue 是变量、私有属性和 is rw 属性、变量列表和 lvalue 子例程。

lvalue 的示例

声明左值注释
my $x;$x
my ($a, $b);($a, $b)
has $!attribute;$!attribute仅在类内部
has $.attrib is rw;$.attrib
sub a is rw { $x };a()

非 lvalue 的示例

3字面量
constant x = 3;常量
has $.attrib;属性;你只能赋值给 $!attrib
sub f { }; f();"普通" 子例程不可写
sub f($x) { $x = 3 };错误 - 参数默认情况下是只读的

这些通常被称为 rvalue

Mainline§

mainline 是程序文本中不属于任何类型的块的部分。

use v6.c;     # mainline 
sub f {
              # not in mainline, in sub f 
}
f();          # in mainline again 

你也可以拥有任何类似包的声明符(如类、模块语法 等)的 mainline。这些通常在类/模块/语法编译后立即运行(或从预编译文件加载时运行)。

Mayspec§

代表 "Maybe Specification"。通常指代 语言规范 中现有的测试。说话者表示他们没有检查测试是 spectest 还是 propspec 测试;也就是说,测试是否包含在已发布的语言规范中,或者是一个新的测试,提议用于下一版本的规范。

MoarVM§

MoarVM 是 Metamodel On A Runtime Virtual Machine 的缩写。它是一个专门为 NQP 及其 MOP6model 设计的虚拟机。关于 MoarVM 目的 的文档。MoarVM 与 Hotspot VM 有一些相似之处,因此您可以查看其 词汇表 以查找本词汇表中缺少的条目。

多重分派§

用于调用相同名称的不同例程(MethodSub)的机制,根据 Parameter 原型和调用它的参数选择正确的例程。

选择过程主要基于类型和参数数量(元数),其中最窄、最具体的候选者获胜,通常不考虑声明顺序。is default 特性可用于此第一阶段的平局决胜。还存在一个次要阶段,其中一些不同的平局决胜者可能会根据方法或子例程的声明顺序进行评估。

多方法§

一个 方法,它有多个候选者使用相同的名称,并且受 多重分派 的影响。

Née§

"以前称为"。

NFG§

规范形式字素是 Raku 实现字素的方式,使用规范形式,其中具有相同字素的字符串可以在恒定时间内轻松比较。有关更多信息,请参阅 这些文章 在 6guts 中 以及关于 NFG 工作原理的有趣解释 此 IRC 日志

Niecza§

针对 .NET 平台的 Raku 实现。不再积极维护。

Not Quite Perl§

参见 NQP

NQP§

NQP 是一种用于使用 Raku 语法子集编写子例程和方法的原始语言。它并非旨在成为一种功能齐全的编程语言,也未提供超出基本 VM 原语的运行时环境。编译器(如 Rakudo)通常使用 NQP 来编译将解析树转换为等效抽象语法树表示的动作方法。

NYI§

尚未实现

操作码§

操作码或操作代码是字节码操作,即虚拟机实际使用的语言命令。它们通常不打算供人类使用,但通常会在某个地方指定,例如 MoarVM 的此文档

运算符§

表达式由运算符和操作数构成。更准确地说,它由一个运算符和操作数构成,操作数可以是子表达式或。运算符是多方法的另一种语法。使用这种语法,函数的参数将被命名为操作数。运算符被分类为类别。一个类别具有优先级、元数,并且可以是繁琐不确定差异。Raku 在运算符的定义上非常有创意,因此存在许多类别。运算符由多个标记组成,可能包含子表达式。例如,@a[0] 属于后缀类别,它被分解为操作数 @a 和后缀运算符 [0],其中 0 是后缀子表达式。

<O(I<...>)> 结构提供了有关运算符的信息,这些信息补充了其类别提供的信息。下面 %conditional 是类别,:reducecheck<ternary> 指定调用 .ternary 来后处理解析子树:pasttype<if> 指定从解析子树生成的 NQP 操作码

<O('%conditional, :reducecheck<ternary>, :pasttype<if>')>

解析树§

一个解析树表示根据语法对字符串或句子的结构进行解析。Raku 中的Grammar在成功匹配字符串时会输出解析树。

参数§

Parameter 是一个类,用于定义Sub例程、MethodCallable 块的参数。与调用子例程/方法/可调用块时指定的参数相反。

sub foo($bar{ say $bar }     # $bar is a parameter 
foo(42);                       # 42 is an argument

Parrot§

一个旨在运行 Raku 和其他动态语言的虚拟机。不再积极维护。

PAST§

Parrot AST。

Perl§

Perl 编程语言。

Perl 6§

2019 年 10 月之前 Raku 的名称。

PERL§

一种描述Perl作为语言的方式,被Perl 社区中的许多人认为是不合适的。

POD§

Plain Ol' Documentation,Raku 理解的一种文档格式。有关更多信息,请参见此处

POV§

代表“可行性证明”。要包含在语言规范中,该功能的“可行性证明”实现必须至少存在于一个基本符合规范的 Raku 编译器中。

Propspec§

代表“拟议规范”。通常指的是语言规范中现有的测试,这些测试被提议包含在下一个版本中。

拉取请求§

GitHub 和其他 git 托管平台(如GitLab)的一项功能,允许您使用 GitHub 网页用户界面轻松地应用补丁。这意味着您请求某人从您的存储库拉取到她的存储库。PR 是它的常用缩写。

预备§

预备(在其他编程语言中有时称为部分函数应用)是通过提供一些而不是全部参数来创建新函数的行为。例如,要创建一个函数,该函数接受一个参数并向其添加 42,您可以使用 42 作为单个参数来预备加法运算符:* + 42。参见Whatever 预备假设

property§

在本例中,它可以指代 对象属性,即实例变量的值,也可以指代 Unicode 属性,它是代码点的特征,允许程序识别它们代表的实体类型,例如,它们是字母、数字,还是完全不同的控制字符。

pugs§

pugs 是最早为 Raku 编写的解释器/编译器之一。它由 Audrey Tang 用 Haskell 编写。

QAST§

PAST 的继任者('Q' 是 'P' 的下一个字母)。

Rakudo§

Rakudo 是 Raku 实现的名称,它运行在 MoarVM 和 JVM 上。它是 Rakuda-do 的缩写,从日语翻译过来,意思是“骆驼之道”。此外,在日语中,“Rakudo” 意味着“天堂”。

Reify§

在英语中,reify 的意思是“将…转化为或视为具体事物”。它在 Raku 中的含义非常相似,因为像“无限列表的元素”这样的概念性事物,当你尝试对它们进行操作时会具体化。一般来说,具体化意味着将潜在元素(无论是尚未计算的延迟列表中的元素,还是尚未提取的容器中的元素)转换为其实际值。

Repository§

一个受源代码管理应用程序(通常是 git)控制的文件系统,它保存项目、库或应用程序的源代码。例如,本文件位于 GitHub 仓库 中。仓库不仅存储文件,还存储更改历史记录,并且可以由开发或写作团队用于通过问题或代码注释进行交互。

然而,在 Raku 上下文中,仓库也是编译单元仓库的简称,它构成一个定位和加载模块的系统,管理它们的安装和预编译。它们被组织为链接列表,包括以默认 Compunit::Repository::Installation 结尾的仓库链。

RHS§

右值(Right-Hand Side)的缩写,通常指赋值表达式(如 my $bound := $rhs)的右侧。

roast§

Raku 规范测试,位于:https://github.com/Raku/roast/。它最初是为 pugs 开发的,现在为所有 Raku 实现服务。为什么叫 roast?它是所有规范测试的repository of all spec tests。

Roles§

角色、mixin 或 trait 定义接口和/或这些接口的实现,以及使用它们的实例变量,并在声明遵循该接口的类时混合进来。 抽象类 是角色的特定示例,其中实际实现被推迟到使用该角色的类。

角色是 Raku 对象系统 的一部分,使用 role 关键字声明,并在类声明中使用 does

rvalue§

可以在赋值右侧使用的值。另请参见 lvalue

SAP§

代表“Specification APpendices”。SAP 包含可选测试,实现可以选择遵循,但并非必须。

可以用作动词。将某物SAP化是指将其放入规范附录中。

Semilist§

Semilist 是一个用分号分隔的列表,例如:1;3;5,实际上是一个列表的列表,其中 semilist 的每个组件都是特定维度的切片。@array[1;3;5] 等效于 @array[1][3][5]

Sigil§

在 Perl 中,sigil 是变量名的第一个字符。它必须分别是 $、@、% 或 &,分别代表 ScalarArrayHashCode 变量。另请参见 Twigil 和角色。此外,sigil 变量允许在双引号字符串中使用 变量插值 的简短约定,甚至允许以这种变量开头的后缀表达式。

Sigilless 变量§

无 sigil 变量 实际上是其分配给它们的值的别名,因为它们不是容器。一旦您分配了一个无 sigil 变量(使用转义符 \),它的值就无法更改。

Spesh§

MoarVM 平台的一项功能,它使用运行时收集的数据来改进常用的 字节码 部分。它很像 JIT 编译器,不同之处在于 JIT 编译器通常输出机器码而不是字节码。

STD§

STD.pm 是用于实现 Raku 的“标准”Raku 语法定义(参见 https://github.com/perl6/std/)。STD.pm 实际上不再是规范意义上的“规范”:它更像是一种 Raku 实现遵循的指南或模型。

Stub§

Stub 定义了方法的名称和签名,这些方法的实现被推迟到其他类。

role Canine {
    method bark { ... }          # the ... indicates a stub 
}

包含 stub 的类是 抽象类

Symbol§

表示名称的另一种奇特方式。通常在 模块 链接的上下文中使用,无论是在操作系统级别,还是在 Raku 虚拟机 级别,用于从针对这些 VM 的语言生成的模块。导入或导出的符号集称为符号表。

Synopsis§

Raku 语言的当前人类可读描述。仍在开发中。比 启示录释经 更像是社区的努力。语言的当前状态反映在 roast、它的 测试套件 中,而不是在概要中,在概要中,推测性材料并不总是被标记,或者最近的添加没有被记录。对于尚未实现的材料来说,这一点更是如此。

语法分析§

语法或句法分析等同于 解析 字符串以生成其 解析树

测试套件§

Raku 测试套件是 roast

TheDamian§

IRC 上的昵称,指的是 Damian Conway,最初 Exegeses 的作者。

TimToady§

IRC 上的昵称,指的是 Larry Wall,Perl 的创造者。这个名字来源于 TIMTOWTDI 的发音。

token§

在本例中,token 是一个不回溯的正则表达式。一般来说,tokens词法分析 过程中从源程序中提取。

Thunk§

一段不会立即执行的代码,但没有独立的作用域。

紧凑优先级和宽松优先级§

在本例中,紧凑或更紧凑指的是 优先级规则,与 宽松 相反。新术语的优先级规则总是相对于其他术语表达的,因此 更紧凑 意味着使用该运算符的操作数将优先于使用更宽松运算符的操作数进行分组。具有 紧凑优先级 的运算符优先于其他运算符进行分组,通常比大多数其他运算符更紧凑;宽松 正好相反,因此始终了解表达式中使用的所有运算符的精确优先级非常方便。

真值和假值§

如果一个值在布尔上下文中计算为 True,则该值为“真值”;如果计算为 False,则该值为“假值”。

例如,非空字符串被认为是 True,而空字符串被认为是 False

say so "";                    # OUTPUT: «False␤» 
say so "non-empty";           # OUTPUT: «True␤» 
 
say "truthy" if "non-empty";  # OUTPUT: «truthy␤» 

Numeric 在非零时被认为是 True

say so  0;                    # OUTPUT: «False␤» 
say so  1;                    # OUTPUT: «True␤» 
say so -1;                    # OUTPUT: «True␤» 
 
say "truthy" if -1;           # OUTPUT: «truthy␤» 
say 0 || "falsy";             # OUTPUT: «falsy␤» 

twine§

用于保存包含嵌入式格式代码的 POD 字符串的数据结构。例如

=begin pod
C<foo>
=end pod
say $=pod[0].contents[0].contents.raku;

输出将是

[""Pod::FormattingCode.new(type => "C"meta => [], config => {}contents => ["foo"]),""]

[1]

类型对象§

一个 类型对象 是一个用于表示类型或类的对象。由于在面向对象编程中一切都是对象,类也是对象,它们继承自 Mu

类型表情§

一个 类型表情 是类型可能具有的后缀,它指示可以与之进行类型检查的值的确定性。这可能是 :D,表示只有定义的值可以进行类型检查(即实例),:U,表示只有未定义的值可以进行类型检查(即类型对象),或者 :_,表示定义和未定义的值都可以进行类型检查。这些类似于表情符号,因此得名。

§

值是实际存储在容器(如变量)中的内容。用于诸如 左值 之类的表达式,以指示该特定容器可以被赋值。

UB§

代表“未定义行为”。换句话说,它是语言规范没有明确指定的内容。

值类型§

如果一个类型是不可变的,并且该类型的任何实例都可与任何其他“具有相同值”的实例互换,则该类型被称为 **值类型**——也就是说,任何以相同方式构造的实例。值类型的实例通常被称为 **值**(但不要与 左值右值 混淆)。

例如,数字是值类型,因此在程序中某个地方使用字面量 3 创建的数字无法以任何方式更改——它仅仅是 3——并且以后对字面量 3 的任何使用都可以安全地指向内存中的同一位置,而不会产生任何不良后果。

执行 NumericStringy 角色的类是内置值类型的一些示例。

值类型是通过确保值类型的实例是不可变的(即,在构造后无法修改其属性)以及其 WHICH 方法在每次构造具有相同值的实例时都返回相同的值(反之,在每次构造具有不同值的实例时都返回不同的值)来创建的。

该语言可以根据值类型的等效实例是可以互换的假设进行优化,但你不应该依赖任何此类优化。例如,如果你希望 clone 返回 self 的实例,或者你希望实例构造被 记忆化,以便以前构造的值的重新构造始终返回相同的实例,你目前必须自己覆盖此行为。

(对象终结也是如此,但如果你的实例需要特殊的销毁行为,你几乎肯定没有真正的值类型。值应该被认为是“永恒的”,并且存在于程序内存之外的某种理想形式中,就像自然值一样。)

变量§

变量是 容器 的名称。

变量插值§

变量的值通过简单地将该变量插入字符串中来插值到字符串中。

my $polation="polation";
say "inter$polation";     # OUTPUT: «interpolation␤»

如果变量在某些字母数字字符之前,可能需要使用花括号。

my $inter="inter";
say "{$inter}polation"# OUTPUT: «interpolation␤»

插值发生在 字符串上下文 中,因此该类必须存在有效的字符串化方法。可以使用 双引号 引用结构来实现更通用的插值。

虚拟机§

虚拟机是执行 字节码 的 Raku 编译器实体。它可以优化字节码或实时生成机器代码。例如,MoarVMParrot(旨在运行 Raku)以及更通用的虚拟机,如 JVM 和 Javascript。

WAT§

DWIM 的反义词;反直觉的行为。据说,对于每一个 DWIM,都对应着一个 WAT。另请参见 https://www.destroyallsoftware.com/talks/wat

空白§

用于分隔单词的字符或空白字符组。例如空格字符 « »。

6model§

6model 用于 MoarVM 中,并提供用于创建对象系统的基本元素。它在 Jonathan Worthington 的这篇演示文稿 中进行了描述,并在 MoarVM 中的这里 进行了实现。

1 [↑] twine 是一个元素数量为奇数的数组,以一个简单的字符串开头,交替出现格式化代码对象和简单的字符串,并以一个简单的字符串结尾;格式化代码对象与字符串交twine。字符串可以为空(如示例所示)。没有格式化代码的 twine 将包含一个简单的字符串。