@aster-cloud/aster-lang-ts 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/dist/src/config/semantic.d.ts +19 -0
  3. package/dist/src/config/semantic.d.ts.map +1 -1
  4. package/dist/src/config/semantic.js +32 -0
  5. package/dist/src/config/semantic.js.map +1 -1
  6. package/dist/src/core/interpreter.js +43 -7
  7. package/dist/src/core/interpreter.js.map +1 -1
  8. package/dist/src/core/resolve-typed-references.d.ts.map +1 -1
  9. package/dist/src/core/resolve-typed-references.js +18 -1
  10. package/dist/src/core/resolve-typed-references.js.map +1 -1
  11. package/dist/src/lsp/member-completion.d.ts.map +1 -1
  12. package/dist/src/lsp/member-completion.js +22 -5
  13. package/dist/src/lsp/member-completion.js.map +1 -1
  14. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  15. package/dist/src/parser/decl-parser.js +2 -1
  16. package/dist/src/parser/decl-parser.js.map +1 -1
  17. package/dist/src/typecheck/browser.d.ts.map +1 -1
  18. package/dist/src/typecheck/browser.js +5 -4
  19. package/dist/src/typecheck/browser.js.map +1 -1
  20. package/dist/src/typecheck/context.d.ts +1 -1
  21. package/dist/src/typecheck/context.d.ts.map +1 -1
  22. package/dist/src/typecheck/context.js +9 -3
  23. package/dist/src/typecheck/context.js.map +1 -1
  24. package/dist/src/typecheck/expression.d.ts.map +1 -1
  25. package/dist/src/typecheck/expression.js +64 -20
  26. package/dist/src/typecheck/expression.js.map +1 -1
  27. package/dist/src/typecheck/module.d.ts.map +1 -1
  28. package/dist/src/typecheck/module.js +5 -4
  29. package/dist/src/typecheck/module.js.map +1 -1
  30. package/dist/src/typecheck/pure.d.ts +17 -0
  31. package/dist/src/typecheck/pure.d.ts.map +1 -1
  32. package/dist/src/typecheck/pure.js +96 -0
  33. package/dist/src/typecheck/pure.js.map +1 -1
  34. package/dist/src/typecheck/statement.d.ts.map +1 -1
  35. package/dist/src/typecheck/statement.js +3 -1
  36. package/dist/src/typecheck/statement.js.map +1 -1
  37. package/dist/src/typecheck/symbol_table.d.ts +3 -0
  38. package/dist/src/typecheck/symbol_table.d.ts.map +1 -1
  39. package/dist/src/typecheck/symbol_table.js +1 -0
  40. package/dist/src/typecheck/symbol_table.js.map +1 -1
  41. package/dist/src/typecheck/utils.d.ts +1 -1
  42. package/dist/src/typecheck/utils.d.ts.map +1 -1
  43. package/dist/src/typecheck/utils.js +1 -1
  44. package/dist/src/typecheck/utils.js.map +1 -1
  45. package/dist/src/typecheck/workflow.d.ts.map +1 -1
  46. package/dist/src/typecheck/workflow.js +13 -2
  47. package/dist/src/typecheck/workflow.js.map +1 -1
  48. package/dist/test/unit/core/caseless-pattern-name.test.d.ts +2 -0
  49. package/dist/test/unit/core/caseless-pattern-name.test.d.ts.map +1 -0
  50. package/dist/test/unit/core/caseless-pattern-name.test.js +114 -0
  51. package/dist/test/unit/core/caseless-pattern-name.test.js.map +1 -0
  52. package/dist/test/unit/formatter-corpus-roundtrip.test.js +2 -0
  53. package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
  54. package/dist/test/unit/lsp/member-completion.test.js +67 -6
  55. package/dist/test/unit/lsp/member-completion.test.js.map +1 -1
  56. package/dist/test/unit/rule-call-checks.test.d.ts +2 -0
  57. package/dist/test/unit/rule-call-checks.test.d.ts.map +1 -0
  58. package/dist/test/unit/rule-call-checks.test.js +275 -0
  59. package/dist/test/unit/rule-call-checks.test.js.map +1 -0
  60. package/dist/test/unit/typecheck-followups.test.d.ts +2 -0
  61. package/dist/test/unit/typecheck-followups.test.d.ts.map +1 -0
  62. package/dist/test/unit/typecheck-followups.test.js +165 -0
  63. package/dist/test/unit/typecheck-followups.test.js.map +1 -0
  64. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,92 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.5
