本周 MoonBit 语法支持添加错误处理机制、Map 字面量语法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moonbitlang
V2EX    推广

本周 MoonBit 语法支持添加错误处理机制、Map 字面量语法

  •  
  •   moonbitlang 2024-06-17 18:35:38 +08:00 1098 次点击
    这是一个创建于 481 天前的主,其中的信息可能已经有所发展或是发生改变。

    MoonBit 更新

    • 支持了错误处理机制
    1. 函数返回值类型可以用 Int!String 来标识这个函数正常情况下返回 Int ,错误情况下会抛出类型为 String 的错误值,比如
    fn div(x: Int, y: Int) -> Int!String { .. } 
    1. raise 关键字用于中断当前控制流,直接抛出错误,比如
    fn div(x: Int, y: Int) -> Int!String { if y == 0 { raise "divide by 0" } x / y } 
    1. try { expr0 } catch { pattern1 => expr1; pattern2 => expr2; .. } 表达式可以用于捕获 expr0 中抛出的错误,并对其进行模式匹配来处理,比如下面这个函数调用上面的 div 函数,并在 div 函数抛出错误的时候将错误信息打印,并返回默认值
    fn div_with_default(x: Int, y: Int, default: Int) -> Int { try { div(x, y)! } catch { s => { println(s); default } } } 
    1. 此外,可以用后缀运算符 !!! 进行错误处理,这些后缀运算符只能应用于函数调用,其中: f(x)! 将调用 f 的过程中发生的错误立即重新抛出,其等价于
    try { f(x)! } catch { err => raise err } 

    f(x)!! 则会在 f 发生错误的情况下直接 panic ,其等价于

    try { f(x)! } catch { _ => panic() } 

    函数调用的形式包括方法调用,中缀运算符和管道运算符的调用,比如

    fn init { let _ = x.f()!! let _ = (x + y)!! let _ = (x |> f)!! } 
    1. 最后,对可能会抛出错误的函数如果没有使用上述任何错误处理,那么则会报 unhandled error 的错误
    • 支持 Map 字面量语法:
    fn init { // 键必须是字面量 let m1 : Map[String, Int] = { "x": 1, "y": 2 } let m2 : Map[Int, String] = { 1: "x", 2: "y" } } 

    IDE 更新

    • 修复了 IDE 在补全过程中 builtin package 中的方法会重复出现两次的 bug

    • 修复了 IDE 中缺少 Byte 相关的补全功能

    构建系统更新

    • 添加对 internal 包的支持,这些包被放在名为 internal 的目录中。internal 包只能被以 internal 的父目录为根的包导入。

      例如,如果有一个包的路径为 username/hello/x/internal/a,该 internal 包的父目录为 username/hello/x,那么只有包username/hello/x 或其子包(例如 username/hello/x/a)能够导入username/hello/x/internal/a,而username/hello/y则不能导入该包。

    3 条回复    2024-06-17 21:07:12 +08:00
    w568w
        1
    w568w  
       2024-06-17 20:59:15 +08:00
    这个错误处理的设计是出于什么思想?看起来很像 Ziglang/Rust 的「错误即返回值」模式和传统的 Exception 模式杂糅在一起……

    如何保证不会提高处理错误的复杂度?原先只需要考虑一种错误,现在要同时考虑两种可能的异常程序流了
    w568w
        2
    w568w  
       2024-06-17 21:06:09 +08:00
    补充一句:感觉最后可能会演变成,第三方库分为 return 派和 raise 派各自为政……
    w568w
        3
    w568w  
       2024-06-17 21:07:12 +08:00
    @w568w #2 仔细读了一下 spec 原来是统一的,那没事了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2450 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 01:13 PVG 09:13 LAX 18:13 JFK 21:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86