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_approxin 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例程也适用于HashSignature字面值可以包含字符串/数字字面值以及调用者标记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可以接受:kvunique和.repeated可以接受:&as和:&with- Test.pm6 中的
&plan可以接受:skip-all &run/&shell可以接受:merge¬e可以在没有参数的情况下调用open接受:$out-bufferIO::Path.resolve可以接受:completelyIO::Path.parent可以接受一个Int表示父级Proc::Async.new吞噬位置参数Signature.ACCEPTS接受非Signature/Capture参数&EVAL可以接受一个BlobPromise.keep/.break可以在没有参数的情况下调用- 原生数组上的
.sum可以接受:wrap is required现在可以接受一个表示理由的参数IO::Socket::Async.listen可以绑定到端口0以向操作系统申请免费端口.encode可以接受:translate-nl
新的例程和运算符 #
- 新的
atomicintUnicode 运算符和 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生产一个SeqStr.uniparse: 将一个或多个 Unicode 字符名解析为实际字符Str.parse-base:Int.base操作的反转IO::Path提供了.ACCEPTS、.SPEC、.CWD、.Numeric、.add、.extension、.mode和各种文件测试、.parts、.sibling和.spurtIO::Handle提供了.READ、.WRITE、.EOF、.DESTROY,.readchars、.flush、.lock、.unlock、.out-buffer、.tell,.say、.slurp、.seek、.printf、.print-nl和.watchIO::Pipe提供了.procIterator提供了.skip-one、.skip-at-least和.skip-at-least-pull-oneMu.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支持了.randBacktrace拥有方法.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-stderrProc.command/Proc::Async.command: 我们要执行的命令Proc提供了.signal、.pid和.encodingComplex提供了.cis、.reals、.ceiling、.floor、.round、.truncate和.abs方法, 并可以使用<=>进行比较(只要虚部可以忽略不计)DateTime提供了.offset-in-hours、.hh-mm-ss和.DateDateTime可以使用<=>运算符和其它DateTime对象进行比较Date提供了.DateTime方法&infix:<+>/&infix:<->可以被Duration、DateTime和Real类型调用Enumeration提供了.Int、.pred、.succ、.kv和.pair.Date可以在Instant上调用- Junction 能使用
Junction.new调用来创建 List类型拥有.to和.from方法Maptype 提供了Int方法, 返回 pair 的数量Any.skip: 跳过列表中的值Any.batch:.rotor的更基本的表兄弟Mu.iterator: 为一个列表中的值生成一个IteratorIO::Spec::*类型提供了.tmpdir、.extension和.pathPair提供了.ACCEPTS、.Pair和.invert.Capture方法对所有核心类型都有明确定义- 定义了
.ACCEPTS在同素异形体上的语义 Failure.self使未处理的Failure爆发Thread.is-initial-thread: 我们是在初始线程中运行吗Match提供了.Int和.actionsIO::Socket::Async提供了.socket-port和.peer-portPromise提供了另一种构造函器.kept和.brokenWhateverCode提供了.assumingWhateverCode和Block提供了.cando.:<…>语法用于调用前缀运算符作为后缀$*KERNEL提供了.hostnameNil拥有定义的.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类型对象智能匹配为Truesink语句前缀爆炸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配合使用.pairupon 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返回一个空的SeqNil.chrs返回一个"\0"Num.new强转参数为Numinfix:<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的返回值总是SeqRange对象上的 Out-of-range.AT-POS返回Nil- 对于不存在的键、
Pair.AT-KEY返回Nil - 所有的
Cool类型都提供了.Rat/.FatRat强转器 IO::Path文件测试不缓存先前测试执行的结果SeqeqvList仅根据类型不匹配就定为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 fatalsay、note、put、print和printf例程自动线程化JunctionIO::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版
$.方法调用语法能用在元方法中了