Moonbit Weekly Update——0904

Moonbit was introduced to the public last month, and we received a lot of positive feedback. This post is intended to provide updates on the changes to Moonbit’s language and build system over the past week.

Changes in Moonbit Language

1. user-defined interface

Moonbit now allows users to define their own interfaces using the interface keyword. For example:

interface Number {
  op_add(Self, Self) -> Self
  op_sub(Self, Self) -> Self
  op_mul(Self, Self) -> Self
  op_div(Self, Self) -> Self
  op_neg(Self) -> Self
}

func f[X: Number](x: X, y: X) -> X {
  x * x + (- y / x - y)
}

func init {
  f(1, 2).print()
  f(1.0, 2.0).print()
}

The code above defines an interface called Number, which abstract over number-like types supporting arithmetic operations. Now the function f can operate on any type X that implements the five arithmetic operations specified in Number. One can call f on Int, Float, or other user-defined number-like types such as vector or matrix.

2. Moonbit now supports floating point numbers (floats) in foreign function interfaces (FFI):

func sqrt(x: Float) -> Float = "math" "sqrt"
func get_pi() -> Float = "math" "get_pi"

let pi: Float = get_pi()

func init {
  let x = sqrt(9.0)
  x.print()
  pi.print()
}

Corresponding functions need to be provided at runtime, such as:

#!/usr/bin/env node
const spectest = {
  math: {
    sqrt: (x) => Math.sqrt(x),
    get_pi: () => Math.PI
  },
  spectest: {
    print_i32: (x) => console.log(String(x)),
    print_f64: (x) => console.log(String(x)),
    print_char: (x) => console.log(String.fromCharCode(x)),
  },
};
(async () => {
  WebAssembly.instantiateStreaming(fetch("foo.wasm"), spectest).then(
    (obj) => {
      obj.instance.exports._start()
    }
  )
})();

3. New Bytes Built-in Type

Moonbit has added a new built-in type Bytes, with the following methods:

1)make: create Bytes

2)length: get Bytes’ length

3)Read and write Bytes content through square brackets + subscript numbers

func init{
  let bytes : Bytes = Bytes::make(3, 56)
  var i = 0
  bytes[1] = 57;
  bytes[2] = 58;

  let len = bytes.length()
  "length of bytes: \(len)\n".print()


  while i < 3 {
    let b = bytes[i]
    "byte \(i): \(b)\n".print();
    i = i + 1
  }
}

4. More uniform naming style for built-in functions

Moonbit has removed the previous string_make and array_make interfaces, migrating to the new T::method style:

func init{
  let ary = Array::make(4,3) // [3,3,3,3]
  let str = String::make(4,'s') // "ssss"
}

5. Changes to Local Function Naming Logic

Moonbit has changed the logic for local functions, and they are now not allowed to have the same name. For example, this code will prompt that the function has already been defined:

func init {
  fn add(a:Int) -> Int {
    a + 1
  }
  
  fn add(b:String) {
    b.print()
  }
}

Changes in MoonBit’s IDE

1. Improved Moonbit Code Highlighting Mechanism

The highlighting of the current token is now more user-friendly.

Before optimization:

After optimization:

优化后

2. Enhanced Code Sharing Interaction

There’s a new sharing icon added at the top right of the editor:

3. IDE Added Auto-Completion for :: Syntax

The IDE has now added auto-completion for the :: syntax.

6 Likes