MoonBit 0.8.3版本更新

对应moonc版本:v0.8.3

语言更新

  1. 使用 **#alias #as_free_fn标记的函数,将不再 继承不应该 继承****的属性**,如#deprecated属性。现在,#alias 声明的别名和函数本体的各种属性都可以独立地控制:
rust 复制代码
    // 本体和别名都不 deprecate
    #alias(g1)
    fn f1() -> Unit
    
    // 只 deprecate 别名
    #alias(g2, deprecated)
    fn f2() -> Unit
    
    // 只 deprecate 本体
    #alias(g3)
    #deprecated
    fn f3() -> Unit
    
    // 本体和别名都 deprecate
    #alias(g4, deprecated)
    #deprecated
    fn f4() -> Unit
  1. **const**声明支持了字符串拼接和字符串插值
rust 复制代码
    const Hello : String = "Hello"
    const HelloWorld : String = Hello + " world"
    const Message : String =
      $|========
      $|\{HelloWorld}
      $|========
  1. for .. in 循环支持了额外的循环变量
rust 复制代码
    // 对数组 xs 求和
    for x in xs; sum = 0 {
      continue sum + x
    } nobreak {
      sum
    }

利用这一新特性,for .. in 循环可以用函数式的方式维护额外的状态,无需使用 let mut

  1. 废弃无方法类型被所有类型隐式实现的行为。 之前,一个没有任何方法的 trait 会被所有类型隐式实现,无需显式写 impl Trait for Type。这一行为已被废弃,使用这种隐式的实现时会收到警告。未来,这一行为将被彻底移除,届时所有 trait 都统一需要显式实现

  2. 废弃 for { ... } 无限循环的用法 。之前,可以使用 for { ... } 来写一个没有终止条件的无限循环。这一语法已被废弃,需要将循环写成 for ;; { ... }while true { ... }。这一改动可以使用 moon fmt 自动完成迁移。这一改动的动机是:我们未来可能会为 for .. in 循环添加模式匹配的支持,如 for (x, y) in array_of_tuple。而 for { .. } 语法和模式匹配 structMap 有语法冲突

  3. 无更新部分的 for循环 允许省略分号。 for i = 0; i < 10; { ... }(没有更新部分)的 for 循环,现在可以省略循环条件后的分号,写成 for i = 0; i < 10 { ... }

  4. 正式 移除 impl 总是可以通过 . 调用的行为。 在 MoonBit 中,只有当 impl 和类型定义在同一个包内时,impl 才可以通过 x.f(..) 语法调用。但在 MoonBit beta 版本前,当前包内的 impl 总是可以通过 . 调用。这一行为已在 beta 版本以警告的形式废弃,现在,这一行为被正式移除

  5. FFI 参数未标注生命周期管理方式默认状态下变成了一个错误而非警告 。未来,我们将正式把FFI 参数默认的生命周期管理方式从 #owned 改为 #borrow,当前未标注生命周期管理方式的FFI函数,编译器将会报一个错误。

  6. 修复了 for i in x..<y 循环的 nobreak 块中依然可以引用循环变量 i 的问题。一些意外依赖了这一行为的代码可能会编译失败。

  7. 改进了一些顶层函数签名不匹配的错误信息,在错误信息中只输出签名不一样的部分,方便定位错误。例如:

rust 复制代码
    trait I {
      f(Self, flag1~ : Int, flag2~ : Int, flag3~ : Int) -> Unit
    }
    
    impl I for T with f(self, flag1~, flga2~, flag3~) {
      ...
    }

原本的报错信息是:

rust 复制代码
    ...
      expected: (Self, flag1~ : Int, flag2~ : Int, flag3~ : Int) -> Unit
      actual:   (Self, flag1~ : Int, flga2~ : Int, flag3~ : Int) -> Unit

改进后的报错信息是:

rust 复制代码
    ...
      expected: (.., flag2~ : _, ..) -> Unit
      actual:   (.., flga2~ : _, ..) -> Unit
  1. 新增了 #unsafe_skip_stub_check 属性,它可以用于跳过 FFI 签名中对类型是否具有稳定 ABI 的检查。该属性可以用于高级用户在 wasm 后端进行较复杂的 FFI 实验。需要注意,跳过检查后 FFI 的行为是未定义的且随时可能发生变动,因此该属性只应用于实验

工具链更新

  1. moon ide 新增 analyze 命令用于分析一个包的公开 API 的使用情况 。它会以mbti的格式将一个包的公开API打印出来,并在每个API的后面用注释写明它的使用情况,包括总使用次数,在测试中的使用次数和该API是否在exports.mbt中被定义。下面是一个输出的例子:
