1个不稳定版本

0.1.0 2021年8月2日

#666编程语言

MIT 许可证

69KB
2K SLoC

yes-lang

另一种脚本语言

Rust的简单解释器

  • "手动"令牌化
  • 单行/多行注释
  • 前缀 & 中缀运算符
  • Pratt解析器实现
  • 树遍历解释器
  • 不可变作用域绑定
  • 函数作为一等公民
  • 词法分析器、解析器、解释器和REPL在 <2k LoC

目标

  • 通过实践学习
  • 易于理解
  • 易于实现
  • 易于遵循
  • 测试覆盖率

非目标

  • IO
  • stdlib
  • 安全性
  • 集合
  • 性能
  • 类型安全性
  • 生产就绪性
  • 通用可用性

REPL

$ cargo run
[...]
REPL: enter :q to quit.
> let hi = fn(name) { "hello " + name };
[AST]
<function>
> hi("world")
[AST]
hello world
> :q
$

运行

// examples/fib.yes

fn fib1(n, a, b) {
    if n == 0 { a+b }
    else { fib1(n-1, a+b, a) }
}

fn fib(n) {
    if n <= 0 { 0 }
    else {
        if n <= 2 { 1 }
        else {
            fib1(n-2, 1, 0)
        }
    }
}

fib(42) == 267914296 && fib(84) == 160500643816367088

$ cargo run examples/fib.yes
[...]
true

无运行时依赖