新语言
语言设计目的
如果现在需要发明一种新语言,我们还需要哪些特性?
设计一种安全、简洁、含糖量高的静态语言,保持极端的优雅和原生性能。使我们能像编写脚本语言一样编写出安全的、高效且优雅简洁的静态类型代码。可使用 LLVM 作为编译器后端,提供 C 库、Rust 等库的兼容性支持。
- 易于学习和使用的静态语言,同时保持高度的灵活性
- 接近 Rust 的简洁性,同时保持和 C/C++ 的互操作性
- 支持像 TypeScript 一样先进的鸭子类型系统
- 拥抱函数式编程,支持高阶函数和闭包
- 支持类型推导、可空类型、宏指令
- 不使用指针,使用更安全的抽象(引用和委托)
顶层语法
- 表达式即一切,一切合法的语句都是表达式
- 注释使用
/* ... */
和// ...
等 C 风格注释 - 变量直接赋值即声明,无需使用关键词
- 每行语句换行结尾,不需要分号
- AST
- Lisp 可解析的格式
- 可进行 JSON / YAML 转译
- 动态性
- 静态条件的
eval
,确定返回值类型 - 支持鸭子类型的面向对象,接口可使用类似 TypeScript 的方式描述
- 静态条件的
- 错误
- 错误是函数的返回值,可选地接收
- 编译过程
- 不使用不安全的宏,而是使用编译期执行的函数
- 用户态的宏是使用
$
开头的变量 - 能够在编译器反射语法树和注解
- 静态语言,与 C/C++ 互操作
- 同时拥有解释模式和编译模式
pure
关键字表示是否为纯函数,transient
不影响纯函数的行为- 组合式状态函数,用于管理状态上下文
类型系统
原生类型:
类型 | 大小 (bit) |
---|---|
char | 8 |
uchar | 8 |
wchar | 16 |
int | 32 |
uint | 32 |
long | 64 |
ulong | 64 |
float | 32 |
double | 64 |
同时也提供带有数字后缀的版本:
类型 | 大小 (bit) |
---|---|
int8 | 8 |
int16 | 16 |
int32 | 32 |
int64 | 64 |
uint8 | 8 |
uint16 | 16 |
uint32 | 32 |
uint64 | 64 |
float32 | 32 |
float64 | 64 |
不区分原生类型和包装类型,原生类型可调用包装类型的方法是编译时行为。
变量系统
变量无需使用关键词来声明:
rust
x = 3
可变变量:
rust
mut x = 3
不可变变量:
rust
x: float = 4
常量:
rust
const x = 3
常量解包支持:
rust
const (x, y) = (3, 4)
const { x, y } = Rect{ x: 3, y: 4 }
条件语句
If 语句:
rust
if x > 4 {
}
支持行内写法:
rust
a = if (b > 3) b * 5 - 6 else b * b
For 语句
rust
for i in 3..10 {
}
for i, item in iter(iterable) {
}
函数
rust
func add(x: int, y: int): int {
return x + y
}
匿名函数:
rust
x = (x: int, y: int) => x + y
泛型函数:
rust
func add<T extends C>(x: T, y: T): T {
return x + y
}
函数式语法:
rust
// Lambda 写法,类型推导将在 Lambda 上使用,使得 x 不需要类型
a = map(x => x ** 2, 1..100..5) // 此时 a 是一个迭代器
// 函数写法
a = (x => x ** 2).map(range(1, 100, 5))
位置解包:
rust
func f(x: ...int) {
print(...x)
}
a = [1, 2, 3] // a 是 list<int> 类型
b = arrayof(1, 2, 3) // b 是 array<int> 类型
f(...a)
f(...b)
宏函数
可使用 macro
关键词来声明宏函数:
rust
macro #add(x, y) {
return (
x + y
)
}
宏函数调用:
rust
#add(3, 4)
宏函数将在编译时作为脚本执行,执行源代码和编译器操作。
简单类支持
cs
class A {
_a: int?
lateinit b
_c: int = 3
init (x: int) {
mut b = x
}
}
特性支持
在代码最外层使用 @@rules
注解来声明特性:
rust
@@rules("no-unsafe")
使用 @decorator
注解来声明函数、类、参数或成员等的特性。
标准库支持
io
:文件和流string
:字符串iterator
:迭代器generator
:生成器coroutine
:协程
异步 API
rust
async func main() {
x = await aio.sleep(1000)
}
顶层异步模式:
rust
await aio.sleep(1000)