@arxo/law-engine (英语)
作为Web Assembly的Arxo Law引擎:编译 .law 包,检查它们,
并评估节点、浏览器和
工人们. 模块没有进口——没有WASI,没有时钟,没有
环境——所以同一请求在任何地方给出相同的字节.
你需要哪个包裹?
| 你想这样 | 使用 |
|---|---|
| 问一个已经出版的罐子的问题 并获得有证据的答案 | @arxo/law 它包住这个引擎 组装箱子 并预测答案 |
检查或编译 .law 编辑器、 CI 或浏览器中的源 | @arxo/law-engine,完整模块 |
| 用最小模块评价已编译的软件包( CLIR) | @arxo/law-engine,核心模块 |
| 只有文件和诊断的种类 | @arxo/law-types |
快速启动
npm install @arxo/law-engine
请检查date=中的日期值 (帮助)
import { loadEngine } from '@arxo/law-engine/node';
const engine = await loadEngine();
const source = `language "law.core" version "0.2";
package demo.age version "0.1.0";
namespace "urn:example:demo-age";
pub entity Person;
pub relation age(p: Person, years: Integer) kind empirical;
pub relation adult(p: Person) kind institutional;
rule Adult(p: Person, y: Integer) strict {
when aeg(p, y);
when y >= 18;
then adult(p);
}
`;
const { answer } = engine.call({ op: 'check', path: 'demo.law', files: { 'demo.law': source } });
answer.ok; // false
answer.diagnostics[0].code; // 'LDC-E2102'
answer.diagnostics[0].message // 'predicate "aeg" is not declared as a relation in this file'
answer.diagnostics[0].primarySpan.start; // { line: 10, character: 8, offset: 284 }
修补 aeg → age 将软件包编译到其犬形中间体
代表权:
const lowered = engine.call({ op: 'lower', path: 'demo.law', files: { 'demo.law': fixed } }).answer;
const ir = JSON.parse(lowered.bytes);
ir.semanticVersion; // '0.2.5'
ir.artifactHash; // 'sha256:e2c51767…'
engine.semanticHash(ir); // the freshness fingerprint
在开发者笔记本电脑上测量(20号,2026-10-02号): loadEngine() 75分钟,
check 本包的长度为44毫秒.
两个模块
| 模块 | 大小 | 出口 | 用它当 |
|---|---|---|---|
law_wasm.wasm (默认) | 11.3 甲基溴 | 评估器 + 编译器调色器 + 发音器 | 您分析, 检查或降低 .law 来源 |
law_wasm_core.wasm | 5.4 甲基溴 | 评估器、犬形、语义散列、程序手柄 | 您评估编译的软件包 |
law_binary_core.wasm | 5.9 甲基溴 | 紧凑二进制信封的评价器 | 选项 /binary 条目 |
两个主要模块都以字节相同的方式答复评价请求 文档。 核心模块完全没有编译器: 全包拒绝 一个核心模块在即时化,而不是在第一次呼叫时失败.
评价
import { loadCoreEngine, REQUEST_SCHEMA } from '@arxo/law-engine/core/node';
const core = await loadCoreEngine();
const program = core.load(ir); // load once
const { document } = program.evaluate({ // evaluate many cases
schemaVersion: REQUEST_SCHEMA, // 'law.core.evaluation-request/0.2'
semanticVersion: ir.semanticVersion,
case: caseDocument,
query,
});
program.dispose();
document 是评价文件:结果、证明图表、问题和
胡说八道 请求信封已经关闭.. schemaVersion 财务报告和审定财务报表
semanticVersion 执行选项 case.options。 。 。 .
大楼 caseDocument 很少需要手动: @arxo/law 组装起来
从简单的事实, 检查他们与包先.
到处跑
浏览器
import { LawEngine } from '@arxo/law-engine';
const wasmUrl = new URL('@arxo/law-engine/law_wasm.wasm', import.meta.url);
const engine = await LawEngine.instantiate(await fetch(wasmUrl));
模块以空导入对象即时化; 如果失败,
建筑是错的,不要阻碍进口。 当你复制文件时
你自己来,复制完整 dist 目录,包括 composition.js。 。 。 .
网络工人 ——脱离主线
import { createWorkerEngine } from '@arxo/law-engine/worker';
const worker = new Worker(new URL('@arxo/law-engine/worker-entry', import.meta.url), { type: 'module' });
const engine = createWorkerEngine(worker, new URL('@arxo/law-engine/law_wasm.wasm', import.meta.url).href);
await engine.init();
const result = await engine.call({ op: 'features' });
worker.terminate();
关于核心单元: @arxo/law-engine/core/worker-entry 财务报告和审定财务报表
law_wasm_core.wasm。 。 。 .
节点工人线程
import { Worker } from 'node:worker_threads';
import { createRequire } from 'node:module';
import { createWorkerEngine } from '@arxo/law-engine/worker';
const resolve = createRequire(import.meta.url).resolve;
const worker = new Worker(resolve('@arxo/law-engine/worker-node-entry'));
const engine = createWorkerEngine(worker, resolve('@arxo/law-engine/law_wasm.wasm'));
await engine.init();
worker.terminate();
节点工人条目从本地路径装入 file: URL 以及 网络
HTTP和数据URL.
一个完整的软件包树 - 明确、锁定、案件、依赖
const { answer } = engine.call({
op: 'ask', path: 'pkg', files,
args: {
case: 'Main',
evaluate: 'evaluate truth(demo.rules::eligible("Ada"));',
queryId: 'urn:law:demo:case#case/Main/query/eligible',
},
});
files 将路径映射到 UTF-8 文本或 { base64: '…' } 字节:列表,
law.lock、来源和案例、实际的依赖和固定的
资源。 引擎从不安装依赖性或读取网络
代表编译请求.
API 密码
编译调色板 — 完整模块
engine.call(request) 返回时 { answer, bytes }· ; bytes 是峡谷
形式 answer。 。 。 .
op | 对 |
|---|---|
parse | 语法树和语法诊断 |
check | 所有静态诊断 : { ok, diagnostics } |
lower | 编译软件包( CLIR) |
layer, (中文(简体) ), features | 语义层和软件包的特征 |
expand | 模板扩展的软件包 |
explain, (中文(简体) ), why-not, (中文(简体) ), graph | 编译软件包的解释、阻塞和依赖图 |
test | 包的相容性向量 |
ask | 评估保存的完整软件包树 |
发动机
| 方法 | 回返 |
|---|---|
LawEngine.instantiate(source) | 引擎,来自 fetch 响应或字节 |
engine.evaluate(request) | { document, bytes } - 一项评价 |
engine.load(ir) 编号 : engine.loadBytes(bytes) | 程序控件 : evaluate(request) 无 ir,则 dispose() |
engine.verbalize({ ir, pack, labels? }) | { text, contentHash, gaps, blocks } 模板包(完整模块)下的软件包审查文本 |
engine.canon(document) | 任意 JSON 文档的可读字节 |
engine.semanticHash(document) | 新鲜度指纹 |
失败
无论引擎本身如何回答,失败就是一个值:
{ error: { code, message } } 或信封内有 ok: false包装
仅用于滥用和显示主机故障,如
HostAdapterError 与 code 财务报告和审定财务报表 message (在全体工人中保留).
将诊断结果匹配在马厩上 code (单位:千美元)LDC-E…),在消息上没有
语句。 装载器拒绝为另一个ABI版本所建模块.
类型
每个文件和诊断都来自规范的JSON计划
@arxo/law-types,则
软件包是唯一的依赖,然后在此再导出:
import type { EvaluationDocument, Diagnostic } from '@arxo/law-engine';