4
+
5
+ ### 类型检查放宽(与 aster-lang-core#232 #233 #234 同步)
6
+
7
+ - 按名字推断出的类型一律视为未知:未写类型的 data 字段(`Define Decision has approved, collateralRequired.`)
8
+ 不再按推断类型检查构造值(此前 `collateralRequired set to 1` 报 E012 `expects Text, got Int`);未写类型的形参 /
9
+ lambda 形参的类型实例在实参、字段、`Set`、`Return` 位置不作约束,并随 Let、`Set`、`Some(...)`、规则返回值传播
10
+ (`Return amount`、`Return Some(amount)`、`P with total set to amount` 不再报错)。aster-lang-test 语料消失 80 条 E012。
11
+ - `Return`(规则与 lambda)与实参同一套可赋值规则:数值拓宽(`produce Float` 时 `Return 1`、Int → Long / Decimal)、
12
+ T → T?、None → T? 放行;收窄(Float → Int、T? → T、Double ↔ Decimal)仍报 E003。
13
+ 泛型规则体内的 Return 不检查(`Rule bad of T … produce T: Return 1.` 不报,与 Java 一致;类型参数之间不做合一)。
14
+ - truffle `Builtins.canonicalName` 归一化的单词别名(`plus` `minus` `times` `divide` `modulo` `equals` `is` `under`
15
+ `over`,不区分大小写)与规范 builtin 名一样,同名的非函数局部名被调用时不报「调用非函数局部名」
16
+ (`given over as Int … over(3, 2)`),与 aster-lang-core `CallTargetBuiltins.ALIASES` 一致。
17
+
18
+ ### 修复
19
+
20
+ - 类型检查:`Decimal` 是内置标量,不再被当作隐式类型参数(#276)。此前 `x as Decimal` 形参降级为类型变量,任何实参
21
+ 都能传入,`produce Decimal` 还会误报 `expected Decimal, got Decimal`(语料 10 条)。现在 Int / Long → Decimal 放行,
22
+ Text / Float / Double → Decimal、Decimal → Int / Double 报 E001(ADR 0025)。Core IR 中 Decimal 签名的 `typeParams`
23
+ 由 `["Decimal"]` 变为 `[]`,与 Java 一致。
24
+ - 解释器:`T?` 的裸值与 `Some` / `None` 模式(#277)。宿主传入或 T → T? 直接传入的值不带 Some/None 标签,此前
25
+ `When Some(v)` / `When None` 都不匹配,Match 静默返回 null。现在裸的非 null 值匹配 `Some(v)`,null 匹配 `None`;
26
+ Some/None/Ok/Err 构造值不变。truffle 同步修复(aster-lang-truffle 同名分支)。
27
+ - 解释器:未声明的单词别名调用按 builtin 分派(`divide(10, 2)` → 5,与 truffle 一致;此前报 `Undefined function`)。
28
+
29
+ ## 1.2.4
30
+
31
+ ### 破坏性变更(类型检查)
32
+
33
+ - 调用本模块规则或函数值局部名时比较实参类型(#266):**新增 E001 拒绝**,如 `inc("a")`(`inc` 的形参
34
+ `x as Int`)报 `expected Int, got Text`;`Let g be inc. Return g("a").`、把 `(Text) -> Text` 的规则传给
35
+ `(Int) -> Int` 形参同样报错,与 aster-lang-core `BaseTypeChecker.checkCall` 同码。原则是能正常运行的调用不新增
36
+ E001,拿不准时放行:
37
+ - 只比较**写了类型**的形参。未写类型的形参(规则与 lambda)按名字推断出的类型不作为调用约束;实参若是
38
+ 未写类型的形参(`given amount` 后 `inc(amount)`),或经 Let 直接取自它的局部名(`Let y be amount. inc(y)`),
39
+ 同样不比较。
40
+ - 实参或形参含 Unknown / 类型变量时放行:泛型规则、`produce:` 推断不出的返回类型。
41
+ - **数值拓宽放行**:Int → Long / Float / Decimal,Long → Float / Decimal,Float ↔ Double;包括字面量
42
+ (`f(5)` 传给 Float / Long 形参)与容器元素(`List of Int` → `List of Float`、`Option of Int` → `Option of Float`)。
43
+ 收窄(Float → Int)仍报错。
44
+ - Maybe 与 Option 视为同一种类:T → T?、None → T?、T? ↔ `Option of T`、`Some(n)` → `Option of Int` 放行;
45
+ T? → T 仍报错。PII 包装比较前剥掉,函数类型不比较效应。
46
+ - aster-lang-test 全部 454 份语料无新增诊断。aster-lang-core#231(#229)起两引擎按同一套规则检查。
47
+ - 调用类型已知且不是函数的局部名报 E001(`expected a function, got 'score' of type Int`,#268)。局部名遮蔽同名
48
+ 规则(与 Java 名称解析一致),此前 `Rule main given score as Int … Return score(1, 2).` 在有同名规则 `score`
49
+ 时零诊断。未写类型的形参(`given f` 后 `f(n)`)不报。同理,从 If 分支作用域外泄的同名变量(分支内
50
+ `Let score be 1.`、分支外 `score(n)`)现在也遮蔽同名规则,报 E001。单段具名 builtin(`add` / `sub` / `mul` /
51
+ `div` / `intdiv` / `mod` / `eq` / `ne` / `lt` / `lte` / `gt` / `gte` / `and` / `or` / `not` / `await`,与 truffle
52
+ Builtins、aster-lang-core CallTargetBuiltins 一致)不按「调用非函数局部名」报:`given add as Int … Return add(1, 2).`
53
+ 在没有同名规则时调用的是 builtin,能正常运行。与 builtin 同名的局部函数值按其函数类型检查(如 `Let add be function
54
+ with a as Int …` 后 `add(1, 2)` 报 E032)。builtin 的别名写法(`divide`、`over`、`equals` 等)尚未纳入名单,
55
+ 见 aster-lang-core#234。
56
+ - 经未写类型的形参 / 局部值发起的调用不做类型检查;局部名与规则同名且其值不是函数时,现在在运行期报错
57
+ (与 truffle 一致),不再回退到同名规则(例如 `given score` 后 `score(1)`:类型检查不报,运行期报
58
+ `'score' is not a function`)。
59
+
60
+ ### 类型检查放宽
61
+
62
+ - 字段构造(E012)与 `Set`(E002)复用规则调用实参的兼容规则(数值拓宽含容器元素、T? ← T / None、Maybe/Option
63
+ 互通、Unknown / 类型变量占位放行)。此前字段 `Long` ← Int、`Text?` ← Text / None、`List of Float` ← `List of Int`、
64
+ `produce:` 推断不出返回类型的值放进 Float 字段(`expects Float, got Unknown`)报 E012,`Set` Float 变量为 Int 报
65
+ E002;运行都正常,Java 侧也接受。收窄仍报错。
66
+
67
+ ### 修复
68
+
69
+ - 解释器:调用位置按「局部函数值 → 单段具名 builtin → 局部名遮蔽规则」分派。局部值是函数(闭包、函数类型形参)
70
+ 时调用局部值,即使与 builtin 同名(`given gt as (Int, Int) -> Bool … gt(1, 2)` 调用传入的函数);否则在没有同名
71
+ 规则时调用 builtin(`add(1, 2)`、`gt(2, 1)` …),同名的非函数局部变量不影响。此前 TS 解释器不认这些 builtin 名
72
+ (报 `Undefined function 'add'`)。truffle 按同一语义修复见 aster-lang-truffle#158,三个引擎一致。
73
+ - 解释器:调用目标与类型检查一致,局部名遮蔽同名规则。局部值不是函数时报 `'score' is not a function`,
74
+ 不再改调同名规则并静默丢弃多余实参(#268,与 truffle 的 `Unknown call target` 一致失败)。
75
+ - LSP 成员补全:块头行(首词为 If / Otherwise / Match,如中文 `如果 司机.`)先尝试「当前行换成 `返回 接收者.`」
76
+ 这份修补。此前按顺序先试的两份修补对块头总是不完整,1000 行以上的文档在高负载下 150ms 预算往往只够解析
77
+ 一两份,前 1–2 次请求回落到关键字列表、第 3 次才出字段;现在首次请求即出字段(实测 1207 / 4207 行、
78
+ load ~118:第 1 次请求 null → 字段,修补解析 2 份 / 1 份 → 1 份)。其它行的修补顺序不变(#267)。
79
+
80
+ ### 行为变化(Core IR)
81
+
82
+ - 裸模式名(无括号)的 IR 形态按成员 / 绑定统一(ADR 0051 裁决 R55,aster-lang-core#227):成员还是绑定仍按 R12
83
+ 判定;首字母**不是 ASCII 大写**、判为枚举成员的名字由 `PatName` 改为无参数 `PatCtor`,判为绑定的仍是 `PatName`。
84
+ 受影响的写法:中文 / 天城文成员(`当 待处理,`、`जब उच्च,`)、de 以变音字母开头的成员(`bei Übel,`)、本仓接受的
85
+ 小写 ASCII 成员(`Define Color as one of red, Green` 中的 `When red,`)。此前这些成员分支在解释器与 truffle 上都是
86
+ 兜底绑定,吞掉其后所有分支(`描述(已删除)` 返回 1,应为 9)。首字母为 ASCII 大写的名字 IR 不变。
87
+ `RESOLVER_VERSION` 不递增(R55)。
88
+ - 解释器:无绑定的 `PatCtor` 同时匹配枚举成员(与 truffle `PatCtorNode` 一致)。
89
+
3
90
  ## 1.2.3
4
91
 
5
92
  ### 修复
@@ -266,6 +266,25 @@ export declare const BUILTIN_AWAIT = "await";
266
266
  * 名称解析(R2)据此把它们排除在待解析名字之外。
267
267
  */
268
268
  export declare const BUILTIN_OPS: ReadonlySet<string>;
269
+ /**
270
+ * 单段具名 builtin(与 aster-lang-core CallTargetBuiltins.NAMES、aster-lang-truffle Builtins 注册的单段名一致,
271
+ * 交叉核对见 rule-call-checks 测试)。调用位置的分派:局部值是函数时调用局部值;否则在没有同名规则时调用 builtin,
272
+ * 同名的非函数局部变量不影响。类型检查不把这些名字算作「调用非函数局部名」(aster-lang-core#231、truffle#158)。
273
+ * 规范名之外的单词别名见 CALL_TARGET_BUILTIN_ALIASES。
274
+ * 值为 TS 解释器 evalBuiltinOp 使用的运算符写法;null 表示 TS 解释器不在调用位置路由(await 另有处理)。
275
+ */
276
+ export declare const NAMED_BUILTIN_OPS: Readonly<Record<string, string | null>>;
277
+ /**
278
+ * truffle `Builtins.canonicalName` 归一化的单词别名 → 规范 builtin 名(aster-lang-core#234)。
279
+ * truffle 先把调用目标名转小写再查这张表,所以别名不区分大小写;规范名本身(add、gt …)区分大小写。
280
+ * 与 aster-lang-core CallTargetBuiltins.ALIASES 一致(交叉核对见 rule-call-checks 测试)。
281
+ */
282
+ export declare const CALL_TARGET_BUILTIN_ALIASES: Readonly<Record<string, string>>;
283
+ /**
284
+ * 调用目标名在运行期按哪个单段 builtin 分派:规范名原样返回,单词别名(不区分大小写)返回规范名,否则 null。
285
+ * 与 truffle Loader 的 `Builtins.has(name)` 判定一致。
286
+ */
287
+ export declare function callTargetBuiltin(name: string): string | null;
269
288
  /**
270
289
  * 验证是否为内置异步函数。
271
290
  *
@@ -1 +1 @@
1
- {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../src/config/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH;;;;;;;GAOG;AACH,oBAAY,MAAM;IAChB,EAAE,OAAO;IACT,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAED;;;;;GAKG;AACH,QAAA,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAItC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,OAAO,UAAU,CAE/E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAQxC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAEzC,CAAC;AAMF;;;;GAIG;AACH,oBAAY,cAAc;IACxB,IAAI,SAAS;IACb,6CAA6C;IAC7C,OAAO,YAAY;IACnB,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,iCAAiC;IACjC,MAAM,WAAW;IACjB,yCAAyC;IACzC,OAAO,YAAY;IACnB,QAAQ,YAAY;IACpB,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,SAAS,cAAc;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAYjE,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAO3E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,KAAK,CAAC;AAEjD,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,cAAc,EAAE,qBAAqB,CAajF,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAEjE;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAEhE;AAMD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0FL,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAMlE;AAMD;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAO1C,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD"}
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../src/config/semantic.ts"],"names":[],"mappings":"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"}
@@ -346,6 +346,38 @@ export const BUILTIN_OPS = new Set([
346
346
  '>', '<', '>=', '<=', '==', '!=',
347
347
  'and', 'or', 'not',
348
348
  ]);
349
+ /**
350
+ * 单段具名 builtin(与 aster-lang-core CallTargetBuiltins.NAMES、aster-lang-truffle Builtins 注册的单段名一致,
351
+ * 交叉核对见 rule-call-checks 测试)。调用位置的分派:局部值是函数时调用局部值;否则在没有同名规则时调用 builtin,
352
+ * 同名的非函数局部变量不影响。类型检查不把这些名字算作「调用非函数局部名」(aster-lang-core#231、truffle#158)。
353
+ * 规范名之外的单词别名见 CALL_TARGET_BUILTIN_ALIASES。
354
+ * 值为 TS 解释器 evalBuiltinOp 使用的运算符写法;null 表示 TS 解释器不在调用位置路由(await 另有处理)。
355
+ */
356
+ export const NAMED_BUILTIN_OPS = {
357
+ add: '+', sub: '-', mul: '*', div: '/', intdiv: '//', mod: '%',
358
+ eq: '==', ne: '!=', lt: '<', lte: '<=', gt: '>', gte: '>=',
359
+ and: 'and', or: 'or', not: 'not',
360
+ await: null,
361
+ };
362
+ /**
363
+ * truffle `Builtins.canonicalName` 归一化的单词别名 → 规范 builtin 名(aster-lang-core#234)。
364
+ * truffle 先把调用目标名转小写再查这张表,所以别名不区分大小写;规范名本身(add、gt …)区分大小写。
365
+ * 与 aster-lang-core CallTargetBuiltins.ALIASES 一致(交叉核对见 rule-call-checks 测试)。
366
+ */
367
+ export const CALL_TARGET_BUILTIN_ALIASES = {
368
+ plus: 'add', minus: 'sub', times: 'mul', divide: 'div', modulo: 'mod',
369
+ equals: 'eq', is: 'eq', under: 'lt', over: 'gt',
370
+ };
371
+ /**
372
+ * 调用目标名在运行期按哪个单段 builtin 分派:规范名原样返回,单词别名(不区分大小写)返回规范名,否则 null。
373
+ * 与 truffle Loader 的 `Builtins.has(name)` 判定一致。
374
+ */
375
+ export function callTargetBuiltin(name) {
376
+ if (Object.hasOwn(NAMED_BUILTIN_OPS, name))
377
+ return name;
378
+ const lower = name.toLowerCase();
379
+ return Object.hasOwn(CALL_TARGET_BUILTIN_ALIASES, lower) ? CALL_TARGET_BUILTIN_ALIASES[lower] : null;
380
+ }
349
381
  /**
350
382
  * 验证是否为内置异步函数。
351
383
  *
@@ -1 +1 @@
1
- {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../src/config/semantic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../src/config/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,+DAA+D;AAC/D,YAAY;AACZ,+DAA+D;AAE/D;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,mBAAS,CAAA;IACT,qBAAW,CAAA;IACX,uBAAa,CAAA;AACf,CAAC,EAJW,MAAM,KAAN,MAAM,QAIjB;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAA2B;IACzC,EAAE,EAAE,MAAM,CAAC,EAAE;IACb,GAAG,EAAE,MAAM,CAAC,GAAG;IACf,IAAI,EAAE,MAAM,CAAC,IAAI;CAClB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,IAAI,UAAU,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,KAAK;IACL,WAAW;IACX,aAAa;IACb,UAAU;IACV,iBAAiB;IACjB,OAAO;IACP,KAAK;CACN,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAsB;AAC7C,qBAAqB;CACtB,CAAC;AAEF,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,CAAN,IAAY,cAgBX;AAhBD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6CAA6C;IAC7C,qCAAmB,CAAA;IACnB,6BAAW,CAAA;IACX,+BAAa,CAAA;IACb,iCAAe,CAAA;IACf,qCAAmB,CAAA;IACnB,iCAAiC;IACjC,mCAAiB,CAAA;IACjB,yCAAyC;IACzC,qCAAmB,CAAA;IACnB,sCAAoB,CAAA;IACpB,6BAAW,CAAA;IACX,qCAAmB,CAAA;IACnB,yCAAuB,CAAA;AACzB,CAAC,EAhBW,cAAc,KAAd,cAAc,QAgBzB;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsC;IACpE,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC;IACrF,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;IACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IACxB,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAChE,OAAO,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC;IAChE,OAAO,EAAE,CAAC,KAAK,CAAC;IAChB,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,SAAS,EAAE,CAAC,YAAY,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAClE,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,GAAqB,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC;AAWD,MAAM,CAAC,MAAM,uBAAuB,GAAkD;IACpF,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI;IAC3B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI;IAC9B,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI;IAC1B,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI;IAC3B,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI;IAC5B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI;IAC9B,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK;IAC9B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI;IAC9B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI;IAC/B,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK;IAC3B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI;IAC9B,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI;CACjC,CAAC;AAEF,sDAAsD;AACtD,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,OAAO,uBAAuB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;AAChD,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,mBAAmB,CAAC,GAAmB;IACrD,OAAO,uBAAuB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAC/C,CAAC;AAQD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,SAAS,EAAE,QAAQ;IACnB,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,aAAa;IACvB,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,IAAI;IACb,EAAE,EAAE,IAAI;IACR,uEAAuE;IACvE,8DAA8D;IAC9D,sDAAsD;IACtD,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,qDAAqD;IACrD,mDAAmD;IACnD,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,mBAAmB,EAAE,qBAAqB;IAC1C,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,IAAI;IACR,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,MAAM;IACjB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,oBAAoB;IACxC,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;IACtB,uCAAuC;IACvC,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,QAAQ;IACR,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;CACV,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAiB;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,OAAQ,MAAM,CAAC,MAAM,CAAC,EAAE,CAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IACtD,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;IAC7B,gDAAgD;IAChD,oDAAoD;IACpD,2CAA2C;IAC3C,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAChC,KAAK,EAAE,IAAI,EAAE,KAAK;CACnB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG;IAC9D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI;IAC1D,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK;IAChC,KAAK,EAAE,IAAI;CACZ,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAqC;IAC3E,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IACrE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAChD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,KAAK,aAAa,CAAC;AAChC,CAAC"}
@@ -14,7 +14,7 @@
14
14
  * - 字段访问(dot notation via Name)
15
15
  */
16
16
  import Decimal from 'decimal.js';
17
- import { BUILTIN_OPS } from '../config/semantic.js';
17
+ import { BUILTIN_OPS, NAMED_BUILTIN_OPS, callTargetBuiltin } from '../config/semantic.js';
18
18
  // Decimal 精确十进制配置(ADR 0025):锁死 precision/rounding,**不依赖默认**,避免环境差异
19
19
  // 与双引擎不一致。precision 设高(80)让 plus/minus/times 不被有效数字上下文截断(v1 输入
20
20
  // 上限 38 位/scale 18,结果上限 76 < 80);ROUND_HALF_EVEN 默认(除法/舍入走显式 builtin
@@ -772,6 +772,13 @@ function dateToCivil(epochDay) {
772
772
  /**
773
773
  * Core IR tree-walk 解释器
774
774
  */
775
+ /**
776
+ * 值是否为可空 T? 的裸载荷(#277):非 null,且不是 Some / None / Ok / Err 构造值。
777
+ * data 构造值、枚举成员等照常算裸载荷(`Person?` 位置直接放 Person)。与 truffle MatchNode.isBareOptionalPayload 一致。
778
+ */
779
+ function isBareOptionalPayload(value) {
780
+ return value !== null && value !== undefined && !isVariantValue(value);
781
+ }
775
782
  class Interpreter {
776
783
  module;
777
784
  /** 模块中所有函数声明(按名称索引) */
@@ -937,6 +944,9 @@ class Interpreter {
937
944
  // - 小写开头(绑定变量,如 x/value)→ catch-all,匹配任意非 null 值并绑定。
938
945
  const isVariant = /^[A-Z]/.test(pattern.name);
939
946
  if (isVariant) {
947
+ // `When None` 也匹配可空值 T? 的裸 null(#277,与 truffle MatchNode 一致)
948
+ if (pattern.name === 'None' && (value === null || value === undefined))
949
+ return true;
940
950
  if (value === null || value === undefined)
941
951
  return false;
942
952
  if (typeof value === 'string')
@@ -957,14 +967,30 @@ class Interpreter {
957
967
  case 'PatInt':
958
968
  return value === pattern.value;
959
969
  case 'PatCtor': {
970
+ // 可空值 T? 的裸表示(#277):宿主传入或 T → T? 直接传入的值不带 Some/None 标签。
971
+ // 裸的非 null 值按 Some(值) 匹配,null 按 None 匹配;带 __type 标签的值仍走下方原逻辑(与 truffle MatchNode 一致)。
972
+ if (pattern.typeName === 'Some' && isBareOptionalPayload(value)) {
973
+ return this.matchPattern({ __type: 'Some', value }, pattern, env);
974
+ }
975
+ if (pattern.typeName === 'None' && (value === null || value === undefined) &&
976
+ pattern.names.length === 0 && !pattern.args?.length) {
977
+ return true;
978
+ }
960
979
  // 构造器模式匹配(如 Ok(value)、Err(err)、Some(x)、User(id, name))。
961
980
  // 与 aster-lang-truffle MatchNode.PatCtorNode 对齐:按位置(非按名)把
962
981
  // 构造体的非 __type 字段值依序绑定到模式的 bind 名——因为 Ok(value)/
963
982
  // Err(err) 的载荷统一存于 `value` 字段,绑定名却各异,按名绑定会落空。
983
+ // 无绑定的构造器模式也匹配枚举成员(同 truffle PatCtorNode):R2 对无大小写文字的成员名
984
+ // 产出此形态(ADR 0051 裁决 R55),如中文「当 待处理,」。
985
+ const bindsNothing = pattern.names.length === 0 && !pattern.args?.length;
986
+ if (bindsNothing && typeof value === 'string')
987
+ return value === pattern.typeName;
964
988
  if (value === null || value === undefined || typeof value !== 'object') {
965
989
  return false;
966
990
  }
967
991
  const obj = value;
992
+ if (bindsNothing && obj.value === pattern.typeName)
993
+ return true;
968
994
  if (obj.__type !== pattern.typeName) {
969
995
  return false;
970
996
  }
@@ -1141,14 +1167,24 @@ class Interpreter {
1141
1167
  // (Let f be function with …)。先求值参数,再分派。
1142
1168
  if (call.target.kind === 'Name') {
1143
1169
  const funcName = call.target.name;
1144
- const argValues = call.args.map(arg => this.evalExpr(arg, env));
1145
- // 闭包变量优先(局部绑定遮蔽同名模块函数)。
1170
+ // 调用目标的分派顺序(与 truffle Loader、类型检查一致):
1171
+ // 1. 局部值是函数(闭包 / 函数值)→ 调用局部值,即使与 builtin 同名(`given gt as (Int, Int) -> Bool`);
1172
+ // 2. 单段具名 builtin(add / sub / gt …,含 over / divide 等单词别名)且没有同名规则 → 调用 builtin,
1173
+ // 同名的非函数局部变量不影响;
1174
+ // 3. 其余局部名遮蔽同名规则:局部值不是函数时报错,不改调同名规则(#268)。
1175
+ const bound = env.has(funcName) ? env.get(funcName) : undefined;
1176
+ if (bound instanceof Closure) {
1177
+ return this.applyClosure(bound, call.args.map(arg => this.evalExpr(arg, env)));
1178
+ }
1179
+ const builtin = callTargetBuiltin(funcName);
1180
+ const namedOp = builtin === null ? null : NAMED_BUILTIN_OPS[builtin];
1181
+ if (namedOp && !this.funcs.has(funcName)) {
1182
+ return this.evalBuiltinOp(namedOp, call.args, env);
1183
+ }
1146
1184
  if (env.has(funcName)) {
1147
- const bound = env.get(funcName);
1148
- if (bound instanceof Closure) {
1149
- return this.applyClosure(bound, argValues);
1150
- }
1185
+ throw new InterpreterError(`'${funcName}' is not a function`);
1151
1186
  }
1187
+ const argValues = call.args.map(arg => this.evalExpr(arg, env));
1152
1188
  const func = this.funcs.get(funcName);
1153
1189
  if (!func) {
1154
1190
  throw new InterpreterError(`Undefined function '${funcName}'`);