Raku 中大多数语法结构可以归类为术语运算符

在这里,您可以找到不同类型术语的概述。

字面量§

Int§

42
12_300_00
:16<DEAD_BEEF>

Int 字面量由数字组成,可以在任意两个数字之间包含下划线。

要指定十进制以外的基数,请使用冒号对形式:radix<number>

Rat§

12.34
1_200.345_678

Rat 字面量(有理数)包含两个由点分隔的整数部分。

请注意,不允许使用尾随点,因此您必须编写1.0而不是1.(此规则很重要,因为存在以点开头的中缀运算符,例如.. Range 运算符)。

Num§

12.3e-32
3e8

Num 字面量(浮点数)由 RatInt 字面量后跟一个e 和一个(可能是负数的)指数组成。3e8 构造一个值为3 * 10**8Num

Str§

'a string'
'I\'m escaped!'
"I don't need to be"
"\"But I still can be,\" he said."
q|Other delimiters can be used too!|

字符串字面量通常使用'" 创建,但字符串实际上是 Raku 的一种强大的子语言。请参阅 引用结构

Regex§

/ match some text /
rx/slurp \s rest (.*$/

这些形式生成正则表达式字面量。请参阅 引用结构

Pair§

=> 1
'a' => 'b'
:identifier
:!identifier
:identifier<value>
:identifier<value1 value2>
:identifier($value)
:identifier['val1''val2']
:identifier{key1 => 'val1'key2 => 'value2'}
:valueidentifier
:$item
:@array
:%hash
:&callable

Pair 对象可以使用 => 中缀运算符(如果左侧是标识符,则会自动引用左侧)或各种冒号对形式创建。这些形式几乎总是以冒号开头,然后后跟一个标识符或已存在变量的名称(其名称不带符号作为键使用,变量的值作为对的值使用)。有一种特殊形式,其中整数紧跟在冒号之后,键紧跟在值之后。

在冒号对的标识符形式中,可选值可以是任何环绕符。如果留空,则值为Bool::True:!identifier 形式的值为Bool::False

如果在参数列表中使用,则所有这些形式都算作命名参数,除了'quoted string' => $value

List§

()
123
<a b c>
«a b c»
qw/a b c/

List 字面量是:空括号对()、逗号分隔的列表或多个引用结构。

*§

* 字面量创建一个类型为 Whatever 的对象。有关更多详细信息,请参阅 Whatever 文档;当用作术语时,包含它的表达式将成为 WhateverCode

say .^name with *;    # OUTPUT: «Whatever␤» 
say .^name with *+3;  # OUTPUT: «WhateverCode␤» 

标识符术语§

Raku 中有内置的标识符术语,列在下面。此外,可以使用以下语法添加新的标识符术语

sub term:<forty-two> { 42 };
say forty-two

或作为常量

constant forty-two = 42;
say forty-two;

术语 self§

在方法内部,self 指的是调用者(即调用方法的对象)。如果在没有意义的上下文中使用,则会抛出类型为 X::Syntax::NoSelf 的编译时异常。

术语 now§

返回一个表示当前时间的 Instant 对象。它包括 闰秒,因此比 time 大几十秒。

say (now - time).Int# OUTPUT: «37␤»

术语 time§

为单位返回当前 POSIX 时间,作为 Int。有关包括 闰秒 的高分辨率时间戳,请参阅 now

术语 nano§

纳秒为单位返回当前 POSIX 时间,作为 Int。有关包括 闰秒 的高分辨率时间戳,请参阅 now

从 6.e 语言版本开始可用(Rakudo 编译器 2022.12+ 中存在早期实现)。对于 2021.04 年的 Rakudo 版本,可以使用 nano 模块来获得相同的功能。

术语 rand§

0..^1 范围内返回一个伪随机 Num

术语 π§

返回代码点 U+03C0(希腊小写字母 PI)处的数字 π,即圆周长与直径之比。π 的 ASCII 等价物是 pi

术语 pi§

返回数字 π,即圆周长与直径之比。piπ 的 ASCII 等价物。

术语 τ§

返回代码点 U+03C4(希腊小写字母 TAU)处的数字 τ,即圆周长与半径之比。τ 的 ASCII 等价物是 tau

术语 tau§

返回数字 τ,即圆周长与半径之比。tauτ 的 ASCII 等价物。

术语 𝑒§

返回代码点 U+1D452(数学斜体小写 E)处的欧拉数。𝑒 的 ASCII 等价物是 e

术语 e§

返回欧拉数。e𝑒 的 ASCII 等价物。

术语 i§

返回虚数单位(用于 Complex 数字)。

术语 ∅§

返回 set(),也称为 空集,代码点为 U+2205(空集)。

变量§

变量在 变量语言文档 中讨论。

常量§

常量类似于 变量,但没有 容器,因此不能重新绑定。但是,它们的初始化器在 BEGIN 时评估

constant speed-of-light = 299792458# m/s 
constant @foo  = 123;
constant &talk = &say;
talk speed-of-light²; # OUTPUT: «89875517873681764␤» 
talk @foo;            # OUTPUT: «(1 2 3)␤»

编译时评估意味着 您应该小心 在模块中使用常量,这些模块会自动预编译,因此常量的值即使在程序多次执行之间也不会改变

# Foo.rakumod 
unit module Foo;
constant comp-time = DateTime.now;
# The value of the constant remains the same even though our script
# is executed multiple times:
$ raku -I. -MFoo -e 'say Foo::comp-time'
2018-06-17T18:18:50.021484-04:00
$ raku -I. -MFoo -e 'say Foo::comp-time'
2018-06-17T18:18:50.021484-04:00

常量用关键字 constant 声明,后跟一个带有可选符号的 标识符。常量默认情况下是 our 范围

    constant foo  = 42;
my  constant $baz = rand;
our constant @foo = 123;
    constant %bar = %(:42foo, :100bar);

注意:如果您使用的是 Rakudo 编译器,则需要 2018.08 或更高版本才能使用常量的类型约束和自动强制转换。%-符号常量的自动强制转换需要 6.d.

可以使用可选的类型约束,在这种情况下需要使用范围声明符

# !!WRONG!! missing scope declarator before type: 
Int constant bar = 42;
 
# RIGHT: 
our Int constant bar = 42;

变量 不同,您不能通过在声明符本身中指定参数化类型来参数化 @-、%- 和 &- 符号常量

# !!WRONG!! cannot parameterize @-sigiled constant with Int 
# This will throw X::ParametricConstant 
our Int constant @foo = 42;
 
# OK: parameterized types as values are fine 
constant @foo = Array[Int].new: 42;

限制的原因是,带有 @% 符号的常量默认设置为 ListMap 类型,这些类型不能参数化。为了保持简单和一致,这些结构中简单地不允许参数化。

@-、%- 和 &- 符号常量分别为 PositionalAssociativeCallable 角色指定隐式类型检查。@- 符号常量——以及从 6.d 语言版本开始的 %- 符号常量——如果值未通过隐式类型检查,则会执行值的自动强制转换。@- 符号常量将使用方法 cache 进行强制转换,而 %- 符号常量将使用方法 Map 进行强制转换。

constant @foo = 42;
@foo.raku.say# OUTPUT: «(42,)␤» 
 
constant @bar = [<a b c>];
@bar.raku.say# OUTPUT: «["a", "b", "c"]␤» 
 
constant %foo = <foo bar>;
%foo.raku.say# OUTPUT: «Map.new((:foo("bar")))␤» 
 
constant %bar = {:10foo, :72bar};
%bar.raku.say# OUTPUT: «{:bar(72), :foo(10)}␤» 
 
# Pair is already Associative, so it remains a Pair 
constant %baz = :72baz;
%baz.raku.say# OUTPUT: «:baz(72)␤» 

出于方便和一致性的原因,您可以使用 绑定运算符 (:=) 而不是赋值运算符,在常量变量的无符号名称之前使用反斜杠(与 无符号变量 相同),甚至可以完全省略常量的名称以获得匿名常量。由于您无法引用匿名实体,因此为了清晰起见,您最好使用 BEGIN 阶段

constant %foo := :{:42foo};
constant \foo = 42;
constant = 'anon';