rust 复制代码
    $ moon ide analyze . # path to packages to be analyzed
    package "username/analyze"
    
    import {
    "username/analyze/util",
    }
    
    // Values
    pub const REPORT_CONST_TAG : String = "analyze-tag"  // usage: 2 (1 in test)
    
    #alias(analyze_raw)                                  // usage: 2 (1 in test)
    pub fn analyze_text(String) -> @util.Token           // usage: 2 (1 in test)
    
    pub fn build_report(String, @util.Level) -> Report   // usage: 2 (1 in test), in exports.mbt
    
    pub fn never_called_pub() -> String                  // usage: 0 (0 in test), in exports.mbt
    
    // Errors
    
    // Types and methods
    pub(all) struct Report {
      title : String                                     // usage: 1 (0 in test)
      score : Int                                        // usage: 1 (0 in test)
        
      fn new(String, Int) -> Report                      // usage: 2 (1 in test)
    }
    #as_free_fn(make_report)                             // usage: 2 (1 in test)
    pub fn Report::new(String, Int) -> Self              // usage: 0 (0 in test)
    pub impl Analyzer for Report                         // usage: 2 (1 in test)
    
    // Type aliases
    pub using @util {type Token as PublicResult}         // usage: 0 (0 in test)
    
    // Traits
    pub trait Analyzer {
      analyze(Self, String) -> @util.Token               // usage: 2 (1 in test)
    }

moon ide analyze两种参数传递方式:

  • moon ide analyze 分析当前模块中所有的包

  • moon ide analyze path/to/pkg1 path/to/pkg2 ... 分析所有传入的包,可以和shell中的glob pattern配合使用,例如 moon ide analyze internal/* 可以用来分析所有internal的包。

    这个命令可以配合 AI 重构,快速删除模块内未使用的公开 API。不过,由于非 internal 包的公开 API 可能被模块外用户使用,这种重构原则上只对 internal 包安全。为了区分非 internal 包中"对内使用"和"对外使用"的 API,我们引入了一项约定:凡是预期供模块外用户使用的公开 API,都应定义在 exports.mbt 中。对于这类 API,即使模块内没有任何使用,也不应删除。moon ide analyze 会在输出中对 exports.mbt 中定义的 API 进行特别标注,例如 build_reportnever_called_pub

  1. **supported-targets**支持完善

    • 启用新语法,可通过"+js+wasm+wasm-gc"显式声明支持哪些后端,或用"+all-js"表示不支持哪些后端

    • moon.mod.jsonmoon.pkg中均可定义,对一个包来说,支持后端为两者交集

    • 当无法构造依赖图时,有更好的错误信息

  2. 构建系统现在会追踪编译器,以减少由于编译器版本更新、缓存不匹配导致的 segfault 行为

  3. mbtx脚本模式支持从stdin输入

shell 复制代码
    $ echo "fn main {println(\"hello\")}" | moon run -
shell 复制代码
    $ moon run - <<EOF
    import {
      "moonbitlang/core/list"
    }
    fn main {
      debug(@list.from_array([1, 2, 3]))
    }
    EOF

标准库更新

  1. 增加 argparse 库,提供基础的命令行参数解析功能
Java 复制代码
    ///|
    async fn main {
      let cmd = @argparse.Command("demo", options=[@argparse.OptionArg("name")], positionals=[
        @argparse.PositionArg("target"),
      ])
      let _ = cmd.parse()
    }
  1. moonbitlang/async 更新:
  • JavaScript 后端添加了基于 fetch API 的 HTTP client 支持。moonbitlang/async/http 中的所有 HTTP client API(除 HTTP proxy 支持)均在 JavaScript 后端可用(包括浏览器环境)

  • moonbitlang/async/js_async 添加了与 WebAPI ReadableStream 交互的支持

相关推荐
a187927218312 小时前
【教程】打通本地 IDE AI 与云端 AI 的记忆壁垒:基于 COS 的跨 AI 终端记忆共享与通信系统
人工智能·ai·ai编程·claude·mem·agents·vibe coding
jkyy20142 小时前
智慧座舱新维度:汽车领域健康管理如何重塑驾乘体验?
人工智能·汽车·健康医疗
PNP机器人2 小时前
具身大型语言模型让机器人玩转复杂未知场景
人工智能·语言模型·机器人·kinova机械臂
song8546011342 小时前
hash和history导航区别 个别服务器为啥不支持 history 模式
服务器·算法·哈希算法
IT猿手2 小时前
多无人机动态避障路径规划研究:基于粒子群优化算法PSO的多无人机动态避障路径规划研究(可以自定义无人机数量及起始点),MATLAB代码
算法·matlab·机器人·无人机·路径规划·动态路径规划
电商API_180079052472 小时前
企业级应用:京东商品详情 API 的高可用架构与多级缓存设计
开发语言·人工智能·python·数据分析·网络爬虫·php
云蝠呼叫大模型联络中心2 小时前
金融智能外呼合规技术实现与数据安全架构
大数据·人工智能·#金融科技·#智能外呼合规·#云蝠智能·#ai语音外呼·#数据安全架构
xsyaaaan2 小时前
leetcode-hot100-哈希表:1两数之和-49字母异位词分组-128最长连续序列
算法·leetcode·散列表
小此方2 小时前
Re:从零开始的 C++ 进阶篇(二)C++继承到底做了什么?从对象模型到底层内存布局彻底讲透
c语言·开发语言·c++