MoonBit是一個用於雲計算和邊緣計算的 WebAssembly 端到端的程式語言工具鏈。可以訪問官網獲得 IDE 環境,無需安裝任何軟體。
狀態,概述,表達式和語句,控制結構,條件表達式,函式式循環,循環,內置數據結構,布爾值,數字,字元串,元組,數組,變數綁定,數據類型,更新結構體的語法,枚舉,新類型,方法系統,運算符重載,管道運算符,接口系統,自動實現內建接口,接口對象,問號操作符,主要優勢,程式語言,MoonBit 的構建系統,
狀態
MoonBit 目前處於 Pre-alpha 階段,是實驗性質的。期望今年能達到 beta 階段。
概述
一個月兔程式由類型定義,函式定義和變數綁定組成。 每個包的入口點是一個特殊的
函式,它有以下兩個特點:
- 同一個包中可以有多個 init 函式。
- init 函式不能被顯式調用或被其他函式引用。相反,在一個包初始化時,所有的 init 函式都將被隱式地調用。因此,init 函式中只能包含語句。
MoonBit 區分語句和表達式。在一個函式體中,只有最後一句才能寫成作為返回值的表達式。
表達式和語句
表達式包括:
值字面量(例如布爾值、數字、字元、字元串、數組、元組、結構體)
算術、邏輯和比較運算
訪問數組元素(例如 a[0])、結構體欄位(例如 r.x)或元組的元素(例如 t.0)
變數和(大寫字母開頭的)枚舉構造器
匿名局部函式定義
match 和 if 表達式
語句包括:
命名局部函式定義
局部變數綁定
賦值
while 循環和相關的控制流結構(break 和 continue)
return 語句
返回類型為 unit 的任何表達式
控制結構
條件表達式
條件表達式由條件、結果和一個可選的 else 子句組成。
else 子句也可以包含另一個 if-else 表達式:
花括弧用於在結果或 else 子句中組合表達式。
注意,在 MoonBit 中,條件表達式總是返回一個值,其結果和 else 子句的返回值類型必須相同。
函式式循環
函式式循環是 MoonBit 中一個強大的特性,它能讓您以函式式風格編寫循環。
函式式循環接受參數並返回一個值。它使用 loop 關鍵字定義,後跟其參數和循環體。 循環體是一系列子句,每個子句由模式和表達式組成。 與輸入匹配的模式會被執行,並且循環將返回表達式的值。如果沒有匹配的模式,循環將拋出異常。 可以使用 continue 關鍵字和參數開始下一次循環疊代,使用 break 關鍵字和參數來從循環中返回一個值。 如果值是循環體中的最後一個表達式,則可以省略 break關鍵字。
循環
MoonBit 的 while 循環可以用如下語法定義:
while 語句不返回任何值;它只求值成 unit 類型的 () MoonBit 還提供 break 和 continue 語句來控制循環流。
內置數據結構
布爾值
MoonBit 內置了布爾類型,它有兩個值:true 和 false。布爾類型用於條件表達式和控制結構。
數字
Moonbit 支持的數字字面量,包括十進制、二進制、八進制和十六進制。
為了提升可讀性,你可以在數字字面量內插入下劃線,例如 1_000_000。 注意,下劃線可以插入到數字之間的任何位置,而非只能在每三個數字之間。
- 十進制數和往常一樣。
- 八進制數的前綴是 0 後接字母 O,也就是 0o 或 0O。注意在 0o 或 0O 之後出現的數字只能在 0 到 7 之間。
- 十六進制數的前綴是 0 後接字母 X,也就是 0x 或 0X。注意在 0x 或 0X 之後出現的數字只能是 0123456789ABCDEF 之一。
字元串
字元串內插是 MoonBit 中的一個強大功能,它可以將字元串中的內插變數替換為具體值。 該功能通過將變數值直接嵌入到文本中來簡化構建動態字元串的過程。
用於字元串內插的變數必須支持 to_string 方法。
元組
元組是一個有限值的有序集合,使用圓括弧 () 構造,其中的元素由逗號 , 分隔。 元素的順序很重要,例如 (1, true) 和 (true, 1) 是不同的類型。可以通過模式匹配或索引來訪問元組:
數組
數組是由方括弧 [] 構造的有限值序列,其中元素由逗號 , 分隔。例如可以用 array[x] 來引用第 x 個元素。索引從零開始。
變數綁定
變數可以通過 let mut 或 let 分別聲明為可變或不可變。 可變變數可以重新賦值,不可變變數則不能。
數據類型
創建新數據類型的方法有兩種:struct 和 enum。
結構
在 MoonBit 中,結構與元組類似,但它們的欄位由欄位名索引。 結構體可以使用結構體字面量構造,結構體字面量由一組帶有標籤的值組成,並用花括弧括起來。 如果結構體字面量的欄位完全匹配類型定義,則其類型可以被自動推斷。 使用點語法 s.f
可以訪問結構體欄位。 如果一個欄位使用關鍵字 mut 標記為可變,那么可以給它賦予新的值。
創建結構體的簡寫形式
如果已經有和結構體的欄位同名的變數,並且想使用這些變數作為結構體同名欄位的值, 那么創建結構體時,可以只寫欄位名,不需要把同一個名字重複兩次。
更新結構體的語法
如果想要基於現有的結構體來創建新的結構體,只需修改現有結構體的一部分欄位,其他欄位的值保持不變, 可以使用結構體更新語法:
枚舉
枚舉類型對應於代數數據類型(Algebraic Data Type,ADT), 熟悉 C/C++ 的人可能更習慣叫它帶標籤的聯合體(tagged union)。
枚舉由一組分支(構造器)組成,每個分支都有一個名字(必須以大寫字母開頭),可以用這個名字來構造對應分支的值, 或者在模式匹配中使用這個名字來判斷某個枚舉值屬於哪個分支:
枚舉的分支還可以攜帶額外的數據。
新類型
MoonBit 支持一種特殊的枚舉類型,稱為新類型(newtype):
新類型和只有一個構造器(與類型同名)的枚舉類型非常相似。 因此,可以使用構造器來創建新類型的值、使用模式匹配來提取新類型的內部表示:
除了模式匹配,還可以使用 .0 提取新類型的內部表示:
方法系統
MoonBit 支持與傳統面向對象語言不同的方法(method)。 某個類型的方法就是與該類型關聯的普通函式。 可以使用 fn TypeName::method_name(...) -> ... 的語法來為類型 TypeName 聲明方法:
如果一個函式的第一個參數名為 self,那么 MoonBit 會自動將這個函式定義為 self 的類型上的方法:
方法就是某個類型所擁有的普通函式。所以,在沒有歧義時,它們也可以像普通函式一樣調用:
但和普通函式不同,方法支持重載。不同的類型可以有同名的方法。 如果當前作用域內有多個同名方法,依然可以通過加上 TypeName:: 的前綴來顯式地調用一個方法:
運算符重載
MoonBit 支持通過方法重載內置運算符。與運算符 <op> 相對應的方法名是 op_<op>。
以下運算符可以被重載:
運算符名稱 | 方法名 |
---|---|
+ | op_add |
- | op_sub |
* | op_mul |
/ | op_div |
% | op_mod |
-(一元運算符) | op_neg |
_[_](獲取項) | op_get |
_[_] = _(設定項) | op_set |
管道運算符
MoonBit 提供了便利的管道運算符 |>,可以用於鏈式調用普通函式:
接口系統
MoonBit 具有用於重載/特設多態(ad-hoc polymorphism)的結構接口系統。 接口描述了滿足該接口的類型需要支持哪些操作。接口的聲明方式如下:
在接口聲明中,Self 指代實現接口的那個類型。
一個類型要實現某個接口,就要滿足該接口中所有的方法。例如,下面的接口描述了一個能夠比較元素是否相等的類型需要滿足的方法:
接口無需顯式實現,具有所需方法的類型會自動實現接口。考慮以下接口:
內置類型如 Int 和Double會自動實現這個接口。
在聲明泛型函式時,類型參數可以用它們應該實現的接口作為註解。 如此便能定義只對某些類型可用的泛型函式。例如:
如果沒有 Number 的要求,square 中的表達式 x * x 會導致出現找不到方法/運算符的錯誤。 現在,函式 square 可以與任何實現了 Number 接口的類型一起使用,例如:
接口中的方法可以用 Trait::method 的語法來直接調用。MoonBit 會推導 Self 的具體類型, 並檢查 Self 是否實現了 Trait:
Moonbit 提供了以下實用的內建接口:
自動實現內建接口
Moonbit 可以自動生成一些內建接口的實現:
接口對象
MoonBit 通過接口對象的形式來支持運行時多態。 假設 t 的類型為 T,且類型 T 實現了接口 I, 那么可以把 T 實現 I 的各個方法和 t 自己打包在一起, 創建一個 I 的接口對象 t as I。 接口對象擦除了值的具體類型,所以從不同的具體類型所創建的接口對象, 可以被封裝在同一個數據結構里,統一進行處理:
不是所有接口都可以用於創建對象。 “對象安全” 的接口的方法必須滿足下列條件:方法的第一個參數必須是 Self在方法的簽名里,Self 只能出現在第一個參數
問號操作符
MoonBit 提供一個便捷的 ? 操作符,用於錯誤處理。 ? 是一個後綴運算符。它可以作用於類型為 Option 或 Result 的表達式。 被套用在表達式 t : Option[T] 上時,t? 等價於:
被套用在表達式 t : Result[T, E] 上時,t? 等價於:
問號操作符可以用於優雅地組合多段可能失敗或產生錯誤的程式:
主要優勢
生成比現有解決方案明顯更小的 WASM 檔案。
更高的運行時性能。
先進的編譯時性能。
簡單且實用的數據導向語言設計。
程式語言
月兔語言專為WebAssembly設計,同時提供JavaScript,Native等多種後端
支持函式式和面向對象等多種編程範式
實用的類型系統,面向數據的語言設計,讓任何背景的開發者迅速上手
MoonBit 的構建系統
構建系統的介紹參見 MoonBit 的構建系統教程。