#脚本语言 #编程语言 #解释器 #WASM #函数式编程 #模式匹配

bin+lib skiff

一个以不可变性为首要,语法友好,用 Rust 编写的编译器和解释器的函数式脚本语言!

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 编程语言

MIT 许可证

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