Experimental exact-decimal FEEL and DMN interpreter
| 面 | 对应 | 说明 |
|---|---|---|
| 源码 | tag v0.1.3 | mooncakes 0.1.3 的打包内容与该 tag 指向的提交一致 |
| mooncakes | sundaysebasidian-byte/moondmn@0.1.3 | 包内容固定,不随 main 变化 |
| Pages | 最近一次推送到 main 的构建 | pages.yml 每次 push 到 main 都会重新构建,可能领先于 0.1.3 |
# 源码测试
git checkout v0.1.3
moon test --target all
# 安装包调用:在仓库外新建模块,把“安装与接入”中的 import 和示例原样放入 cmd/main
moon new consumer && cd consumer
moon add sundaysebasidian-byte/moondmn@0.1.3
moon run cmd/main
# 线上引擎:打开 Pages;对应的构建见 Actions 中 Pages 工作流的运行记录
gh run list --workflow pages.yml --limit 1scripts/build-web.sh
node web/smoke.mjs
python3 -m http.server -d web/dist 8000export PATH="$HOME/.moon/bin:$PATH"
moon version
moon buildmoon add sundaysebasidian-byte/moondmngit clone https://github.com/sundaysebasidian-byte/moondmn.git
cd moondmn
moon build
moon run cmd/main -- feel 'sum([1, 2, 3]) * 2'12import {
"sundaysebasidian-byte/moondmn",
"sundaysebasidian-byte/moondmn/feel/types",
}fn main {
let result = @moondmn.feel_eval("sum([1, 2, 3]) * 2") catch {
@types.Failure(_, _, _, message) => "error: " + message
}
println(result) // 12
}moon run examples/api-demomoon run cmd/main -- feel 'Applicant Age >= 18' --context examples/input.jsontruemoon run cmd/main -- feel 'list replace([1, 2, 3], 2, 4)'[1,4,3]moon run cmd/main -- eval examples/eligibility.dmn \
--decision Eligible --input examples/input.jsontruemoon run cmd/main -- lint examples/eligibility.dmn[]./scripts/fetch-tck.sh
moon run cmd/main -- tck .tck/TestCases/compliance-level-2 \
--json evidence/tck-level-2.json
moon run cmd/main -- tck .tck/TestCases/compliance-level-3 \
--json evidence/tck-level-3.jsonmoon run cmd/main -- tck .tck/TestCases/compliance-level-3/0068-feel-equality| 能力 | 状态 | 说明 |
|---|---|---|
| FEEL 精确十进制 | 已支持 | 34 位、半偶舍入、scale [-6111,6176];超越函数仍用有限精度浮点桥接 |
| 三值逻辑与 null 相等 | 已支持 | and/or/not、FEEL 相等规则 |
| 日期、时间、时长、时区 | 部分支持 | 时区只内置 IANA 2026e 的 39 个名称、1970–2100 年;范围外报错,DST gap 报错、overlap 取较早时刻;详见 conformance |
| 列表、上下文、区间 | 部分支持 | 支持常用操作;开闭区间边界、重复键等仍有 TCK 失败 |
| 过滤器、路径、迭代器 | 部分支持 | 路径按已知键识别多词名称;item 遮蔽、缺字段与非法 domain 处理仍有失败 |
| 用户函数与 BKM | 部分支持 | 命名缺参绑定 null;部分类型/输出适配仍有失败 |
| 决策表 | 部分支持 | 全部 hit policy 可用;复杂模型和 inputVariable 匹配仍有失败 |
| lint | 部分支持 | 未定义引用、重复规则、可能的缺口;输入域有限(枚举 allowedValues,最多 4096 个组合)且被证明完整覆盖时不告警,开放域仍提示 |
| 决策服务与 DRG | 部分支持 | 依赖求值与输出集合可用;服务参数顺序/类型适配仍有失败 |
| 类型系统 | 部分支持 | 根包/CLI/Playground 共用声明时态 JSON 转换;结构类型/隐式转换仍有失败 |
| 内置函数 | 部分支持(约 90 个) | 剩余逐例缺陷和受限函数见 docs/conformance.md |
| now() / today() | 已支持(需注入时钟) | API 的 clock 参数、CLI 的 --now;不注入则报不支持 |
| 正则 s/x/m 标志 | 部分支持 | matches 支持 F&O Unicode 大小写变体、递归字符类相减和反向引用;完整范围见设计文档 |
| 外部 Java 函数 | 明确不支持 | 需要 JVM |
| DMN 1.5 import | 明确不支持 | 多文件导入尚未实现 |
| 级别 | 用例数 | 通过 | 通过率 |
|---|---|---|---|
| Level 2 | 116 | 116 | 100.0% |
| Level 3 | 3291 | 3258 | 99.00% |
moon fmt --check
moon check --deny-warn
moon test # native
moon test --target wasm-gc
moon test --target wasm
moon test --target js
moon info # 重新生成 .mbti,提交后不应有差异fn evaluate_compiled(expression : Expr, input : String, clock? : () -> DateTime?) -> String raise EngineErrorfn evaluate_decision(model : Model, name : String, input : String, clock? : () -> DateTime?) -> String raise EngineErrorfn feel_eval(source : String, context? : String, clock? : () -> DateTime?) -> String raise EngineErrorInstall
Download zipExperimental exact-decimal FEEL and DMN interpreter