@aster-cloud/aster-lang-ts 1.0.26 → 1.0.27

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 (44) hide show
  1. package/dist/src/browser.d.ts +1 -1
  2. package/dist/src/browser.d.ts.map +1 -1
  3. package/dist/src/browser.js +1 -1
  4. package/dist/src/browser.js.map +1 -1
  5. package/dist/src/core/index.d.ts +1 -1
  6. package/dist/src/core/index.d.ts.map +1 -1
  7. package/dist/src/core/index.js +1 -1
  8. package/dist/src/core/index.js.map +1 -1
  9. package/dist/src/core/interpreter.d.ts +13 -0
  10. package/dist/src/core/interpreter.d.ts.map +1 -1
  11. package/dist/src/core/interpreter.js +277 -18
  12. package/dist/src/core/interpreter.js.map +1 -1
  13. package/dist/src/frontend/canonicalizer.d.ts.map +1 -1
  14. package/dist/src/frontend/canonicalizer.js +6 -1
  15. package/dist/src/frontend/canonicalizer.js.map +1 -1
  16. package/dist/src/lower_to_core.js +30 -1
  17. package/dist/src/lower_to_core.js.map +1 -1
  18. package/dist/test/unit/builtin-arity.test.d.ts +2 -0
  19. package/dist/test/unit/builtin-arity.test.d.ts.map +1 -0
  20. package/dist/test/unit/builtin-arity.test.js +90 -0
  21. package/dist/test/unit/builtin-arity.test.js.map +1 -0
  22. package/dist/test/unit/canonicalizer/canonicalizer.test.js +23 -0
  23. package/dist/test/unit/canonicalizer/canonicalizer.test.js.map +1 -1
  24. package/dist/test/unit/ctor-call-form-lowering.test.d.ts +2 -0
  25. package/dist/test/unit/ctor-call-form-lowering.test.d.ts.map +1 -0
  26. package/dist/test/unit/ctor-call-form-lowering.test.js +78 -0
  27. package/dist/test/unit/ctor-call-form-lowering.test.js.map +1 -0
  28. package/dist/test/unit/guest-map-serialization.test.d.ts +2 -0
  29. package/dist/test/unit/guest-map-serialization.test.d.ts.map +1 -0
  30. package/dist/test/unit/guest-map-serialization.test.js +60 -0
  31. package/dist/test/unit/guest-map-serialization.test.js.map +1 -0
  32. package/dist/test/unit/map-type-guard.test.d.ts +2 -0
  33. package/dist/test/unit/map-type-guard.test.d.ts.map +1 -0
  34. package/dist/test/unit/map-type-guard.test.js +147 -0
  35. package/dist/test/unit/map-type-guard.test.js.map +1 -0
  36. package/dist/test/unit/maybe-isnone-semantics.test.d.ts +2 -0
  37. package/dist/test/unit/maybe-isnone-semantics.test.d.ts.map +1 -0
  38. package/dist/test/unit/maybe-isnone-semantics.test.js +74 -0
  39. package/dist/test/unit/maybe-isnone-semantics.test.js.map +1 -0
  40. package/dist/test/unit/maybe-map-type-guard.test.d.ts +2 -0
  41. package/dist/test/unit/maybe-map-type-guard.test.d.ts.map +1 -0
  42. package/dist/test/unit/maybe-map-type-guard.test.js +88 -0
  43. package/dist/test/unit/maybe-map-type-guard.test.js.map +1 -0
  44. package/package.json +1 -1
