迄今為止,最簡單的編程語言 Nolang
Nolang 是一種無 GC、內存安全、語法極簡的系統級編程語言。
lizongying/nolang
直接代碼:
hello word
no
print('hello word')
- 不需要寫main函數
- print自動換行
- 字符串使用單引號,單引號不用按shift
定義變量
no
// 定義一個名為a,類型為str的變量
a = 'abc'
// 定義一個名為i64,類型為i64的變量
i64
a u32
- 變量名如果和類型名一致,可以使用省略寫法
- 如果是0值,可以省略賦值
字符串連接
no
// 定義一個名為a-b-c,類型為str的變量
a-b-c = 'abc'
// 字符串拼接
a-b-c-d = 'abc' - 'c'
- 變量名使用小寫字母和
-,都不用按shift。在很多系統中-連接的被認為是一個單詞,方便使用TAB快速使用 - 字符串連接使用
-,也不用按shift,同時-本身就是連字符,回歸本意
模塊引用
no
// 標準庫不用顯式引用
// # std/math
// 本地模塊
# /src/utils.greet
// 網絡模塊
# github.com/lizongying/nolang/test2/utils.greet greet2
greet('World')
greet2('World')
// 標準庫的函數可以直接使用
b = sin(1.0)
#既不佔用關鍵字又極為簡便- 別名僅跟一個空格即可
包配置
nolang.jsonc
jsonc
{
"name": "test1",
"version": "0.1.0",
"description": "A new Nolang project",
"keywords": [
"nolang"
],
"author": "lizongying",
"email": "lizongying@msn.com",
"organization": "lizongying",
"repository": "https://github.com/lizongying/nolang",
"homepage": "https://lizongying.github.io/nolang",
"license": "MIT",
"workspace": "../../",
"dependencies": {
"github.com/lizongying/nolang/test1": "v0.1.0",
"github.com/lizongying/nolang/test2": "v0.1.0",
},
"compiler": {
"version": "0.1.0",
},
"output": "./dist",
"ignore": [],
}
- 沒有過多配置,約定大於配置
工作空間
workspace.jsonc
jsonc
{
"test1": "./example/test1",
"test2": "./example/test2",
}
- 輕鬆實現多包
- 測試開發本地包非常簡單
- workspace.jsonc可以上傳git
流程控制
no
// 一直循環執行
! {
}
// 限定執行次數
10 * {
}
// 遍歷
i <- (a..b] {
}
// 內部無條件執行
x == 1 {
b = 2
}
i <- (a..b] {
// continue
*
}
i <- (a..b] {
// break
**
}
i <- (a..b] {
// return
...
}
- for/while等語法統一
- 不佔用任何關鍵字
區間語法
以vec為例
no
[]t[..]
[]t[..)
[]t(..]
[]t(..)
[]t[n0..]
[]t[n0..)
[]t(n0..]
[]t(n0..)
[]t[..n1]
[]t[..n1)
[]t(..n1]
[]t(..n1)
[]t[n0..n1]
[]t[n0..n1)
[]t(n0..n1]
[]t(n0..n1)
- 同時支持arr、vec、str、num,以及for、match中使用
- 比如
i <- [a..b),很清楚就知道包括a,不包括b
枚舉
nolang
// red=0, green=1, blue=2
color {
red,
green,
blue,
}
// 在普通方法中,a,b,c 實際是定義的a=0,b=1, c=2... 這是和其他語言不一致的地方。
// 所以正常不能用逗號的方式定義多個變量
// 這是一個特殊枚舉, 可以有類型,有逗號, 有別名
enum-name {
a t,
b u,
c v,
}
// 注意這是一個普通的struct,多個字段沒有逗號
struct-name {
a t
b u
c v
}
接口
nolang
// 定義接口
json {
to-json()
}
// 接口默認實現
json.to-json() {
}
// 接口實現
user json {
name str
age i64
}
// 重寫 + 調用父實現
user.to-json() {
// 父實現
..to-json()
}
user.other() {
// 當前實現
.to-json()
// 父實現
..to-json()
}