在 Raku 中,**语义** 是用于标识要使用的特定 Raku 版本或以某种方式修改编译器正常行为的指令。use
关键字启用语义(类似于你可以 use
模块的方式)。要禁用语义,请使用 no
关键字
use v6.c; # use 6.c language versionno 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§
MONKEY-TYPING§
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 $yuse dynamic-scope <$x>;sub pokemy = 23;my = 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
仅影响它所在的词法块。
# OUTPUT: «Failure»# OUTPUT: «Caught X::Str::Numeric»
在 try
代码块 中,默认情况下启用了 fatal
编译指示,可以使用 no fatal
来禁用它。
try# OUTPUT: «Caught X::Str::Numeric»try# OUTPUT: «Failure»
isms§
[2018.09 及以后版本]
允许一些其他语言结构,这些结构被认为是陷阱,在正常的 Raku 编程中需要发出警告和/或错误。目前,允许使用 Perl
和 C++
。
sub abs()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()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 Struse 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; = 42; # OK
trace§
当 use trace
被激活时,任何执行的代码行都将被写入 STDERR。您可以使用 no trace
关闭此功能,因此这只会发生在代码的某些部分。
v6§
variables§
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