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

97 天前
 moonbitlang

语言更新

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 A {

}

之后:

struct A {}

构建系统更新

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

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

2. 优化 moon test 输出

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

MoonBit 介绍

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

391 次点击
所在节点    推广
2 条回复
Donaldo
97 天前
请教一下这个和 rust 有什么联系么?看着语法很相似。
moonbitlang
95 天前
@Donaldo 感谢提问。作为 Wasm 语言,MoonBit 在模式匹配、类型推断、泛型和类似 trait 的特设多态性设计方面的确受到了 Rust 很大影响,我们也希望解决 Rust 因学习难度大导致编译时间过长的问题。MoonBit 相比 Rust 而言最大的区别和优势在于采用了自动内存管理,更加用户友好,在编译速度和编译大小上都能够比 Rust 表现要更出色。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX