Checklist for Raku 6.d
— 焉知非鱼Checklist for 6.d
问题 #
在 6.d 版本中, 很多东西都发生了变化, 我们至少需要发布一个版本。这里有个列表。然而, 覆盖面是不完整的。弃用通知采取了不同的形式, 一些新的类型和方法在那里, 一些则没有……
用 #2632
引用这个问题, 并检查项目, 当你的工作, 无论是通过改变后的文档, 看到没有变化, 需要做它。在这种情况下, 请通过评论或如何解释为什么是这种情况。
版本控制的变更 #
- [6.d]
&await
在等待的时候不再阻塞线程 - [6.d]
whenever
不在react
抛出的词法作用域内 - [6.d] 在
sub MAIN
里面的$*ARGFILES
总是由$*IN
馈入 - [6.d] 结构(字面上的)
$()
、@()
和%()
不复存在 - [6.d] 带有
:D
/:U
类型约束的变量默认为约束类型的类型对象(例如, 你可以在它们身上使用.new
) - [6.d]
start
块在 sink 上下文中附加异常处理程序 [6.d] 例程必须使用return-rw
来返回一个Proxy
, 即使例程被标记为is raw
或is rw
- [6.d] 原生的
num
类型默认为0e0
而不是NaN
- [6.d] 在子程序名中, 保留了键名为
sym
的冒号对(如:sym<foo>
), 以备将来使用
废弃 #
这些方法在 6.d 语言中已被废弃, 并将在 6.e 中被删除。实现者可以选择发出弃用警告, 或者在 6.e 版本发布后更长的时间内提供这些方法。
- 使用
'-'
(单连字符)作为&open
的特殊路径, 表示特殊的句柄(使用IO::Special
对象代替) IO::Handle.slurp-rest
(使用.slurp
代替)Any.flatmap
(使用.flat
和.map
方法的组合来代替)Cool.path
(使用.IO
代替)Pair.freeze
(使用去容器化的参数的Pair.new
来代替)Str.subst-mutate
(使用带有.=
方法调用赋值元运算符的Str.subst
代替)Rational.norm
(现在Rational
类型必须在创建时标准化)IO::Path.child
(使用.add
代替)&undefine
(直接分配Empty
/Nil
代替):count
&lines
/Str.lines
例程上的参数(使用所返回的Seq
上的.elems
代替)&is_approx
in Test.pm6 (使用与&is-approx
非常相似的行为来代替)
新的行为 #
- 通过新的可定义的
&RUN-MAIN
、&ARGS-TO-CAPTURE
和&GENERATE-USAGE
子例程改善sub MAIN
的自定义处理 %
变量中的QuantHash
/Map
和@
变量中的List
可以用is
特性来声明(例如,my %h is Set
)- 新的
<ww>
regex 规则: 只在单词内匹配 - 循环可以从上一条语句的值中产生一个值的列表
- 循环中的
next
/last
收集其最后的语句值, 对它们运行的迭代返回Empty
.perl
可以在消耗过的Seq
、多维数组、Date
和CallFrame
上调用.gist
可以在Attribute
上调用- 对自动生成的
USAGE
信息进行了大量改进 is hidden-from-USAGE
特性,从自动生成的USAGE
消息中隐藏sub MAIN
候选者Parameter.perl
包括可内省的默认值%*ENV
值是同素异形的- 尝试使用变量
$;
、$,
、$.
、$\
、$(
、$)
、$<
、$>
、$/
、$\
、$[
、$-
、$+
和$@
会抛出X::Syntax::Perl5Var
- 默认的
Hash.keyof
返回一个Str(Any)
强转类型对象 - 非 ASCII 数字可以在
:42foo
冒号对快捷方式中使用 StrDistance
字符串化为.after
字符串- 更明确的 Pod 表格格式
Enumeration.enums
返回一个Map
- 各种整数类型的
.Range
返回它们支持的值的范围 min
/max
例程也适用于Hash
Signature
字面值可以包含字符串/数字字面值以及调用者标记List.invert
通过所需的Pair
绑定映射, 导致潜在的类型检查失败:exists
可以与多维关联下标一起使用- 动态创建的列表可以用来定义一个枚举
- 在
.first
中, Junction 可以作为匹配器使用 - 原生属性可以作为参数中的绑定目标
Proc
可以与其他Proc
中的IO::Pipe
一起工作- 类型数组可以用
my SomeType @array
和my @array of SomeType
创建 - 当把
Mixy
强转为Setty
/Baggy
时, 负数权重的项将被删除 :nth
副词在m//
上接受一个Junction
作为参数CX::Warn' 和
CX::Done可以在
CONTROL` phaser 中捕获next
可用于whenever
中require
符号不再过境性地暴露出来- 通过
{...}
进行多维访问, 类似于[...]
的工作方式 - 在
END
时间打开的任何手柄都会自动关闭 - 在缓存的
Seq
上, 当&infix:<eqv>
、.Slip
、.join
、.List
、.list
、.eager
、.Array
和.is-lazy
被调用时, 就会使用缓存列表 IO::Handle.encoding
以Nil
表示切换到二进制模式is default
特质与属性一起工作- 在多重分派中, 带有
is rw
特性的参数被认为比没有特性的参数窄 Array
、Blob
和Map
的.gist
被裁剪成100个元素- 新的
for
语句修饰符hyper for
、race for
和lazy for
for
循环自动序列化RaceSeq
/HyperSeq
;使用新的for
语句修饰符hyper for
/race for
避免&infix:<does>
可用于 RHS 上的非组合实例- 数值比较器可以与
DateTime
对象一起使用 Pod
保留空白类型- 定义了带
@
、%
和&
魔符常数的语义
Math #
Rational
总是在创建时被化简, 并在其一生中保持不变Inf
、Inf
和NaN
可以分别用<-1/0>
、<1/0>
和<0/0
> 表示, 通过Rational
类型进行舍去。零分母Rational
被标准化为这三个值之一- 在 ±
Inf
和NaN
上调用.Int
, 会抛出异常 - 改进了
Num
运算符和数学函数的 IEEE 754-2008 合规性 - 负零
Num
(-0e0
)被所有例程和语法结构正确处理 Num
类型的字符串化必须是可舍弃到原始Num
的- 定义了涉及零的
Complex
指数 .expmod
中的负数幂有效
Sets、Bags、Mixes(aka QuantHashes)和集合运算符 #
- Set 运算符可以用在任何对象上, 在需要的时候会被强转
- 所以, 不需要也不希望有任何预先的强转
- 如果没有 QuantHash 就能实现所需的功能, 那么 Set 运算符可以自由地不创建任何 QuantHash
- 对不同类型的 QuantHashes 的 Set 操作将强转到最自由的形式(Set -> Bag -> Mix)
- 集合运算符的 set_precedes 家族(
(<+)
、≼
、(>+)
、≽
) 已被移除- 曾经是子集运算符的 Baggy 形式
- QuantHash 升级为最自由的形式, 所以
(<=)
、⊆
、(>=)
、⊇
做正确的事情
.classify-list
方法可用于Baggy
类型.categorize-list
方法可用于Baggy
类型.invert
方法可用于核心QuantHash
类型.antipairs
方法可用于QuantHash
类型QuantHash
类型有.new-from-pairs
和将一个QuantHash
类型转换为另一个QuantHash
类型的方法(例如Set
类型的.Bag
方法)QuantHash
类型上的.hash
对键值进行了字符串化
新的形参和实参 #
Date.new
接受一个:&formatter
.first
可以接受:kv
unique
和.repeated
可以接受:&as
和:&with
- Test.pm6 中的
&plan
可以接受:skip-all
&run
/&shell
可以接受:merge
¬e
可以在没有参数的情况下调用open
接受:$out-buffer
IO::Path.resolve
可以接受:completely
IO::Path.parent
可以接受一个Int
表示父级Proc::Async.new
吞噬位置参数Signature.ACCEPTS
接受非Signature
/Capture
参数&EVAL
可以接受一个Blob
Promise.keep
/.break
可以在没有参数的情况下调用- 原生数组上的
.sum
可以接受:wrap
is required
现在可以接受一个表示理由的参数IO::Socket::Async.listen
可以绑定到端口0
以向操作系统申请免费端口.encode
可以接受:translate-nl
新的例程和运算符 #
- 新的
atomicint
Unicode 运算符和 ASCII 等价物, 保证线程安全, 原子操作:&infix:<⚛=>
/&atomic-assign
、&prefix:<⚛>
/&atomic-fetch
、&prefix:<++⚛>
/&atomic-inc-fetch
、&postfix:<⚛++>
/&atomic-fetch-inc
、&prefix:<--⚛>
/&atomic-dec-fetch
、&postfix:<⚛-->
/&atomic-fetch-dec
、&infix:<⚛-=>
/&infix:<⚛−=>
/&atomic-fetch-sub
和&infix:<⚛+=>
/&atomic-fetch-add
&cas
: 原子比较与交换≤
、≥
和≠
运算符是 Unicode 运算符, 分别等价于<=
、>=
和!=
&infix:<unicmp>
/&infix:<coll>
:&infix:<cmp>
的替代行为TR///
:tr///
的非变异版本submethod TWEAK
: 与BUILD
类似, 除了它与属性默认值兼容之外&duckmap
: 应用&callable
到每个元素上&deepmap
: 应用&callable
到每个元素上, 下降到Iterable
中&take-rw
: 像&take
一样, 但有一个可写的容器&indir
: 在给定的$*CWD
中执行代码&spurt
: 参见IO::Path.spurt
&prompt
: 提示用户输入uniprops
:uniprop
的多字符版本symlink
: 建立文件符号链接link
: 创建文件硬连接.hyper
/.race
: 并行处理值的列表Seq.from-loop
: 从Callable
生产一个Seq
Str.uniparse
: 将一个或多个 Unicode 字符名解析为实际字符Str.parse-base
:Int.base
操作的反转IO::Path
提供了.ACCEPTS
、.SPEC
、.CWD
、.Numeric
、.add
、.extension
、.mode
和各种文件测试、.parts
、.sibling
和.spurt
IO::Handle
提供了.READ
、.WRITE
、.EOF
、.DESTROY
,.readchars
、.flush
、.lock
、.unlock
、.out-buffer
、.tell
,.say
、.slurp
、.seek
、.printf
、.print-nl
和.watch
IO::Pipe
提供了.proc
Iterator
提供了.skip-one
、.skip-at-least
和.skip-at-least-pull-one
Mu.emit
:&emit
的方法形式- Test.pm6 模块中的
&fails-like
: 允许测试失败 - Test.pm6 模块中的
&bail-out
: 退出失败的测试套件 - Test.pm6 模块中的
&is-approx
: 测试一个数字近似于另一个 Buf
拥有.allocate
、.reallocate
、.append
、.push
、.pop
、.splice
、.subbuf-rw
、.prepend
和.unshift
方法Range
支持了.rand
Backtrace
拥有方法.map
、.flat
、.concise
和.summary
.classify-list
方法可用于Hash
类型.categorize-list
方法可用于Hash
类型Code.of
: 返回返回类型约束Code.line
/.file
: 返回定义的行/文件Proc::Async
提供了.Supply
、.ready
、.pid
、.bind-stdin
、.bind-stdout
和.bind-stderr
Proc.command
/Proc::Async.command
: 我们要执行的命令Proc
提供了.signal
、.pid
和.encoding
Complex
提供了.cis
、.reals
、.ceiling
、.floor
、.round
、.truncate
和.abs
方法, 并可以使用<=>
进行比较(只要虚部可以忽略不计)DateTime
提供了.offset-in-hours
、.hh-mm-ss
和.Date
DateTime
可以使用<=>
运算符和其它DateTime
对象进行比较Date
提供了.DateTime
方法&infix:<+>
/&infix:<->
可以被Duration
、DateTime
和Real
类型调用Enumeration
提供了.Int
、.pred
、.succ
、.kv
和.pair
.Date
可以在Instant
上调用- Junction 能使用
Junction.new
调用来创建 List
类型拥有.to
和.from
方法Map
type 提供了Int
方法, 返回 pair 的数量Any.skip
: 跳过列表中的值Any.batch
:.rotor
的更基本的表兄弟Mu.iterator
: 为一个列表中的值生成一个Iterator
IO::Spec::*
类型提供了.tmpdir
、.extension
和.path
Pair
提供了.ACCEPTS
、.Pair
和.invert
.Capture
方法对所有核心类型都有明确定义- 定义了
.ACCEPTS
在同素异形体上的语义 Failure.self
使未处理的Failure
爆发Thread.is-initial-thread
: 我们是在初始线程中运行吗Match
提供了.Int
和.actions
IO::Socket::Async
提供了.socket-port
和.peer-port
Promise
提供了另一种构造函器.kept
和.broken
WhateverCode
提供了.assuming
WhateverCode
和Block
提供了.cando
.:<…>
语法用于调用前缀运算符作为后缀$*KERNEL
提供了.hostname
Nil
拥有定义的.FALLBACK
特殊方法来返回Nil
新类型 #
atomicint
: 原生的int
, 大小可用于新的原子运算符Lock::Async
: 互斥的非阻塞机制Encoding::Registry
: 管理可用的编码Encoding::Encoder
: 编码器, 用于特定的编码Encoding::Decoder
: 解码器, 用于特定的编码IO::CatHandle
: 将多个只读的IO::Handle
视同一个- 原生的
str
数组 Supplier::Preserving
: 缓存的实时Supply
工厂Semaphore
: 控制多线程对共享资源的访问IO::Special
: 特殊I/O设备的路径 (例如STDOUT
)Exceptions::JSON
自定义异常处理程序的实现(可与PERL6_EXCEPTIONS_HANDLER
环境变量一起使用)SeekType
枚举:IO::Handle.seek
中使用的值
新的变量 #
-
$*USAGE
: 可在MAIN
子例程中使用, 包含自动生成的USAGE
信息 -
%*SUB-MAIN-OPTS: 设置
sub MAIN
的行为%*SUB-MAIN-OPTS<named-anywhere>
允许将命名参数放在命令行的任何位置
-
$*COLLATION
: 配置四个 Unicode 校对级别 -
$*INIT-INSTANT
: 代表程序启动时间的Instant
-
$*HOME
: 用户的主目录, 如果存在的话 -
&*chdir
:Callable
包含IO::Path.chdir
的变体, 也设置进程的当前目录 -
PERL6_TEST_DIE_ON_FAIL
环境变量: 在第一次失败时停止测试套件 -
PERL6_EXCEPTIONS_HANDLER
环境变量: 指定自定义异常处理类
对边缘情况/强转行为的澄清 #
UInt
与Int
类型对象智能匹配为True
sink
语句前缀爆炸Failure
- 定义了1项和0项列表以及负参数和非整数参数的
permutations
/combinations
的行为 &val
、Str.Numeric
和其他Str
数字转换方法在试图转换 UnicodeNo
字符组或合成数字时会fail
:42foo
冒号对快捷方式中不能使用合成数字- 现在、
Enumeration
可以作为一个数组形状指定器使用 - 含有空格的
Str
的数值转换现在返回0
- 带空的模式参数的
samark
, 简单地返回调用者 .polymod
可用于lazy
但有限的除数列表- 定义了
.[*-0]
索引 .rotor
中大于子列表的负数空隙抛出异常.rotor
的非Int
参数被强转为Int
参数- 读取
/proc
文件时定义了.lines
- 定义了字符串上后缀/前缀
++
/--
中泰语数字的行为 - sunk
for
里面的map
被视为 sunk - Sunk
for
循环将上一条语句的方法调用值下沉 Bool
对象上的.Int
返回一个Int
对象splice
可用于扩展数组classify
可以与Junction
配合使用.pairup
on a type object returns an emptySeq
.pairup
总是返回一个Seq
- 拒绝接受
Date
/DateTime
构造函数中的合成代码点 ⸨
/⸩
对儿现在可以作为引号结构中的匹配字符使用Array
类型对象上的.flat
简单地返回该类型对象- 混合级
classify
在Hash
上抛出异常 Junction
可以用于给Hash
指定多个键- 给
.classify-list
的Callable
现在保证每项只执行一次 :delete
对Hash
类型对象进行关联查找时返回Nil
- Test.pm6 中的
&is-deeply
会自动.cache
作为参数的Seq
, 并使用返回的List
进行测试 Complex.new()
给出<0+0i>
Int.new
现在可以保证构建一个新的Int
(而不是, 比如说, 从常量缓存中重用一个)- 定义了一个参数(1-arg)版本的
&infix:<=:=>
和&infix:<eqv>
- 如果直接或间接地调用
.BIND-POS
、.BIND-KEY
、.ASSIGN-POS
、.ASSIGN-KEY
、.STORE
、.push
、.append
、.unshift
、.prepend
、Nil
类型现在抛出异常 Nil.ord
返回一个空的Seq
Nil.chrs
返回一个"\0"
Num.new
强转参数为Num
infix:<Z>()
返回一个空的Seq
.comb
总是返回一个Seq
- 用
&infix:<+>
化简一个项, 简单地返回该项 ()[0]
返回Nil
- 允许在(可能是无限的)
Seq
上使用 Regex 智能匹配 - 定义了
Range
对象的智能匹配 Set
转换为Mix
/Bag
不再有Bool
权重- 当一个或多个操作数为
0
时、gcd
是有定义的 defined
例程中的Junction
自动线程化sum
可以处理含有Junction
的列表Grammar.parse
让顶级regex
回溯U+2212 MINUS SIGN [Sm] (-)
现在得到更多结构的支持, 如Str.Numeric
和&val
- Arity-1
&infix:<~>
与Blob
可以一起工作 - 在签名中, 所有的
Numeric
字面值都支持作为值字面值 - 正则表达式中的
\b
和\B
抛出X::Obsolete
True
和False
作为签名中的值字面量发出警告.sort
和IO::Spec::Unix.path
的返回值总是Seq
Range
对象上的 Out-of-range.AT-POS
返回Nil
- 对于不存在的键、
Pair.AT-KEY
返回Nil
- 所有的
Cool
类型都提供了.Rat
/.FatRat
强转器 IO::Path
文件测试不缓存先前测试执行的结果Seq
eqvList
仅根据类型不匹配就定为False
在参见 Raku/roast#614 和 #3519Hash
、Hash
和QuantHash
上, 来自.kv
、.values
和.pair
序列的值是可写的&infix:<∘>
/&infix:<o>
保留 LHF 的.of
和 RHS 的.arity
和.count
- 完善了 regex 运算符副词中的可接受参数(例如:
:in(…)
) - 完善了
IO::Handle.open
中可接受的参数组合 IO::Path.Str
不包含.CWD
属性的值IO::Path
类型拒绝带有nul
字节 ("\0"
) 的路径IO::Pipe
的.path
/.IO
返回一个IO::Path
类型对象- 如果目的路径和源路径是一样的
IO::Path
的.copy
/.move
会fail
dir
创建的IO::Path
绝对性由调用者控制- 更多定义的边缘行为、
Callable
处理、. defined
调用, 以及&infix:<andthen>
、&infix:<orelse>
和&infix:<notandthen>
操作符的链接 Seq
的禅切不缓存它们List.Capture
将任何包含的Pair
对象的键字符串化- 带处理的
Failure
参数的&fail
把它标记为是未处理的 use lib
接受IO::Path
对象- 锚点
^
、^^
、$
和$$
在环视中有效 Grammar.made
支持类型对象.isa
支持subset
类型对象:delete
可用于惰性数组&infix:<eqv>
可以在某些情况下对惰性参数起作用- 动态查询(
::(...)
) 是限制性的 regex 语法, 并且需要use MONKEY-SEE-NO-EVAL
的许可 - 定义了带孔数组的
.Slip
和.List
Promise.in
/.at
和Supply.interval
可以用零值和负值工作Supply.interval
最小值为0.001
;较低值被处理为0.001
, 并发出警告#, 参见 https://docs.perl6.org/type/Supply#method_interval PR [#2649]Supply
提供了.Seq
、.list
和.zip
- 可以在构建方法中绑定到原生类型属性
WhateverCode
传播use fatal
say
、note
、put
、print
和printf
例程自动线程化Junction
IO::Handle.eof
值在.seek
过终点后再返回时也会相应改变- 定义了
.succ'、
.pred和
.Bool` 的同质异形体 - 在核心
Numeric
上定义了.Bridge
在核心Numeric
的类型对象上定义了.Numeric
/.Real
- 定义了关于零分母有理数的
Rational.Bool
say
/note
保证在Str
的子类上调用.gist
- 定义了
Junction.Str
返回Junction
- 定义了
Junction.gist
/.perl
返回一个Str
Map
/Hash
的.list
/.cache
返回一个List
- 定义了
.round
的返回类型 - 定义了
Enumeration:D
不.ACCEPT
一个Enumeration:U
, 参见 rakudo/rakudo#2073
杂项 #
IO::ArgFiles
类型只是IO::CatHandle
的一个空的子类- 对常量的约束
- 约束是完全强制的
- 试图在常量上使用参数化类型约束(例如使用
my Foo constant @int
) 会引发X::ParametricConstant
异常
Pod
=defn
(定义列表)指令可用Pod
提供了:numbered
配置键.^ver
、.^auth
和.^name
元方法在module
中可用, 而在package
中则没有, 这是设计上的原因qww<…>
中支持花哨的引号(’…’
、“…”
、「…」
和变体)&infix:< >
支持查找自动生成的Callables
(例如:&infix:<XX>
)- 使用命名的
anon
子例程不再产生重声明警告 ::?MODULE
/$?MODULE
变量的扩展规范sub MAIN
可以接受一个参数上的Enumeration
类型约束和where
子句- 笑脸型约束可以用在子集上
start
块和 thunks 得到新的$/
和$!
- 定义了与列表关联运算符一起使用的
R
元运算符 - 类型强转可以用在签名返回类型约束中
&infix:<x>
/&infix:<x>
抛出了-Inf
/NaN
重复参数- 字面结构
put
和put for
抛出, 需要使用括号 - 扩大了 Unicode 例程和功能的规范覆盖面-将覆盖面升级到 Unicode 第11版
$.
方法调用语法能用在元方法中了