Raku 中大多数语法结构可以归类为术语和 运算符。
在这里,您可以找到不同类型术语的概述。
字面量§
Int§
4212_300_00:16<DEAD_BEEF>
Int
字面量由数字组成,可以在任意两个数字之间包含下划线。
要指定十进制以外的基数,请使用冒号对形式:radix<number>
。
Rat§
12.341_200.345_678
Rat
字面量(有理数)包含两个由点分隔的整数部分。
请注意,不允许使用尾随点,因此您必须编写1.0
而不是1.
(此规则很重要,因为存在以点开头的中缀运算符,例如..
Range
运算符)。
Num§
12.3e-323e8
Num
字面量(浮点数)由 Rat
或 Int
字面量后跟一个e
和一个(可能是负数的)指数组成。3e8
构造一个值为3 * 10**8
的 Num
。
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§
a => 1'a' => 'b':identifier:!identifier:identifier<value>:identifier<value1 value2>:identifier():identifier['val1', 'val2']:identifier:valueidentifier::::
Pair
对象可以使用 =
> 中缀运算符(如果左侧是标识符,则会自动引用左侧)或各种冒号对形式创建。这些形式几乎总是以冒号开头,然后后跟一个标识符或已存在变量的名称(其名称不带符号作为键使用,变量的值作为对的值使用)。有一种特殊形式,其中整数紧跟在冒号之后,键紧跟在值之后。
在冒号对的标识符形式中,可选值可以是任何环绕符。如果留空,则值为Bool::True
。:!identifier
形式的值为Bool::False
。
如果在参数列表中使用,则所有这些形式都算作命名参数,除了'quoted string' => $value
。
List§
()1, 2, 3<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> ;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/sconstant = 1, 2, 3;constant = ;talk speed-of-light²; # OUTPUT: «89875517873681764»talk ; # OUTPUT: «(1 2 3)»
编译时评估意味着 您应该小心 在模块中使用常量,这些模块会自动预编译,因此常量的值即使在程序多次执行之间也不会改变
# Foo.rakumodunit ;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 = rand;our constant = 1, 2, 3;constant = %(: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::ParametricConstantour Int constant = 42;# OK: parameterized types as values are fineconstant = Array[Int].new: 42;
限制的原因是,带有 @
和 %
符号的常量默认设置为 List
和 Map
类型,这些类型不能参数化。为了保持简单和一致,这些结构中简单地不允许参数化。
@
-、%
- 和 &
- 符号常量分别为 Positional
、Associative
和 Callable
角色指定隐式类型检查。@
- 符号常量——以及从 6.d
语言版本开始的 %
- 符号常量——如果值未通过隐式类型检查,则会执行值的自动强制转换。@
- 符号常量将使用方法 cache 进行强制转换,而 %
- 符号常量将使用方法 Map
进行强制转换。
constant = 42;.raku.say; # OUTPUT: «(42,)»constant = [<a b c>];.raku.say; # OUTPUT: «["a", "b", "c"]»constant = <foo bar>;.raku.say; # OUTPUT: «Map.new((:foo("bar")))»constant = ;.raku.say; # OUTPUT: «{:bar(72), :foo(10)}»# Pair is already Associative, so it remains a Pairconstant = :72baz;.raku.say; # OUTPUT: «:baz(72)»
出于方便和一致性的原因,您可以使用 绑定运算符 (:=
) 而不是赋值运算符,在常量变量的无符号名称之前使用反斜杠(与 无符号变量 相同),甚至可以完全省略常量的名称以获得匿名常量。由于您无法引用匿名实体,因此为了清晰起见,您最好使用 BEGIN
阶段。
constant := :;constant \foo = 42;constant = 'anon';