在 Raku 中,**语义** 是用于标识要使用的特定 Raku 版本或以某种方式修改编译器正常行为的指令。use 关键字启用语义(类似于你可以 use 模块的方式)。要禁用语义,请使用 no 关键字

use v6.c;   # use 6.c language version 
no worries# don't issue compile time warnings 

以下是语义列表,其中包含每个语义目的的简短描述或指向有关其用法的更多详细信息的链接。

v6.x§

此语义声明将使用的编译器版本,并在可选的情况下启用其功能。

由于这些编译指示会开启编译器版本,因此它们应该位于文件中的第一行(在注释和 Pod 之前)。

use v6;           # Load latest supported version (non-PREVIEW). 

历史上,use v6; 的目的是向 Perl 解释器发出信号,要求其报错并警告用户使用 Perl 6。这不再是一个考虑因素,因此该语句已变得毫无意义。

use v6.c;         # Use the "Christmas" version of Raku 
use v6.d;         # Use the "Diwali" version of Raku 

从 2018.11 开始,该版本实现了 6.d,此编译指示不再有任何作用。

use v6.d.PREVIEW# On 6.d-capable compilers, enables 6.d features, 
                  # otherwise enables the available experimental 
                  # preview features for 6.d language 
use v6.e.PREVIEW# Enables the available experimental preview features 
                  # for 6.e language 
use v6.*;         # Enables the available experimental preview features 
                  # for the language version currently in development 

MONKEY-GUTS§

此编译指示目前不属于任何 Raku 规范,但在 Rakudo 中作为 use nqp 的同义词存在(见下文)。

MONKEY-SEE-NO-EVAL§

EVAL

MONKEY-TYPING§

augment

MONKEY§

use MONKEY;

开启所有可用的 MONKEY 编译指示,等同于

use MONKEY-TYPING;
use MONKEY-SEE-NO-EVAL;
use MONKEY-GUTS;

dynamic-scope§

is dynamic 特性应用于编译指示词法范围内的变量。可以通过列出变量名称作为参数来限制对变量子集的影响。默认情况下,应用于所有变量。

# Apply `is dynamic` only to $x, but not to $y 
use dynamic-scope <$x>;
 
sub poke {
    say $CALLER::x;
    say $CALLER::y;
}
 
my $x = 23;
my $y = 34;
poke;
 
# OUTPUT: 
# 23 
# Cannot access '$y' through CALLER, because it is not declared as dynamic 

此编译指示目前不属于任何 Raku 规范,并在 Rakudo 2019.03 中添加。

experimental§

允许使用 实验性功能

fatal§

一个词法编译指示,它使从例程返回的 Failures 成为致命错误。例如,在 Str 上添加前缀 + 会将其强制转换为 Numeric,但如果字符串包含非数字字符,则会返回 Failure。将该 Failure 存储在变量中可以防止它被忽略,因此下面的第一个代码块到达 say $x.^name; 行并输出 Failure

在第二个代码块中,启用了 use fatal 编译指示,因此 say 行永远不会被执行,因为从前缀 + 返回的 Failure 中包含的 Exception 被抛出,CATCH 代码块被执行,输出 Caught... 行。请注意,这两个代码块是同一个程序,use fatal 仅影响它所在的词法块。

{
    my $x = +"a";
    say $x.^name;
    CATCH { default { say "Caught {.^name}" } }
} # OUTPUT: «Failure␤» 
 
{
    use fatal;
    my $x = +"a";
    say $x.^name;
    CATCH { default { say "Caught {.^name}" } }
} # OUTPUT: «Caught X::Str::Numeric␤»

try 代码块 中,默认情况下启用了 fatal 编译指示,可以使用 no fatal禁用它。

try {
    my $x = +"a";
    say $x.^name;
    CATCH { default { say "Caught {.^name}" } }
} # OUTPUT: «Caught X::Str::Numeric␤» 
 
try {
    no fatal;
    my $x = +"a";
    say $x.^name;
    CATCH { default { say "Caught {.^name}" } }
} # OUTPUT: «Failure␤»

isms§

[2018.09 及以后版本]

允许一些其他语言结构,这些结构被认为是陷阱,在正常的 Raku 编程中需要发出警告和/或错误。目前,允许使用 PerlC++

sub abs() { say "foo" }
abs;
# Unsupported use of bare "abs"; in Raku please use .abs if you meant 
# to call it as a method on $_, or use an explicit invocant or argument, 
# or use &abs to refer to the function as a noun 

在这种情况下,提供一个不接受任何参数的 abs 子例程,并没有消除编译错误。

use isms <Perl5>;
sub abs() { say "foo" }
abs;   # foo

有了它,编译器将允许使用有问题的 Perl 结构,从而允许代码实际执行。

如果未指定任何语言,则允许所有已知的语言结构。

use isms;   # allow for Perl and C++ isms

lib§

此编译指示将子目录添加到库搜索路径,以便解释器可以 找到模块

use lib <lib /opt/lib /usr/local/lib>;
 
#or a mixed list of IO::Path and Str 
use lib ('.''.'.IO'./lib'.IO);

这将搜索传递的目录列表。请查看 模块文档 以获取更多示例。

newline§

在调用它的范围内设置 $?NL 常量的值。可能的值是 :lf(默认值,表示换行符)、:crlf(表示回车符、换行符)和 :cr(表示回车符)。

nqp§

使用风险自负。

这是一个 Rakudo 特定的 pragma。使用它,Rakudo 可以访问顶层命名空间中的 nqp 操作码

use nqp;
nqp::say("hello world");

这使用底层的 nqp say 操作码而不是 Raku 例程。此 pragma 可能会使您的代码依赖于特定版本的 nqp,并且由于该代码不是 Raku 规范的一部分,因此不能保证其稳定性。您可能会在 Rakudo 内核中发现大量用法,这些用法用于使内核功能尽可能快。Rakudo 代码生成的未来优化可能会使这些用法过时。

precompilation§

默认情况下允许预编译源代码,特别是在模块中使用时。如果出于任何原因您不希望代码(您的模块)被预编译,您可以使用 no precompilation。这将阻止整个编译单元(通常是文件)被预编译。

soft§

重新调度内联

strict§

strict 是默认行为,要求您在使用变量之前声明它们。您可以使用 no 放松此限制。

no strict$x = 42# OK 

trace§

use trace 被激活时,任何执行的代码行都将被写入 STDERR。您可以使用 no trace 关闭此功能,因此这只会发生在代码的某些部分。

v6§

编写测试

variables§

定义的变量 pragma

worries§

词法控制编译器生成的编译时警告是否显示。默认情况下启用。

$ raku -e 'say :foo<>.Pair'
Potential difficulties:
  Pair with <> really means an empty list, not null string; use :foo('') to represent the null string,
    or :foo() to represent the empty list more accurately
  at -e:1
  ------> say :foo<>⏏.Pair
foo => Nil

$ raku -e 'no worries; say :foo<>.Pair'
foo => Nil