@aster-cloud/aster-lang-ts 1.0.25 → 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.
- package/dist/src/browser.d.ts +1 -1
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +1 -1
- package/dist/src/browser.js.map +1 -1
- package/dist/src/core/index.d.ts +1 -1
- package/dist/src/core/index.d.ts.map +1 -1
- package/dist/src/core/index.js +1 -1
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/core/interpreter.d.ts +13 -0
- package/dist/src/core/interpreter.d.ts.map +1 -1
- package/dist/src/core/interpreter.js +302 -24
- package/dist/src/core/interpreter.js.map +1 -1
- package/dist/src/frontend/canonicalizer.d.ts.map +1 -1
- package/dist/src/frontend/canonicalizer.js +6 -1
- package/dist/src/frontend/canonicalizer.js.map +1 -1
- package/dist/src/lower_to_core.js +30 -1
- package/dist/src/lower_to_core.js.map +1 -1
- package/dist/test/unit/builtin-arity.test.d.ts +2 -0
- package/dist/test/unit/builtin-arity.test.d.ts.map +1 -0
- package/dist/test/unit/builtin-arity.test.js +90 -0
- package/dist/test/unit/builtin-arity.test.js.map +1 -0
- package/dist/test/unit/canonicalizer/canonicalizer.test.js +23 -0
- package/dist/test/unit/canonicalizer/canonicalizer.test.js.map +1 -1
- package/dist/test/unit/ctor-call-form-lowering.test.d.ts +2 -0
- package/dist/test/unit/ctor-call-form-lowering.test.d.ts.map +1 -0
- package/dist/test/unit/ctor-call-form-lowering.test.js +78 -0
- package/dist/test/unit/ctor-call-form-lowering.test.js.map +1 -0
- package/dist/test/unit/guest-map-serialization.test.d.ts +2 -0
- package/dist/test/unit/guest-map-serialization.test.d.ts.map +1 -0
- package/dist/test/unit/guest-map-serialization.test.js +60 -0
- package/dist/test/unit/guest-map-serialization.test.js.map +1 -0
- package/dist/test/unit/list-builtins-fail-loud.test.d.ts +2 -0
- package/dist/test/unit/list-builtins-fail-loud.test.d.ts.map +1 -0
- package/dist/test/unit/list-builtins-fail-loud.test.js +52 -0
- package/dist/test/unit/list-builtins-fail-loud.test.js.map +1 -0
- package/dist/test/unit/map-get-maybe.test.d.ts +2 -0
- package/dist/test/unit/map-get-maybe.test.d.ts.map +1 -0
- package/dist/test/unit/map-get-maybe.test.js +52 -0
- package/dist/test/unit/map-get-maybe.test.js.map +1 -0
- package/dist/test/unit/map-type-guard.test.d.ts +2 -0
- package/dist/test/unit/map-type-guard.test.d.ts.map +1 -0
- package/dist/test/unit/map-type-guard.test.js +147 -0
- package/dist/test/unit/map-type-guard.test.js.map +1 -0
- package/dist/test/unit/maybe-isnone-semantics.test.d.ts +2 -0
- package/dist/test/unit/maybe-isnone-semantics.test.d.ts.map +1 -0
- package/dist/test/unit/maybe-isnone-semantics.test.js +74 -0
- package/dist/test/unit/maybe-isnone-semantics.test.js.map +1 -0
- package/dist/test/unit/maybe-map-type-guard.test.d.ts +2 -0
- package/dist/test/unit/maybe-map-type-guard.test.d.ts.map +1 -0
- package/dist/test/unit/maybe-map-type-guard.test.js +88 -0
- package/dist/test/unit/maybe-map-type-guard.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
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.isNone / Option.isNone 的语义:「**是** None」而非「不是 Some」(#131)。
|
|
5
|
+
//
|
|
6
|
+
// 旧写法 `?.__type !== 'Some'` 会把任意非 Maybe 输入也判成 None:
|
|
7
|
+
// Maybe.isNone(42) → true,而 JVM 侧(`"None".equals(m.get("_type"))`)→ false
|
|
8
|
+
//
|
|
9
|
+
// ★核查方法:36 格矩阵(6 个谓词 × 6 种输入)两引擎逐格实跑对比。
|
|
10
|
+
// 结果:仅 isNone / Option.isNone 的 Ok/Err/Int/Text 四格分叉(共 8 格),
|
|
11
|
+
// isSome / Result.isOk / Result.isErr 全部对齐。
|
|
12
|
+
// JVM 那侧是对的——isNone 不该对 `Ok(1)`、`42` 返回 true。
|
|
13
|
+
//
|
|
14
|
+
// ★为什么 isSome 没有同类问题:它写的是 `=== 'Some'`(正向判定),
|
|
15
|
+
// 天然对非 Maybe 返回 false。是 isNone 用了取反才引入这个洞——
|
|
16
|
+
// 这也是我在 #128 的核查表里把 isSome/isNone 合并成一行、从而漏判的根源。
|
|
17
|
+
initializeAllBundledLexicons();
|
|
18
|
+
/** 用 If 取布尔谓词的结果:真→1、假→0。 */
|
|
19
|
+
function predicate(expr) {
|
|
20
|
+
const c = compile(`Module p.\n\nRule f produce Int:\n If ${expr}:\n Return 1.\n Return 0.\n`, { lexicon: EN_US });
|
|
21
|
+
assert.ok(c.success && c.core, `compile 失败: ${JSON.stringify(c.parseErrors ?? [])}`);
|
|
22
|
+
const out = evaluate(c.core, 'f', {});
|
|
23
|
+
assert.ok(out.success, 'evaluate 失败');
|
|
24
|
+
return out.value;
|
|
25
|
+
}
|
|
26
|
+
describe('Maybe.isNone 语义:是 None,而非"不是 Some"', () => {
|
|
27
|
+
for (const fn of ['Maybe.isNone', 'Option.isNone']) {
|
|
28
|
+
it(`${fn} 对非 Maybe 输入返回 false(与 JVM 一致)`, () => {
|
|
29
|
+
// 这四格是修复前与 JVM 分叉的位置:旧实现全部返回 true。
|
|
30
|
+
for (const arg of ['Ok(1)', 'Err(1)', '42', '"a"']) {
|
|
31
|
+
assert.equal(predicate(`${fn}(${arg})`), 0, `${fn}(${arg}) 应为 false`);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it(`${fn} 对 None 返回 true、对 Some 返回 false`, () => {
|
|
35
|
+
assert.equal(predicate(`${fn}(None)`), 1);
|
|
36
|
+
assert.equal(predicate(`${fn}(Some(1))`), 0);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// ★两种 None 表示都要认:`None` 字面量是裸 null,Maybe.map 等返回 {__type:'None'}。
|
|
40
|
+
// 只认后者会让 `Maybe.isNone(None)` 变 false——这是修复时最容易踩的坑。
|
|
41
|
+
it('None 的两种运行期表示都判为 true', () => {
|
|
42
|
+
assert.equal(predicate('Maybe.isNone(None)'), 1, '裸 null 形');
|
|
43
|
+
// Maybe.map(None, f) 返回 {__type:'None'}
|
|
44
|
+
assert.equal(predicate('Maybe.isNone(Maybe.map(None, Maybe.unwrap))'), 1, '带标签形');
|
|
45
|
+
});
|
|
46
|
+
it('与 Map.get 的组合(ADR 0035 起 Map.get 返回 Maybe)', () => {
|
|
47
|
+
const missing = compile('Module p.\n\nRule f produce Int:\n Let m be Map.empty().\n' +
|
|
48
|
+
' If Maybe.isNone(Map.get(m, "k")):\n Return 1.\n Return 0.\n', { lexicon: EN_US });
|
|
49
|
+
assert.ok(missing.success && missing.core);
|
|
50
|
+
assert.equal(evaluate(missing.core, 'f', {}).value, 1, '缺键应为 None');
|
|
51
|
+
const hit = compile('Module p.\n\nRule f produce Int:\n Let m be Map.put(Map.empty(), "k", 5).\n' +
|
|
52
|
+
' If Maybe.isNone(Map.get(m, "k")):\n Return 1.\n Return 0.\n', { lexicon: EN_US });
|
|
53
|
+
assert.ok(hit.success && hit.core);
|
|
54
|
+
assert.equal(evaluate(hit.core, 'f', {}).value, 0, '命中不应为 None');
|
|
55
|
+
});
|
|
56
|
+
// isSome 是正向判定(`=== 'Some'`),本就没有这个洞;锁住它以防有人"顺手对称化"
|
|
57
|
+
// 而把 isSome 也改成取反、反向引入同一个缺陷。
|
|
58
|
+
it('isSome 保持正向判定:对非 Maybe 返回 false', () => {
|
|
59
|
+
for (const arg of ['Ok(1)', 'Err(1)', '42', '"a"', 'None']) {
|
|
60
|
+
assert.equal(predicate(`Maybe.isSome(${arg})`), 0, `Maybe.isSome(${arg}) 应为 false`);
|
|
61
|
+
}
|
|
62
|
+
assert.equal(predicate('Maybe.isSome(Some(1))'), 1);
|
|
63
|
+
});
|
|
64
|
+
// Result 侧两个谓词矩阵实测已对齐,锁住现状防回退。
|
|
65
|
+
it('Result.isOk / isErr 对非 Result 输入返回 false', () => {
|
|
66
|
+
for (const arg of ['None', 'Some(1)', '42', '"a"']) {
|
|
67
|
+
assert.equal(predicate(`Result.isOk(${arg})`), 0, `Result.isOk(${arg})`);
|
|
68
|
+
assert.equal(predicate(`Result.isErr(${arg})`), 0, `Result.isErr(${arg})`);
|
|
69
|
+
}
|
|
70
|
+
assert.equal(predicate('Result.isOk(Ok(1))'), 1);
|
|
71
|
+
assert.equal(predicate('Result.isErr(Err(1))'), 1);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=maybe-isnone-semantics.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-isnone-semantics.test.js","sourceRoot":"","sources":["../../../test/unit/maybe-isnone-semantics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-map-type-guard.test.d.ts","sourceRoot":"","sources":["../../../test/unit/maybe-map-type-guard.test.ts"],"names":[],"mappings":""}
|
|
@@ -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