Skip to content

新语言

语言设计目的

如果现在需要发明一种新语言,我们还需要哪些特性?

设计一种安全、简洁、含糖量高的静态语言,保持极端的优雅和原生性能。使我们能像编写脚本语言一样编写出安全的、高效且优雅简洁的静态类型代码。可使用 LLVM 作为编译器后端,提供 C 库、Rust 等库的兼容性支持。

  • 易于学习和使用的静态语言,同时保持高度的灵活性
  • 接近 Rust 的简洁性,同时保持和 C/C++ 的互操作性
  • 支持像 TypeScript 一样先进的鸭子类型系统
  • 拥抱函数式编程,支持高阶函数和闭包
  • 支持类型推导、可空类型、宏指令
  • 不使用指针,使用更安全的抽象(引用和委托)

顶层语法

  • 表达式即一切,一切合法的语句都是表达式
  • 注释使用 /* ... */// ... 等 C 风格注释
  • 变量直接赋值即声明,无需使用关键词
  • 每行语句换行结尾,不需要分号
  • AST
    • Lisp 可解析的格式
    • 可进行 JSON / YAML 转译
  • 动态性
    • 静态条件的 eval,确定返回值类型
    • 支持鸭子类型的面向对象,接口可使用类似 TypeScript 的方式描述
  • 错误
    • 错误是函数的返回值,可选地接收
  • 编译过程
    • 不使用不安全的宏,而是使用编译期执行的函数
    • 用户态的宏是使用 $ 开头的变量
    • 能够在编译器反射语法树和注解
  • 静态语言,与 C/C++ 互操作
  • 同时拥有解释模式和编译模式
  • pure 关键字表示是否为纯函数,transient 不影响纯函数的行为
  • 组合式状态函数,用于管理状态上下文

类型系统

原生类型:

类型大小 (bit)
char8
uchar8
wchar16
int32
uint32
long64
ulong64
float32
double64

同时也提供带有数字后缀的版本:

类型大小 (bit)
int88
int1616
int3232
int6464
uint88
uint1616
uint3232
uint6464
float3232
float6464

不区分原生类型和包装类型,原生类型可调用包装类型的方法是编译时行为。

变量系统

变量无需使用关键词来声明:

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)