5 个版本
0.4.5 | 2021 年 9 月 6 日 |
---|---|
0.4.4 | 2021 年 9 月 6 日 |
0.4.3 | 2021 年 8 月 13 日 |
0.4.0 | 2021 年 7 月 18 日 |
0.3.0 | 2021 年 6 月 14 日 |
#325 in 编程语言
150KB
4K SLoC
Skiff
一个逐步类型化、语法友好、用 Rust 编写的解释器的函数式脚本语言!
运行
您可以在 Skiff 网络编辑器(由 WASM!提供支持)中运行 Skiff。
如果您更喜欢使用自己的文本编辑器,您可以从 crates.io 安装 Skiff 并从命令行运行它
cargo install skiff
skiff <filename> # make sure installed crate binaries are in your PATH
关于
Skiff 最初是我为了了解更多关于编程语言设计和实现而进行的个人项目。它是对现有语言中一些想法和语法的混合。然而,随着其发展,它成为了我学习不同算法(如 HM 类型推断和模式匹配表达式的完备性检查)的平台。
下一步计划是通过添加 typed
关键字来探索逐步类型化,以区分完全类型化的函数和部分类型化的函数。默认情况下,Skiff 将只有很少的静态保证。但是,您可以通过完全注释参数和返回类型或使用 typed
关键字来告诉 Skiff 推断函数类型,从而在给定的函数内选择更多的检查。目标是拥有一种与动态类型语言一样容易使用的语言,同时提供一些静态类型语言的保证和代码文档。
它看起来像什么?
# function definition (types are optional)
def fact(n: Number) -> Number:
match n:
| 1 => 1
| n =>
let next = fact(n - 1)
next * n
end
end
# conditionals
let cond: Boolean = true
if cond:
1
elif false:
2
else:
3
end
# algebraic datatypes (types are optional)
data Option:
| some(v: Number)
| empty()
end
# pattern matching
match some(1):
| some(n) => n
| empty() => 0
end
# anonymous functions
let increment: Number -> Number = lambda(n): n + 1 end
let add: (Number, Number) -> Number = lambda(a,b): a + b end
语言参考
完整文档仍在进行中。要了解功能和语法看起来如何,您可以查看 语言导览测试文件。
开发
克隆仓库以在 Skiff 上工作。您可以使用以下命令运行本地开发版本
cargo run -- <filename>
例如
cargo run -- tests/files/success/plus_and_times_precedence.boat
特性
语言特性
树遍历解释器 | 字节码解释器 | |
---|---|---|
算术 | ✓ | |
等价操作符 | ✓ | |
条件语句 | ✓ | |
函数 | ✓ | |
递归 | ✓ | |
lambda 表达式 | ✓ | |
let 绑定 | ✓ | |
改进的错误报告 | ✓ | |
类型注解 | ✓ | |
类型推断 | ✓ | |
代数数据类型 | ✓ | |
模式匹配 | ✓ | |
完备性检查 | ✓ | |
调用栈跟踪 | ✓ | |
参数化类型 | ||
typed 关键字 |
||
字符串 | ||
文件操作 | ||
测试构造 |
杂项
- REPL
- 语言参考
- Web 编辑器 (WASM)
- 持续集成
- 发布 crate
依赖项
~6–16MB
~137K SLoC