rakulang, dartlang, nimlang, golang, rustlang, lang lang no see

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 rawis 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、多维数组、DateCallFrame 上调用
  • .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 @arraymy @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.encodingNil 表示切换到二进制模式
  • is default 特质与属性一起工作
  • 在多重分派中, 带有 is rw 特性的参数被认为比没有特性的参数窄
  • ArrayBlobMap.gist 被裁剪成100个元素
  • 新的 for 语句修饰符 hyper forrace forlazy for
  • for 循环自动序列化 RaceSeq/HyperSeq;使用新的 for 语句修饰符hyper for/race for避免
  • &infix:<does> 可用于 RHS 上的非组合实例
  • 数值比较器可以与 DateTime 对象一起使用
  • Pod 保留空白类型
  • 定义了带 @%& 魔符常数的语义

Math #

  • Rational 总是在创建时被化简, 并在其一生中保持不变
  • InfInfNaN 可以分别用 <-1/0><1/0><0/0> 表示, 通过Rational 类型进行舍去。零分母 Rational 被标准化为这三个值之一
  • 在 ±InfNaN 上调用 .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
  • &note 可以在没有参数的情况下调用
  • 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:<-> 可以被 DurationDateTimeReal 类型调用
  • 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
  • WhateverCodeBlock 提供了 .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 环境变量: 指定自定义异常处理类

对边缘情况/强转行为的澄清 #

  • UIntInt 类型对象智能匹配为 True
  • sink 语句前缀爆炸 Failure
  • 定义了1项和0项列表以及负参数和非整数参数的 permutations/combinations 的行为
  • &valStr.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 配合使用
  • .pairup on a type object returns an empty Seq
  • .pairup 总是返回一个 Seq
  • 拒绝接受 Date/DateTime 构造函数中的合成代码点
  • / 对儿现在可以作为引号结构中的匹配字符使用
  • Array 类型对象上的 .flat 简单地返回该类型对象
  • 混合级 classifyHash 上抛出异常
  • Junction 可以用于给 Hash 指定多个键
  • .classify-listCallable 现在保证每项只执行一次
  • :deleteHash 类型对象进行关联查找时返回 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.prependNil 类型现在抛出异常
  • 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
  • TrueFalse 作为签名中的值字面量发出警告
  • .sortIO::Spec::Unix.path 的返回值总是 Seq
  • Range 对象上的 Out-of-range .AT-POS 返回 Nil
  • 对于不存在的键、Pair.AT-KEY 返回 Nil
  • 所有的 Cool 类型都提供了 .Rat/.FatRat 强转器
  • IO::Path 文件测试不缓存先前测试执行的结果
  • Seq eqv List 仅根据类型不匹配就定为 False
  • Hash Hash QuantHash 上, 来自 .kv.values.pair 序列的值是可写的 参见 Raku/roast#614#3519
  • &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/.movefail
  • 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/.atSupply.interval 可以用零值和负值工作
  • Supply.interval 最小值为 0.001;较低值被处理为 0.001, 并发出警告#, 参见 https://docs.perl6.org/type/Supply#method_interval PR [#2649]
  • Supply 提供了 .Seq.list.zip
  • 可以在构建方法中绑定到原生类型属性
  • WhateverCode 传播 use fatal
  • saynoteputprintprintf 例程自动线程化 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 重复参数
  • 字面结构 putput for 抛出, 需要使用括号
  • 扩大了 Unicode 例程和功能的规范覆盖面-将覆盖面升级到 Unicode 第11版
  • $. 方法调用语法能用在元方法中了