编译指令

在 Raku 中,pragma 是用于识别要使用的 Raku 的特定版本或以某种方式修改编译器的正常行为的指令。use 关键字开启编译指示(类似于你怎么 use 一个模块)。要禁用 pragma,请使用 no 关键字:

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

以下是一个编译指令列表,其中包含每个编译指令意图的简短描述或指向其使用的更多详细信息的链接。(注意:标记为“[NYI]”的编译指令尚未实现,标记为“[TBD]”的编号将在稍后定义。)

v6.x

该编译指令 声明了将要使用的编译器的版本,如果它们是可选的,则开启它的功能。

use v6;   # Load latest supported version (non-PREVIEW). 
          # Also, useful for producing better errors when accidentally 
          # executing the program with `perl` instead of `raku` 
use v6.c;         # Use the "Christmas" version of Raku 
use v6.d;         # Use the "Diwali" version of Raku 
use v6.d.PREVIEW; # On 6.d-capable compilers, enables 6.d features, 
                  # otherwise enables the available experimental 
                  # preview features for 6.d language 
                  # This will only work on releases previous to 6.d. 

由于这些编译指令是在编译器版本上开启的,所以它们应该是文件中的第一个语句(前面的注释和 Pod 都没问题)。

MONKEY-GUTS

该编译指令目前不是任何 Raku 规范的一部分,但作为 use nqp 的同义词存在于 Rakudo 中(见下文)。

MONKEY-SEE-NO-EVAL

EVAL

MONKEY-TYPING

augment

MONKEY

use MONKEY;

打开所有可用的 MONKEY 编译指令,目前有上面的三个; 因此,它等同于:

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

experimental

允许使用实验性功能

fatal

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

在第二个块中,use fatal 编译指定开启了,因此 say 永远不会到达该行,因为从前缀 + 返回的 Failure 中包含的 Exception 被抛出并且 CATCH 块被运行,打印出 Caught... 行。请注意,这两个块都是相同的程序,use fatal 只会影响它所使用的词法块: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» 

internals

[NYI]

invocant

[NYI]

isms

[2018.09 and later]

允许被认为是正常 Raku 编程中的警告和/或错误的陷阱的一些其他语言结构。目前,Perl5C++ 是被允许的。

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 sub,并没有使编译错误消失。

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

有了这个,编译器将允许违规的 Perl 5 构造,允许实际执行代码。

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

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

lib

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

use lib <lib /opt/lib /usr/local/lib>;

这将搜索列表中传递的目录。有关更多示例,请查看模块文档

newline

在调用的作用域内设置$?NL常量的值。可能的值有 :lf(默认值,表示换行),:crlf(表示回车,换行)和 :cr(表示回车)。

nqp

使用风险由您自己承担。

这是一个 Rakudo 特有的编译指令。有了它,Rakudo 可以访问顶级命名空间中的nqp操作码

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

这使用底层的 nqp say 操作码而不是 Raku 例程。这个编译指示可能会使您的代码依赖于特定版本的 nqp,并且由于该代码不是 Raku 规范的一部分,因此不能保证它是稳定的。您可能会在 Rakudo 核心中找到大量用法,这些用法用于尽可能快地实现核心功能。Rakudo 代码生成的未来优化可能会废弃这些用法。

parameters

[NYI]

precompilation

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

soft

Re-dispatching, inlining

strict

strict 是默认行为,并要求您在使用变量之前声明变量。你可以用 no 放松这个限制。

no strict; $x = 42; # OK 

trace

use trace 被激活时,执行的代码的任何行将被写入 stderr。您可以使用 no trace 关闭该功能,因此这仅适用于某些代码段。

v6

Writing Tests

variables

Defined 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