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例程也适用于- 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
新的例程和运算符 #
- 新的 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生产一个- 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方法
- Maptype 提供了- 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数字转换方法在试图转换 Unicode- No字符组或合成数字时会- 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 empty- Seq
- .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文件测试不缓存先前测试执行的结果
- Seqeqv- List仅根据类型不匹配就定为- False
- 在参见 Raku/roast#614 和 #3519- Hash、- 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版
- $.方法调用语法能用在元方法中了