@@ -0,0 +1,88 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { compile, evaluate, EN_US, initializeAllBundledLexicons } from '../../src/browser.js';
4
+ // Maybe.map / Option.map 的首参类型守卫(aster-lang-ts#128)。
5
+ //
6
+ // 此前对**任意**非 Maybe 输入都静默返回 None,于是
7
+ // `Maybe.withDefault(Maybe.map(42, f), 0)` 得到 0——一个看起来完全合理的决策值,
8
+ // 而同一段规则在 JVM 上直接抛错(Builtins.java 的 operationExpectedType)。
9
+ // 既是双引擎分叉,也是静默错答案,与 #123 的 arity 缺口同一模式。
10
+ //
11
+ // ★核查范围(**订正版**):交叉审查用 46 条表达式在两个引擎上机器对比后,
12
+ // 推翻了我原先"只有 Maybe.map 一处"的结论。实测结果:
13
+ //
14
+ // 函数 TS Truffle 判定
15
+ // Maybe.map / Option.map 静默 None 抛错 真分叉 → 本 PR 修
16
+ // Maybe.isNone / Option.isNone isNone(42)=true =false 真分叉 → 见 #131
17
+ // Map.get/size/keys/put 静默兜底空 Map 抛错 真分叉 → 见 #132
18
+ // Maybe.withDefault / unwrapOr 返回默认 返回默认 一致,不动
19
+ // Maybe.isSome / Option.isSome 返回 false 返回 false 一致,不动
20
+ // Result.mapOk/mapErr/tapError 抛错 抛错 一致,不动
21
+ // Result.unwrap / unwrapErr 抛错 抛错 一致,不动
22
+ // List.sum/map/filter/length/sort 抛错 抛错 一致,不动
23
+ //
24
+ // ★我原表把 isSome/isNone 合并成一行"返回 false"——isSome 确实两边都 false,
25
+ // isNone 却不是(TS 写 `!== 'Some'`、JVM 写 `.equals("None")`)。
26
+ // **合并成一行正是判断错的成因**;且我当时根本没查 Map.*。
27
+ //
28
+ // 本 PR 仍只修 Maybe.map(isNone 属行为变更需评估 spec 冻结,Map.* 影响面更大),
29
+ // 另两条已各自开 issue,不让"已核查"的错误完成信号把它们掩埋。
30
+ initializeAllBundledLexicons();
31
+ const PRELUDE = 'Rule double given x as Int, produce Int:\n Return x times 2.\n\n';
32
+ function run(body) {
33
+ const c = compile(`Module p.\n\n${PRELUDE}Rule f produce Int:\n ${body}\n`, {
34
+ lexicon: EN_US,
35
+ });
36
+ assert.ok(c.success && c.core, `compile 失败: ${JSON.stringify(c.parseErrors ?? [])}`);
37
+ const out = evaluate(c.core, 'f', {});
38
+ return out.success
39
+ ? { ok: true, value: out.value }
40
+ : { ok: false, error: out.error ?? '(无错误信息)' };
41
+ }
42
+ describe('Maybe.map 首参类型守卫', () => {
43
+ for (const fn of ['Maybe.map', 'Option.map']) {
44
+ it(`${fn} 对非 Maybe 首参报错,而非静默返回 None`, () => {
45
+ const r = run(`Return Maybe.withDefault(${fn}(42, double), 0).`);
46
+ assert.equal(r.ok, false, `应当失败,实际静默返回 ${JSON.stringify(r.value)}`);
47
+ assert.equal(r.error, `${fn}: expected Maybe (Some or None), got number`);
48
+ });
49
+ }
50
+ it('文本、列表等其它类型同样被拒', () => {
51
+ for (const arg of ['"abc"', 'List.empty()']) {
52
+ const r = run(`Return Maybe.withDefault(Maybe.map(${arg}, double), 0).`);
53
+ assert.equal(r.ok, false, `${arg} 应被拒,实际返回 ${JSON.stringify(r.value)}`);
54
+ assert.match(r.error ?? '', /expected Maybe \(Some or None\)/);
55
+ }
56
+ });
57
+ // ★None 有两种运行期表示,都必须被当成合法输入:
58
+ // - `None` 字面量求值为 null(evalExpr 的 case 'None')
59
+ // - Maybe.map 自身返回 {__type:'None'}
60
+ // 若守卫只认后者,`Maybe.map(None, f)` 会被误伤。
61
+ it('None 的两种运行期表示都放行', () => {
62
+ assert.deepEqual(run('Return Maybe.withDefault(Maybe.map(None, double), 0).'), {
63
+ ok: true,
64
+ value: 0,
65
+ });
66
+ // 内层 map 返回 {__type:'None'},外层 map 必须接受它
67
+ assert.deepEqual(run('Return Maybe.withDefault(Maybe.map(Maybe.map(None, double), double), 0).'), { ok: true, value: 0 });
68
+ });
69
+ it('Some 分支与链式调用不受影响', () => {
70
+ assert.deepEqual(run('Return Maybe.withDefault(Maybe.map(Some(21), double), 0).'), {
71
+ ok: true,
72
+ value: 42,
73
+ });
74
+ assert.deepEqual(run('Return Maybe.withDefault(Maybe.map(Maybe.map(Some(3), double), double), 0).'), { ok: true, value: 12 });
75
+ });
76
+ // Map.get 自 ADR 0035 档位 C 起返回 Maybe,是本函数最主要的上游。
77
+ it('与 Map.get 的组合(缺键/命中)均正常', () => {
78
+ assert.deepEqual(run('Let m be Map.empty().\n Return Maybe.withDefault(Maybe.map(Map.get(m, "k"), double), 0).'), { ok: true, value: 0 });
79
+ assert.deepEqual(run('Let m be Map.put(Map.empty(), "k", 5).\n Return Maybe.withDefault(Maybe.map(Map.get(m, "k"), double), 0).'), { ok: true, value: 10 });
80
+ });
81
+ // 这几个在两引擎上行为一致(都不抛),故**不是**分叉——本测试锁住现状,
82
+ // 防止有人"顺手"给它们也加守卫而单方面制造新分叉。
83
+ it('withDefault / unwrapOr / isSome 维持与 truffle 一致的宽松行为', () => {
84
+ assert.deepEqual(run('Return Maybe.withDefault(42, 0).'), { ok: true, value: 0 });
85
+ assert.deepEqual(run('Return Maybe.unwrapOr(42, 0).'), { ok: true, value: 0 });
86
+ });
87
+ });
88
+ //# sourceMappingURL=maybe-map-type-guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maybe-map-type-guard.test.js","sourceRoot":"","sources":["../../../test/unit/maybe-map-type-guard.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aster-cloud/aster-lang-ts",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "Aster CNL (Controlled Natural Language) TypeScript Compiler - Lexer, Parser, AST, Core IR, Type Checker",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",