V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moonbitlang
V2EX  ›  推广

MoonBit 新增实验性功能: trait 支持默认实现

  •  
  •   moonbitlang · 280 天前 · 554 次点击
    这是一个创建于 280 天前的主题,其中的信息可能已经有所发展或是发生改变。

    语言更新

    1. 实验性地添加对 trait 实现默认方法的功能

    trait MyShow {
      repr(Self) -> String
      str (Self) -> String // it has a default implementation
    }
    
    impl MyShow::str(self : Self) -> String {
      // default implementation of str
      self.repr()
    }
    
    type MyInt Int
      fn repr(self:MyInt) -> String {
      self.0.to_string()
    }
    // Now MyInt implements MyShow now
    

    2. 允许类型定义的类型参数为 _

    _可以用来定义 phantom type ,来限制一些程序逻辑上非法的操作。例如我们希望不同单位的长度不能够相加:

    type Length[_] Int
    
    type Kilometer
    type Mile
    
    fn add[T](x: Length[T], y:Length[T]) -> Length[T] {
      Length::Length(x.0 + y.0)
    }
    
    let d_km: Length[Kilometer] = Length(10)
    let d_mile: Length[Mile] = Length(16)
    

    此时,两个单位不同的长度并不能够直接相加:

    fn init {
      add(d_km, d_mile) |> ignore
      //        ^~~~~~ Error: Expr Type Mismatch
    }
    

    而两个单位相同的长度可以相加:

    fn init {
      add(d_km, d_mile) |> ignore
      // OK
    }
    

    3. 现在 Toplevel 函数没有标记返回值的行为改成报错

    Toplevel 函数没有标记返回值的行为从之前的默认设置为 Unit 改成报错。

    fn print_hello() {
    // ^~~~~~~~~~~ Error:
    // Missing type annotation for the return value.
      println("Hello!")
    }
    

    4. 添加了按位取反的操作符

    fn main {
      println((1).lnot())
    }
    

    输出:

    -2
    

    5. 改进 List::to_string/debug_write 的输出

    fn main {
      let l = List::Cons(1, Cons(2, Cons(3, Nil)))
      println(l)
    }
    

    输出:

    List::[1, 2, 3]
    

    6. 添加了 Byte 类型

    byte 字面量由 b 作为前缀,使用方式如下:

    fn init {
      let b1 = b'a'
      println(b1.to_int())
      let b2 = b'\xff'
      println(b2.to_int())
    }
    

    更多关于 Byte 的功能还在完善中

    IDE 更新

    1.支持对 moonbitlang/core 的补全

    2. 格式化的更新和修复:

    • 调整空的 struct 、enum 、trait ,避免出现空行。

    之前:

    struct A {
    
    }
    

    之后:

    struct A {}
    
    • 修复 continue 的错误缩进。
    • 修复多行语句格式化后出现分号的问题。

    构建系统更新

    1. moon.mod.json 添加了 test_import 字段

    test_import这个字段中用到的依赖只会在测试的时候被用到。

    2. 优化 moon test 输出

    默认只输出失败的测试用例信息,如果需要完整输出可使用moon test -v命令。

    MoonBit 介绍

    MoonBit 致力于为用户提供一个完整的开发工具链,包括 IDE 、编译器、构建系统、包管理器等。想了解更详细的内容可以前往官网一探究竟: https://www.moonbitlang.cn/

    2 条回复
    Donaldo
        1
    Donaldo  
       280 天前
    请教一下这个和 rust 有什么联系么?看着语法很相似。
    moonbitlang
        2
    moonbitlang  
    OP
       278 天前
    @Donaldo 感谢提问。作为 Wasm 语言,MoonBit 在模式匹配、类型推断、泛型和类似 trait 的特设多态性设计方面的确受到了 Rust 很大影响,我们也希望解决 Rust 因学习难度大导致编译时间过长的问题。MoonBit 相比 Rust 而言最大的区别和优势在于采用了自动内存管理,更加用户友好,在编译速度和编译大小上都能够比 Rust 表现要更出色。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3309 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:00 · PVG 20:00 · LAX 04:00 · JFK 07:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.