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

MIT 许可证

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 不会使用其安全的语法引号来实现宏系统。

RustSweetJS

Rust 和 SweetJS 是基于非 S 表达式的语言,具有允许丰富语法的宏系统。

Unseemly 是用 Rust 实现的,并且使用了大量的宏。

依赖项

~7–18MB
~242K SLoC