4 个版本
0.0.3 | 2021年12月3日 |
---|---|
0.0.2 | 2021年8月22日 |
0.0.1 | 2021年8月20日 |
0.0.0 | 2020年2月2日 |
296 / 编程语言
690KB
14K SLoC
≈
Unseemly 会检查你编写的代码,而不是宏编写的代码。这使得宏感觉像是语言的一部分,而不是附加的东西。
要了解更多信息,请参阅 http://unseemly.github.io
Unseemly 只包含启动实用语言实现所必需的最小形式的。
Unseemly 目前还处于早期阶段,因此虽然以下所有功能都已存在,但仍有许多功能还不够完善。
功能
来自 ML 系列
- 代数类型(例如,支持结构体和(丰富的)枚举)
- 使用
match
进行类型安全的解构。 - 泛型类型(或参数类型)(例如
List<T>
) - 递归类型
来自 Scheme 系列
- 语法伪引号(
'[Expr | … ]'
引用一个表达式,但在此内部,,[Expr | … ],
评估其内容并将它们插值 - 美化打印尊重宏调用和引号语法(虽然美化打印器目前相当有限)
- 卫生宏(所有操作都尊重 α-等价)
- 通过示例实现宏(轻松实现 n-元形式,无需编写样板循环)。
不寻常的功能
- 在语法引号下的类型检查(所以如果
'[表达式 | (加一 ,[表达式1],)]'
表达式1 的类型是表达式<字符串>
,则会出现类型错误) - 生成的代码中没有类型错误(如果宏调用通过了类型检查,它扩展的代码就不需要类型检查)†。
- 可扩展的解析和词法分析(直接编写真实的 SQL 或正则表达式,而不是字符串)。
† 除了已知的 安全性错误。
其他功能
- 功能齐全的 REPL,具有持久性命令历史和行编辑(由
rustyline
提供)。
如何使用它
如果你还没有安装 Rust,请安装 Rust
curl https://sh.rustup.rs -sSf | sh
从你的 Unseemly 仓库目录,运行示例程序
cargo run --release examples/sum_list.unseemly
(推荐)获取 Unseemly REPL 的默认前言
cp examples/.unseemly_prelude ~/
启动 REPL
cargo run --release
文档
查看 core_language_basics.md 以了解语言的文档。
相关工作
研究项目
FreshML / Romeo
Unseemly 最接近基于 Romeo,它源自 FreshML。(Romeo 更接近 Pure FreshML,但 Unseemly 中没有 "Pure" 部分。)Romeo 允许操作具有复杂绑定信息的语法类型,但
- 语法其他方面是无类型的
- 没有宏系统(因此语法操作毫无意义!)
- 它只是一个核心演算
SugarJ / SoundX
SoundX 是一种在展开前进行类型检查的语法扩展语言。它提供稳健的语言扩展,但
- 它不支持绑定注释(在实践中,这意味着语法扩展作者最终会编写包含逻辑事物如
x ∉ dom(E)
的规范)。 - 语言扩展不是宏(它们本身不是语言的一部分)
- 它只是一个核心演算
(待办事项:扩展是否静态验证为类型保留?我认为是这样,但我不确定。)
实用语言
Scala
如果理解正确,Scala 的黑盒宏在展开前进行类型检查,但它们不能做白盒宏能做的所有事情。Unseemly 宏在展开前进行类型检查,但它们是唯一的宏系统,因为它们可以(特别是)安全地定义新的绑定形式。(待办事项:了解更多关于 Scala 宏系统的信息)
Wyvern
Wyvern 的主要动机示例(在你的通用代码中编写 SQL,而不是包含 SQL 的字符串)与 Unseemly 对内联语法扩展的愿景非常相似。Wyvern 是一种完整语言,而不是核心语言。我相信编写新的嵌入式语言不如宏定义容易。
Wyvern 还包含一些超出 Unseemly 范围的功能。
(待办事项:了解更多关于 Wyvern 的信息)
Terra
从快速浏览(待办事项:了解更多)来看,Terra 似乎是一种与 Lua 关系密切的语言,类似于基于 Unseemly 的语言之间的关系。
在这种情况下,目标似乎是结合高级和低级语言,没有 FFI 并内联嵌入。
MetaOCaml
MetaOCaml 是 OCaml 的扩展,支持类型安全的语法引号。尽管 Unseemly 使用 "准引号" 来描述语法引号,但它与 MetaOCaml 的括号更相似,而不是 Scheme 的准引号,因为它尊重了字母等价性。
与 Unseemly 不同,MetaOCaml 不会使用其安全的语法引号来实现宏系统。
Rust 和 SweetJS
Rust 和 SweetJS 是基于非 S 表达式的语言,具有允许丰富语法的宏系统。
Unseemly 是用 Rust 实现的,并且使用了大量的宏。
依赖项
~7–18MB
~242K SLoC