内容
# 消除
这段文字是一个程序。
*作为 Prosecode 家族的一部分 — 一套用于编写、验证和传输结构化推理的工具。*
Liminate 是一种以散文作为语法的语言,其语法是普通的英文。由 61 个保留字组成的词汇量很小,可以组合成句子,而真正的解释器可以分析、解析、类型检查和运行这些句子。不是提示。不是代码生成器。散文就是程序。
## 它做什么
您可以直接用可读的中文写出您想要的内容,每行一个语句,解释器直接执行它。如果散文没有说,就不会发生 — 没有沉默的推断,没有模糊的解析。如果您写的是别人可以阅读的程序,那么这就是为您准备的。
## 示例
```
收集从 1 到 10 的数字
过滤数字中每个大于 5 的数字
求数字的总和
```
运行它:
```bash
liminate demo.limn
```
您将得到 `1, 2, 3, 4, 5, 6, 7, 8, 9, 10`,然后得到 `40` — 过滤后剩余数字的总和。解释器还会回显每个语句的规范形式,以便您在运行前准确看到它的理解。
## 由 Liminate 构建
Liminate 是一种以散文作为语法的语言,普通的英文句子可以直接执行。这五个仓库形成了一个用于编写、验证和传输结构化推理的系统。
| | 仓库 | 它做什么 |
|---|---|---|
| **← 这个仓库** | [**liminate**](https://github.com/rmichaelthomas/liminate) | **语言和解释器。有限词汇,确定性执行,领域包。** |
| | [liminate-session-contracts](https://github.com/rmichaelthomas/liminate-session-contracts) | 跟踪已验证的源、推断的主张、锁定的决策和用户的更正为可执行的 `.limn` 合同。 |
| | [prosecode-prompt-compiler](https://github.com/rmichaelthomas/prosecode-prompt-compiler) | 在代理响应之前,将用户提示编译为结构化的意图。七个动词,二十四个槽。 |
| | [prosecode-context-pager](https://github.com/rmichaelthomas/prosecode-context-pager) | 根据当前意图评估对话历史。决定保留、总结或删除什么。 |
| | [prosecode-handoff-packet](https://github.com/rmichaelthomas/prosecode-handoff-packet) | 为另一个代理继续工作而打包会话 — 保存已验证和未验证的内容。 |
→ [liminate.dev](https://liminate.dev)
仓库的命名分为两层:`liminate-*` 是基础(语言及其原生格式),`prosecode-*` 是处理层(操作上下文的工具)。
Liminate 还驱动了一个围绕 [Seshat](https://github.com/rmichaelthomas/seshat-app) 的独立产品集群,Seshat 是一个本地环境代理中心,控制 AI 代理在您的机器上执行的操作 — 请参阅 [seshat-app](https://github.com/rmichaelthomas/seshat-app) 仓库或 [liminate.dev/seshat](https://liminate.dev/seshat)。
## 安装
需要 Python 3.10+。
```bash
pipx install liminate
# 或:
pip install liminate
liminate --version
liminate demo.limn
```
解释器完全在您的机器上运行。没有网络调用,没有遥测数据,没有服务器依赖。
macOS、Linux 和 Windows 的独立二进制文件在 [Releases 页面](https://github.com/rmichaelthomas/liminate/releases)上 — 不需要 Python。
对于贡献者:
```bash
git clone https://github.com/rmichaelthomas/liminate.git
cd liminate
python -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
pytest tests/
```
## 工作原理
当前版本为 **v0.16.0**:21 个动词,22 个连接词,10 个运算符,2 个声明,61 个基本保留字,**1654 个测试通过**。
### 管道
五个处理阶段 — 词法分析器、重新排序器、解析器、语义分析器、解释器 — 具有规范渲染和结构化结果处理。CLI 包装器外部没有 `print` 调用;每个模块都返回一个结构化的 `LiminateResult`。
两个执行阶段:
- **阶段 1 — 顺序。** 每个语句按顺序运行。逐步提交:如果后续操作失败,则早期副作用仍然存在,错误会指出已完成的操作。
- **阶段 2 — 反应监听器。** `when`/`unless` 注册由外部事件源(领域包适配器)驱动的处理程序。边缘触发,深度优先,级联,保守的相同处理程序两次循环检测。`finish` 立即且完全退出。
### 词汇(61 个词)
**动词(21 个):** `记住`、`显示`、`过滤`、`保留`、`计数`、`收集`、`求和`、`每个`、`选择`、`完成`、`添加`、`删除`、`削弱`、`要求`、`禁止`、`允许`、`分配`、`期望`、`排序`、`比较`、`转换`。 Deontic Era 完成了义务/禁止/许可三角:`require` 在其条件为假时停止,`forbid` 在其条件为真时停止(`PROHIBITION_VIOLATED`),而 `permit` 在其条件为真时发出信息行,但从不停止。 `sum` 在 v0.15.0 中从 `combine` 重新命名 — `combine` 被 tombstoned,现在错误带有重命名特定的消息。 该家族中的所有四个条件动词 — `require`、`forbid`、`permit`、`expect` — 还接受一个 `unless <exception>` 子句,在主条件之后(v0.16.0):`forbid total is above 10000 unless approved is equal to yes`。 零个新词 — `unless` 在新的语法位置。
**连接词(22 个):** `哪里`、`和`、`或`、`来自`、`带有`、`称为`、`到`、`如何`、`作为`、`属于`、`如果`、`否则`、`何时`、`除非`、`包括`、`在`、`超过`、`然后`、`通过`、`因为`、`开始`、`直到`。 `because` 将引用的理由附加到任何动词语句上作为惰性元数据 — 在规范渲染、`inspect` 和 Receipts 中可见,但从不执行。 语句终端和每个语句:`require amount is above 50000 because "SOX compliance"`。 最后两个,`starting` 和 `until`,是语句初始时间修饰符,附加引用的 ISO 8601 日期作为惰性元数据 — 生效日期和 sunset 条款:`starting "2025-07-01" until "2025-12-31" require amount is above 50000`。 时间评估是产品层面的关注,而不是解释器运行时。
**运算符(10 个):** `是`、`高于`、`低于`、`不是`、`加`、`减`、`反转`、`继承`、`最高`、`最低`。 多词:`等于`、`乘以`、`除以`。 `inherited` 是一个语句初始修饰符,标记一个动词语句从先前上下文(会话、代理、合同)继承而来 — 惰性出处元数据,可覆盖,从不执行。 它重用 `from` 连接词进行语句最终代理归属:`inherited require amount is above 50000 because "SOX compliance" from agent-compliance`。 `highest`/`lowest`(v0.15.0)是列表极值值选择器 — `highest of nums` 或 `highest total of orders` — 仅限数字,返回值,如果列表为空则错误。
**冠词(3 个):** `the`、`a`、`an` — 装饰性;解析器忽略它们。
**声明(2 个):** `about` 和 `define`。 `about` 将程序的主题声明为惰性元数据 — 单个,仅限第一行;对工具可见(`inspect`,构建清单)但从不存储或执行:`about "expense authorization"` 或 `about expense-authorization`。 `define <name>: <condition>`(v0.16.0 的定义时代)命名一个可重用的领域谓词 — `define overdue: due-date is below cutoff` — 在其他地方引用为 `is overdue` / `is not overdue`。 谓词可以组合,可以重新定义,并且在条件语法工作的所有地方都有效(`where`、`require`、`forbid`、`when` 等),无需动词特定更改。
**分隔符(1 个):** `:` — 将组合名称与其主体分开,以及 `choose` 分支的条件与其操作。
`"..."` 将多词字符串值或与保留字冲突的值括起来。 引号仅在值位置;名称使用连字符。 引用的内容原样保留,包括大小写。
算术表达式使用 PEMDAS 优先级(乘法/除法优先于加法/减法,在同一层级中从左到右)并且在任何值位置都有效。
值包括数字、字符串、日期、列表和记录。 日期(v0.16.0 的日历时代)是裸 ISO 8601 字面量(`2025-07-01`,不需要引号)带有整日算术(`2025-07-01 plus 30`),所有比较运算符,基于天的 `within` 容差,以及 `highest`/`lowest`/`sort` 支持。
### 领域包
包是一个小的 JSON 文件,在加载时添加名词和动词。 基础 61 个词是永久的;包贡献的词仅在包激活时保留。
包动词声明一个槽签名,一个类型约束和六种执行调度之一:
| 执行 | 它做什么 |
|---|---|
| `set_value` | 将值写入命名 live-value 或记录字段。 |
| `substring_check` | 针对目标字符串进行区分大小写的包含检查;如果丢失则出错。 |
| `append_to_list` | 带有 v1-add 安全检查的深度复制追加到列表中。 |
| `set_field` | 在记录上设置或创建字段(更新模式)。 |
| `compare_values` | 等值或结构比较;发出状态 + 两个目标的差异。 |
| `numeric_extract_compare` | 从文本中提取数字,在容差范围内比较,发出匹配/增量。 |
捆绑包:`timer`、`stdin`、`file-watcher`、`research`,以及一个 UI 参考包(`screen`、`button` 等 + `navigate to <screen>`)。
### 构建独立二进制文件
```bash
liminate build demo.limn --output demo
./demo
./demo --inspect # 源代码,规范渲染,使用的包,词汇
```
以与运行时注册包相同的方式捆绑包 — 文件路径或内联 JSON,可重复。
### 运行示例
```bash
liminate examples/program1_basics.limn
liminate --quiet examples/dogfood_v2a_14_realistic.limn
# 事件驱动监听器
liminate --pack examples/dogfood_v3a_pack.json --test --quiet \
examples/dogfood_v3a_event_driven.limn
# UI 包
liminate --pack examples/pack_ui.json --quiet \
examples/dogfood_navigate_test.limn
```
### 项目布局
```
liminate/
├── src/liminate/ 管道(词法分析器,重新排序器,解析器,渲染器,
│ 分析器,解释器,监听器,适配器,运行,包)
├── tests/ 1456 个测试
├── examples/ 可运行的 .limn 程序 + 参考包
├── docs/spec/ 锁定规范文档
└── docs/ 快速入门,语法游览,管道演练
```
### 测试纪律
锁定的测试句子同时是测试用例和语法制品 — 句子就是发现的语法。 设计问题在编写它们时出现,在规范中解决,只有在编写 Python 代码后才完成。
### 设计原则
- **散文就是程序。** 没有推断,没有猜测。 如果散文没有说,就不会发生。
- **词汇是边界。** 61 个基本保留字。 通过组合和领域包提高表达能力,而不是通过添加关键字。
- **重新排序器不会猜测。** 模糊的排列会产生琥珀色的澄清提示,而不是沉默的选择。
- **授权,而不是创作。** 入门是修改现有程序,而不是从空白文件创作。
- **抽象语法树是真相的源头。** 解析器重建一个规范的英文句子,以便您在运行前看到被理解的内容。
## 安全性和数据流
参见 [TRUST-BOUNDARY.md](https://github.com/rmichaelthomas/liminate-session-contracts/blob/main/docs/TRUST-BOUNDARY.md),了解在三种使用模式下 — 本地、Receipts 保存和片段编码检查 — 中数据在各个部分流动的完整描述。
## 许可证
Apache 2.0。参见 [LICENSE](LICENSE)。
---
*语言是一种命名工具。问题从来不是非程序员是否能进行计算思维 — 问题是为什么我们一直让他们使用别人的语言来进行计算。*
连接信息
猜你喜欢
暂无推荐服务器