@calcit/procs 0.12.55 → 0.12.57
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/.yarn/install-state.gz +0 -0
- package/RFCs/07-31-unsafe-coerce-driven-static-type-boundary-plan.md +170 -0
- package/build.rs +36 -2
- package/editing-history/202607310224-strengthen-namespace-import-diagnostics.md +23 -0
- package/editing-history/202607311940-strengthen-unsafe-coerce-boundaries.md +20 -0
- package/editing-history/202608010103-warn-on-duplicate-imports.md +18 -0
- package/editing-history/202608010111-release-0.12.56.md +15 -0
- package/editing-history/202608011654-library-quality-gates.md +23 -0
- package/editing-history/202608011759-issue-routing-in-agent-guide.md +17 -0
- package/editing-history/202608011833-schema-type-symbols.md +20 -0
- package/editing-history/202608011852-wasm-dynamic-string-tag.md +7 -0
- package/editing-history/202608011908-consolidate-history.md +6 -0
- package/editing-history/202608012022-consolidate-cli-and-test-duplication.md +28 -0
- package/editing-history/202608012123-review-follow-up.md +18 -0
- package/editing-history/202608012320-release-0.12.57.md +5 -0
- package/editing-history/ARCHIVE.md +15 -0
- package/editing-history/README.md +21 -0
- package/lib/package.json +1 -1
- package/package.json +1 -1
- package/editing-history/2026-02-13-1841-trait-origin-structural-eq.md +0 -91
- package/editing-history/2026-02-14-2050-js-codegen-recursion-tag-migration.md +0 -39
- package/editing-history/2026-02-14-2358-emit-js-modularization-shift-left.md +0 -63
- package/editing-history/2026-02-15-0000-diagnostics-consolidated.md +0 -35
- package/editing-history/2026-02-15-1941-macro-diagnostics-refinement.md +0 -39
- package/editing-history/2026-02-16-2043-core-api-docs-cleanup.md +0 -40
- package/editing-history/2026-02-23-0834-migrate-to-defstruct.md +0 -91
- package/editing-history/2026-02-23-2321-ns-imports-code-fixes.md +0 -42
- package/editing-history/2026-02-25-0002-language-behavior-eval-mode.md +0 -93
- package/editing-history/2026-02-25-0111-guidebook-no-check-block-upgrades.md +0 -52
- package/editing-history/2026-02-25-0113-runtime-type-validation-and-macro-quoting.md +0 -41
- package/editing-history/2026-02-25-1131-check-md-eval-improvements.md +0 -13
- package/editing-history/2026-02-26-1324-check-md-inprocess-cache-and-path-labels.md +0 -7
- package/editing-history/2026-02-27-1640-unify-markdown-readers.md +0 -16
- package/editing-history/2026-02-27-1958-tree-rewrite-command-and-reference-model.md +0 -18
- package/editing-history/2026-02-27-2200-split-def-command.md +0 -29
- package/editing-history/2026-02-27-2212-tree-raise-wrap.md +0 -33
- package/editing-history/2026-02-27-2223-calcit-agent-docs-optimize.md +0 -41
- package/editing-history/2026-03-01-0212-query-search-entry-and-ffi-warning.md +0 -53
- package/editing-history/2026-03-03-1934-check-types-and-core-annotations.md +0 -17
- package/editing-history/2026-03-04-0000-generics-fn-typevar-identity.md +0 -30
- package/editing-history/2026-03-04-1331-tag-call-warning-and-dot-access-migration.md +0 -28
- package/editing-history/2026-03-04-1548-impl-new-dot-method-input-and-doc-hints.md +0 -33
- package/editing-history/2026-03-04-1645-calcit-eq-contract-refactor-and-macro-tests.md +0 -28
- package/editing-history/2026-03-04-2200-assert-type-assert-traits-composable-runtime-checks.md +0 -18
- package/editing-history/2026-03-05-0042-type-inference-argtypes-and-core-hints.md +0 -54
- package/editing-history/2026-03-05-0115-calcit-core-generic-refinements.md +0 -57
- package/editing-history/2026-03-05-1930-schema-migration-cr-edit.md +0 -30
- package/editing-history/2026-03-05-1939-query-schema-adaptation.md +0 -42
- package/editing-history/2026-03-06-0120-schema-hint-migration-batch.md +0 -38
- package/editing-history/2026-03-06-1416-core-macro-schema-migration.md +0 -20
- package/editing-history/2026-03-06-1552-core-schema-and-hintfn-migration.md +0 -63
- package/editing-history/2026-03-06-1936-schema-normalization-and-preprocess-preload.md +0 -12
- package/editing-history/2026-03-07-0000-migrate-hint-fn-to-schema.md +0 -29
- package/editing-history/2026-03-07-0000-remove-enum-prototype-field.md +0 -43
- package/editing-history/2026-03-07-0000-schema-args-type-enforcement.md +0 -66
- package/editing-history/2026-03-07-0142-unit-type-and-builtin-schemas.md +0 -82
- package/editing-history/2026-03-07-1652-decouple-snapshot-schema-to-calcit-type.md +0 -112
- package/editing-history/2026-03-07-1821-snapshot-schema-validation.md +0 -6
- package/editing-history/2026-03-07-1959-schema-def-kind-arity-validation.md +0 -96
- package/editing-history/2026-03-08-0031-schema-generics-quote-normalization.md +0 -35
- package/editing-history/2026-03-08-1905-schema-typeref-and-assert-migration.md +0 -34
- package/editing-history/2026-03-08-2033-schema-wrapper-migration.md +0 -45
- package/editing-history/2026-03-08-2315-late-schema-cleanup-and-warning-compat.md +0 -27
- package/editing-history/2026-03-09-1753-schema-type-fail-tests.md +0 -17
- package/editing-history/2026-03-10-1040-edit-schema-primitive-tag-support.md +0 -42
- package/editing-history/2026-03-10-1754-ns-entry-snapshot-migration.md +0 -66
- package/editing-history/2026-03-13-2216-validate-struct-type-arg-arity.md +0 -24
- package/editing-history/2026-03-16-2353-runtime-boundary-cleanup.md +0 -14
- package/editing-history/2026-03-17-0150-runtime-boundary-lookup-cleanup.md +0 -28
- package/editing-history/2026-03-20-0116-json-builtins-and-runtime-docs.md +0 -48
- package/editing-history/2026-03-26-2013-docs-frontmatter-and-module-search.md +0 -58
- package/editing-history/2026-04-07-1550-path-format-at-prefix-migration.md +0 -46
- package/editing-history/2026-04-12-1524-js-codegen-map-to-record.md +0 -26
- package/editing-history/2026-04-12-1549-map-to-record-field-validation.md +0 -29
- package/editing-history/2026-04-13-1600-tuple-to-enum-rewrite.md +0 -13
- package/editing-history/2026-04-13-2309-typeslot-enum-compile-safety.md +0 -45
- package/editing-history/2026-04-14-1500-loose-record-syntax.md +0 -32
- package/editing-history/2026-04-14-2259-bidir-type-check-refactor.md +0 -63
- package/editing-history/2026-04-15-0120-match-syntax-exhaustiveness.md +0 -20
- package/editing-history/2026-04-15-1211-record-nth-optimization.md +0 -44
- package/editing-history/2026-04-16-1936-predicate-narrowing-expansion.md +0 -31
- package/editing-history/2026-04-17-0132-monomorphize-map-filter.md +0 -50
- package/editing-history/2026-04-17-0135-monomorphize-includes-reverse.md +0 -31
- package/editing-history/2026-04-17-0140-fold-type-predicates.md +0 -44
- package/editing-history/2026-04-17-0154-generic-dispatch-records-tuples.md +0 -52
- package/editing-history/2026-04-17-0520-simplify-generic-defns-via-method-dispatch.md +0 -49
- package/editing-history/2026-05-21-0055-tree-show-cr-config-and-edit-cleanup.md +0 -81
- package/editing-history/2026-05-31-2052-macro-schema-roundtrip-and-weak-types.md +0 -6
- package/editing-history/2026-05-31-2105-map-generic-weak-types-followup.md +0 -15
- package/editing-history/2026-06-01-0003-update-callback-field-specialization.md +0 -19
- package/editing-history/2026-06-01-2317-data-definition-where-bounds.md +0 -6
- package/editing-history/2026-06-02-0114-data-definition-where-macro-followup.md +0 -21
- package/editing-history/2026-06-03-0000-check-md-edn-errors.md +0 -5
- package/editing-history/2026-06-03-1600-check-md-entry-modules.md +0 -6
- package/editing-history/2026-06-04-0000-check-md-app-main-init.md +0 -6
- package/editing-history/2026-06-04-2218-compiled-executable-runtime-backfill.md +0 -6
- package/editing-history/2026-06-09-0000-with-type-slot-scoped-binding.md +0 -83
- package/editing-history/2026-06-09-1241-remove-bind-type.md +0 -64
- package/editing-history/2026-06-09-1800-core-effect-tags.md +0 -57
- package/editing-history/2026-06-10-1200-get-def-doc-schema-builtin.md +0 -7
- package/editing-history/2026-06-15-1500-effects-graph-mvp.md +0 -30
- package/editing-history/2026-06-16-1700-effects-graph-ste-tree.md +0 -84
- package/editing-history/2026-06-27-0052-cli-improvements.md +0 -41
- package/editing-history/2026-06-27-0202-docs-indexing-improvements.md +0 -22
- package/editing-history/2026-06-27-0315-file-splits.md +0 -17
- package/editing-history/2026-06-27-0416-agent-advanced-split.md +0 -15
- package/editing-history/archived/2025-04-12-1453-map-to-record-rewrite.md +0 -33
- package/editing-history/archived/2025-04-16-0117-wasm-codegen-and-catalog-update.md +0 -40
- package/editing-history/archived/2025-07-16-0207-wasm-encoder-migration.md +0 -48
- package/editing-history/archived/2025-07-16-1633-wasm-data-structures.md +0 -61
- package/editing-history/archived/2026-02-13-1926-docs-tests-followup.md +0 -33
- package/editing-history/archived/2026-02-16-2128-docs-smoke-and-trait-errors.md +0 -20
- package/editing-history/archived/2026-02-25-1234-watch-mode-default-once.md +0 -5
- package/editing-history/archived/2026-03-07-1302-calcit-agent-docs-update.md +0 -32
- package/editing-history/archived/2026-03-09-1819-add-test-fail-script.md +0 -5
- package/editing-history/archived/2026-03-09-1944-split-type-fail-tests.md +0 -8
- package/editing-history/archived/2026-03-16-1449-profiling-tools-reorg.md +0 -13
- package/editing-history/archived/2026-03-17-2026-afternoon-runtime-boundary-optimization-summary.md +0 -87
- package/editing-history/archived/2026-03-18-1802-tips-level-and-overwrite-schema-preservation.md +0 -26
- package/editing-history/archived/2026-03-20-1229-query-window-3-with-parent-preview.md +0 -72
- package/editing-history/archived/2026-03-23-1137-command-echo-tool-output-cleanup.md +0 -71
- package/editing-history/archived/2026-04-10-0011-snapshot-empty-version-pipe-marker.md +0 -23
- package/editing-history/archived/2026-04-16-0131-wasm-math-and-test-integration.md +0 -28
- package/editing-history/archived/2026-04-16-1507-wasm-data-structures-and-rfc-rename.md +0 -27
- package/editing-history/archived/2026-04-16-1520-wasm-bitwise-and-match.md +0 -21
- package/editing-history/archived/2026-04-16-1542-wasm-cross-ns-host-imports.md +0 -38
- package/editing-history/archived/2026-04-17-0026-wasm-rest-args.md +0 -62
- package/editing-history/archived/2026-04-17-0048-wasm-type-of.md +0 -70
- package/editing-history/archived/2026-04-17-0051-wasm-derived-predicates.md +0 -34
- package/editing-history/archived/2026-04-17-2316-wasm-do-println-fixes.md +0 -41
- package/editing-history/archived/2026-04-18-1208-split-emit-wasm-and-bump-version.md +0 -15
- package/editing-history/archived/2026-04-18-1430-wasm-list-match-and-method-dispatch.md +0 -5
- package/editing-history/archived/2026-04-18-2041-cr-wasm-split-and-runtime-stability.md +0 -18
- package/editing-history/archived/2026-04-18-2045-v0.12.23-ci-wasm-fix.md +0 -13
- package/editing-history/archived/2026-04-21-1818-wasm-string-ops-v2.md +0 -57
- package/editing-history/archived/2026-04-21-2332-split-emit-wasm.md +0 -45
- package/editing-history/archived/2026-04-22-0114-wasm-hof-intercepts-and-set-intersection.md +0 -82
- package/editing-history/archived/2026-04-22-0136-wasm-enum-tuple-bool-str-fixes.md +0 -68
- package/editing-history/archived/2026-04-22-1340-wasm-map-diff-new-and-let-intercept.md +0 -53
- package/editing-history/archived/2026-04-23-1419-v0.12.26-wasm-bisection-fixes.md +0 -7
- package/editing-history/archived/2026-04-23-1645-release-conventions.md +0 -14
- package/editing-history/archived/2026-04-25-1940-wasm-suite-multi-module-entry.md +0 -53
- package/editing-history/archived/2026-04-25-2003-wasm-method-includes-string-and-set-refactor.md +0 -71
- package/editing-history/archived/2026-04-25-2010-wasm-suite-add-fn-lens-edn.md +0 -43
- package/editing-history/archived/2026-04-25-2051-display-by.md +0 -39
- package/editing-history/archived/2026-04-28-1728-fix-gensym-stable.md +0 -31
- package/editing-history/archived/2026-04-29-1400-fix-bind-type-precompile.md +0 -38
- package/editing-history/archived/2026-05-26-0957-match-docs-check-md.md +0 -24
- package/editing-history/archived/2026-05-31-2059-ci-docs-test-and-fn-helper-tightening.md +0 -3
- package/editing-history/archived/2026-06-01-0005-release-0.12.36.md +0 -16
- package/editing-history/archived/2026-06-01-2230-enum-struct-payload-docs.md +0 -4
- package/editing-history/archived/2026-06-03-1620-release-0.12.38.md +0 -6
- package/editing-history/archived/2026-06-04-0000-release-0.12.39.md +0 -4
- package/editing-history/archived/2026-06-04-2230-release-0.12.40.md +0 -5
- package/editing-history/archived/2026-06-12-1525-weak-types-dots-format.md +0 -15
- package/editing-history/archived/2026-06-13-1200-primitive_schema_tags.md +0 -9
- package/editing-history/archived/2026-06-20-1142-ts-declaration-d-mts.md +0 -5
- package/editing-history/archived/2026-06-29-0117-upgrade-doc-snapshot-migration.md +0 -2
- package/editing-history/archived/2026-06-29-calcit-cli.md +0 -80
- package/editing-history/archived/2026-06-29-typed-calcit-cli-schemas.md +0 -23
- package/editing-history/archived/20260630-duplication-analysis.md +0 -116
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# 202604212332 - Split emit_wasm.rs into focused submodules
|
|
2
|
-
|
|
3
|
-
## 背景
|
|
4
|
-
|
|
5
|
-
`src/codegen/emit_wasm.rs` 原来有 6353 行,包含 WASM codegen 的所有逻辑,难以维护。
|
|
6
|
-
|
|
7
|
-
## 拆分方案
|
|
8
|
-
|
|
9
|
-
将文件按数据结构类别拆分为 6 个新子模块(位于 `src/codegen/emit_wasm/`):
|
|
10
|
-
|
|
11
|
-
| 文件 | 行数 | 内容 |
|
|
12
|
-
|------|------|------|
|
|
13
|
-
| `heap.rs` | 266 | 内存管理:bump allocator、类型标签查找、哈希辅助函数 |
|
|
14
|
-
| `lists.rs` | 1130 | 列表操作 + BufList + `emit_range` + `emit_list_distinct` |
|
|
15
|
-
| `maps.rs` | 1157 | Map 基础操作 + merge/diff + `&map:destruct` + `&merge-non-nil` |
|
|
16
|
-
| `sets.rs` | 828 | Set 操作 + `&set:destruct` |
|
|
17
|
-
| `strings.rs` | 925 | 字符串操作 + pad + `build_str_*` runtime 函数 |
|
|
18
|
-
| `hof.rs` | 423 | `resolve_callee_fn_idx`、`foldl`、`foldl-shortcut`、`foldr-shortcut` |
|
|
19
|
-
|
|
20
|
-
父文件 `emit_wasm.rs` 精简到 1656 行,保留:
|
|
21
|
-
- 模块级 doc、import、常量、基础 helpers
|
|
22
|
-
- `emit_wasm()` 公开入口函数
|
|
23
|
-
- 所有结构体和 impl(`CompiledFn`、`WasmCompileEnv`、`WasmGenCtx`)
|
|
24
|
-
- 编译管道函数(`extract_fn_parts`、`compile_fn`、`emit_body`)
|
|
25
|
-
- 表达式 emitter(`emit_expr`、`emit_call_expr`、`emit_proc_call` 等)
|
|
26
|
-
- Tag/String pool 收集
|
|
27
|
-
|
|
28
|
-
## 模块间可见性
|
|
29
|
-
|
|
30
|
-
- 各子模块顶部均有 `use super::*;`(继承父模块 imports)
|
|
31
|
-
- 所有导出函数使用 `pub(super) fn`(通过 Python 正则批量转换)
|
|
32
|
-
- 父模块通过 `pub(super) use heap::*` 将 heap 辅助函数传播给兄弟模块
|
|
33
|
-
- 父模块通过 `use lists::*; use maps::*; ...` 将各域函数引入 `emit_proc_call` 的作用域
|
|
34
|
-
|
|
35
|
-
## 实现技术
|
|
36
|
-
|
|
37
|
-
使用 Python 脚本(`scripts/split_emit_wasm.py`)自动化提取:
|
|
38
|
-
- 精确定位每段的起止行(避免孤立的 doc comment)
|
|
39
|
-
- 对非连续段(如 maps.rs 包含 4 段原文)进行拼接
|
|
40
|
-
- `make_pub_super()` 批量将 `^fn ` 替换为 `pub(super) fn`
|
|
41
|
-
|
|
42
|
-
## 验证
|
|
43
|
-
|
|
44
|
-
- `cargo check`:无错误,仅 1 个 `pub(super) use heap::*` 可见性警告(已用 `#[allow(unused_imports)]` 消除)
|
|
45
|
-
- `./target/release/cr calcit/test-record.cirru`:测试全部通过
|
package/editing-history/archived/2026-04-22-0114-wasm-hof-intercepts-and-set-intersection.md
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# WASM HOF Intercepts & Set Intersection
|
|
2
|
-
|
|
3
|
-
## 修改概要
|
|
4
|
-
|
|
5
|
-
将 WASM codegen 的不支持 proc 数量从 72 减少到 68(减少 4 个)。
|
|
6
|
-
|
|
7
|
-
## 核心问题
|
|
8
|
-
|
|
9
|
-
calcit.core 内部定义了 `map/filter/each/any?/every?/find/find-index` 等 HOF,其实现体使用 `f` 参数作为调用头——在 WASM codegen 中无法静态解析局部变量作为调用目标。解决方案:在**调用点拦截**(call-site intercept),在 `emit_call_expr` 中直接 emit 内联循环。
|
|
10
|
-
|
|
11
|
-
## 文件修改
|
|
12
|
-
|
|
13
|
-
### `src/codegen/emit_wasm/hof.rs`
|
|
14
|
-
|
|
15
|
-
新增以下函数(通过 `cat >>` 追加到文件末尾):
|
|
16
|
-
|
|
17
|
-
- **`emit_unary_step`** — 对单参数 HOF callee 发出调用(支持 Static/Inline/Proc 三种 callee 类型)
|
|
18
|
-
- **`emit_binary_step_ei`** — 对 `(elem, idx)` 双参数 callee 发出调用(用于 map-indexed)
|
|
19
|
-
- **`resolve_unary_callee`** — 解析单参数 HOF callee,返回 `FoldlCallKind`
|
|
20
|
-
- **`emit_map`** — `map xs f`:对每个元素调用 f,返回等长新列表
|
|
21
|
-
- **`emit_map_indexed`** — `map-indexed xs f`:对每个 (elem, idx) 调用 f
|
|
22
|
-
- **`emit_each`** — `each xs f`:对每个元素调用 f(副作用),返回 nil
|
|
23
|
-
- **`emit_filter`** — `filter xs f`:过滤满足 f 的元素,返回新列表
|
|
24
|
-
- **`emit_any`** — `any? xs f`:任意元素满足 f 返回 1.0,否则 0.0
|
|
25
|
-
- **`emit_every`** — `every? xs f`:全部元素满足 f 返回 1.0,否则 0.0
|
|
26
|
-
- **`emit_find`** — `find xs f`:返回第一个满足 f 的元素,否则 nil
|
|
27
|
-
- **`emit_find_index`** — `find-index xs f`:返回第一个满足 f 的元素索引,否则 -1.0
|
|
28
|
-
|
|
29
|
-
### `src/codegen/emit_wasm/sets.rs`
|
|
30
|
-
|
|
31
|
-
新增:
|
|
32
|
-
- **`emit_set_intersection`** — `&set:intersection a b`:返回两集合共有元素。逻辑与 `emit_set_difference` 对称,条件取反(`I32Ne` 代替 `I32Eq`)。
|
|
33
|
-
|
|
34
|
-
### `src/codegen/emit_wasm/lists.rs`
|
|
35
|
-
|
|
36
|
-
修改 **`emit_list_concat`**:从只支持 2-arg 改为支持任意数量 args(通过左折叠依次合并)。新增私有辅助函数 **`emit_list_concat_two`** 处理 2-arg 快速路径。
|
|
37
|
-
|
|
38
|
-
### `src/codegen/emit_wasm.rs`
|
|
39
|
-
|
|
40
|
-
**`emit_call_expr` 的 `calcit.core` 拦截块** 新增:
|
|
41
|
-
```rust
|
|
42
|
-
"map" if args_list.len() == 2 => return emit_map(ctx, &args_list),
|
|
43
|
-
"map-indexed" if args_list.len() == 2 => return emit_map_indexed(ctx, &args_list),
|
|
44
|
-
"each" if args_list.len() == 2 => return emit_each(ctx, &args_list),
|
|
45
|
-
"filter" if args_list.len() == 2 => return emit_filter(ctx, &args_list),
|
|
46
|
-
"any?" if args_list.len() == 2 => return emit_any(ctx, &args_list),
|
|
47
|
-
"every?" if args_list.len() == 2 => return emit_every(ctx, &args_list),
|
|
48
|
-
"find" if args_list.len() == 2 => return emit_find(ctx, &args_list),
|
|
49
|
-
"find-index" if args_list.len() == 2 => return emit_find_index(ctx, &args_list),
|
|
50
|
-
"concat" if args_list.len() >= 2 => return emit_list_concat(ctx, &args_list),
|
|
51
|
-
"deref" if args_list.len() == 1 => return emit_expr(ctx, &args_list[0]),
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**`emit_proc_call`** 新增:
|
|
55
|
-
```rust
|
|
56
|
-
CalcitProc::NativeSetIntersection => emit_set_intersection(ctx, args),
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**`emit_call_spread`** 新增 `Calcit::Proc` arm:
|
|
60
|
-
```rust
|
|
61
|
-
Calcit::Proc(proc) => emit_call_spread_args_as_regular(ctx, proc, call_args),
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
新增辅助函数 **`emit_call_spread_args_as_regular`**:收集 spread 调用中的真实参数,跳过 ArgSpread 标记,转交 `emit_proc_call` 处理。
|
|
65
|
-
|
|
66
|
-
## 关键设计理解
|
|
67
|
-
|
|
68
|
-
### 调用点拦截 vs 定义编译
|
|
69
|
-
|
|
70
|
-
- calcit.core 的 HOF 定义(如 `calcit.core/map`)内部使用 `f` 参数作为调用头,**定义本身无法编译**(会 skip)。
|
|
71
|
-
- 拦截在 `emit_call_expr` 的 `Calcit::Import` arm,当用户代码调用 `(map my-list my-fn)` 时触发,直接 emit 内联循环,**无需编译 calcit.core/map 的定义体**。
|
|
72
|
-
- 因此 skip 列表中仍可见 `calcit.core/map`(定义 skip),但用户代码的调用点正常生成 WASM。
|
|
73
|
-
|
|
74
|
-
### 剩余 68 个 skip 的分布
|
|
75
|
-
|
|
76
|
-
- **核心库定义失败**(~66 个):使用运行时 spread(`& args`)、方法调用(`.deref`)、嵌套 defn、'f' 作为调用头等无法在 WASM 编译时静态解析的特性。
|
|
77
|
-
- **用户代码 skip**(2 个):`recollect.app.comp.panel/on-click` 和 `recollect.test/test-diff-funcs`,均因内部使用了嵌套 defn(nested lambda)。
|
|
78
|
-
|
|
79
|
-
## 测试结果
|
|
80
|
-
|
|
81
|
-
- `yarn test:wasm`:**全部通过**(=== Recollect WASM checks passed ===)
|
|
82
|
-
- skip 数量:72 → 68(减少 4 个)
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# WASM Codegen: Enum Tuple, Bool Tag, and Str Fixes
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-04-22 01:36
|
|
4
|
-
**Skip count**: 68 → 62 (6 fewer)
|
|
5
|
-
|
|
6
|
-
## Changes Made
|
|
7
|
-
|
|
8
|
-
### 1. `NativeEnumTupleNew` (`%::`) — New Dedicated Emitter
|
|
9
|
-
|
|
10
|
-
**File**: `src/codegen/emit_wasm/records.rs`, `src/codegen/emit_wasm.rs`
|
|
11
|
-
|
|
12
|
-
Added `emit_enum_tuple_new` for the `%::` proc (enum variant constructor).
|
|
13
|
-
|
|
14
|
-
Key insight: `%::` always has the form `(%:: enum_class tag payload...)` where:
|
|
15
|
-
- `enum_class` (args[0]) is for type-checking only — **ignored in WASM**
|
|
16
|
-
- `tag` (args[1]) is the actual variant tag (Calcit::Tag)
|
|
17
|
-
- `payload` (args[2..]) are the values
|
|
18
|
-
|
|
19
|
-
This is distinct from `::` (`NativeTuple`) which uses `args[0]` as the tag directly.
|
|
20
|
-
|
|
21
|
-
**Fixed functions**: `%ok`, `%err`, `%some`, `%none` — now compile correctly.
|
|
22
|
-
|
|
23
|
-
Memory layout is identical to `::` tuples: `[count:f64][tag_id:f64][payload...]`.
|
|
24
|
-
|
|
25
|
-
### 2. Bool Support in `emit_tuple_new`
|
|
26
|
-
|
|
27
|
-
**File**: `src/codegen/emit_wasm/records.rs`
|
|
28
|
-
|
|
29
|
-
Extended `emit_tuple_new` to accept `Calcit::Bool` as the tag field:
|
|
30
|
-
- `true` → `1.0`
|
|
31
|
-
- `false` → `0.0`
|
|
32
|
-
|
|
33
|
-
**Purpose**: The `foldl-shortcut` pattern uses `(:: true value)` and `(:: false value)` as tagged pairs for early-exit signaling. The `foldl-shortcut` implementation reads the tag at offset +8 and compares with `1.0`.
|
|
34
|
-
|
|
35
|
-
**Fixed functions**: `calcit.core/index-of`, `calcit.core/&list:last-index-of` — these use `foldl-shortcut` with an inline `%index-of` defn that calls `(:: true idx)` / `(:: false ...)`.
|
|
36
|
-
|
|
37
|
-
### 3. Variadic `str` / `str-spaced` Call-Site Intercepts
|
|
38
|
-
|
|
39
|
-
**File**: `src/codegen/emit_wasm/strings.rs`, `src/codegen/emit_wasm.rs`
|
|
40
|
-
|
|
41
|
-
Added two new pub functions:
|
|
42
|
-
- `emit_str_variadic(ctx, args)`: `(str a b c ...)` → left-fold of string concat
|
|
43
|
-
- `emit_str_spaced(ctx, args)`: `(str-spaced a b c ...)` → join with space separator
|
|
44
|
-
|
|
45
|
-
Private helper:
|
|
46
|
-
- `concat_two_i32_ptrs(ctx, ptr_a, ptr_b)`: concatenates two strings from i32 ptr locals
|
|
47
|
-
|
|
48
|
-
**Key technique**: `emit_turn_string` converts any f64 value to a string, then `concat_two_i32_ptrs` combines them without re-emitting expressions.
|
|
49
|
-
|
|
50
|
-
For `str-spaced`, the space character is allocated dynamically (1-byte string with 0x20 written via `I32Store8`) to avoid depending on the string pool.
|
|
51
|
-
|
|
52
|
-
**Intercept added in `emit_call_expr`** for `calcit.core` namespace:
|
|
53
|
-
```rust
|
|
54
|
-
"str" if !args_list.is_empty() => return emit_str_variadic(ctx, &args_list),
|
|
55
|
-
"str-spaced" if !args_list.is_empty() => return emit_str_spaced(ctx, &args_list),
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
These intercepts help user code calling `str`/`str-spaced`; the core library definitions still fail because they use `(&syntax &)` variadic syntax.
|
|
59
|
-
|
|
60
|
-
## Remaining 62 Skips (Categorized)
|
|
61
|
-
|
|
62
|
-
- **14 'f callee** (HOF defs): map, filter, each, find, foldl', update, etc.
|
|
63
|
-
- **~9 nested defn**: &fn:apply, &fn:bind, &list:filter-pair, on-click, etc.
|
|
64
|
-
- **~7 complex defn callee**: group-by, frequencies, repeat, zipmap, etc.
|
|
65
|
-
- **3 `(&syntax &)`**: str, str-spaced, &str-spaced (definitions; call sites intercepted)
|
|
66
|
-
- **3 method calls**: .slice, .filter, .deref (definition level)
|
|
67
|
-
- **~4 variadic spread**: concat, mapcat, &list:flatten, &list:apply
|
|
68
|
-
- **Others**: dissoc, conj, contains-in?, tagging-edn, impl-traits, etc.
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# 202604221340 - WASM map diff-new fix & let intercept
|
|
2
|
-
|
|
3
|
-
## 问题与修复
|
|
4
|
-
|
|
5
|
-
### 1. `&map:diff-new` 参数顺序错误 (`maps.rs`)
|
|
6
|
-
|
|
7
|
-
**问题**: `emit_map_diff_new` 中 `args[0]` (b) 和 `args[1]` (a) 搞反,导致"b 中不在 a 里的条目"变成"a 中不在 b 里的条目"。结果 `patch-map` 的 map-splice 分支从来不添加新键,`recollect` API roundtrip 测试 `summary=41` 而不是预期的 44。
|
|
8
|
-
|
|
9
|
-
**修复**: 交换 a/b 的加载顺序——先加载 `args[0]` 为 `b`,`args[1]` 为 `a`,迭代 b 检查每个 key 是否在 a 中缺失。
|
|
10
|
-
|
|
11
|
-
### 2. `calcit.core/let` WASM 拦截 (`emit_wasm.rs`)
|
|
12
|
-
|
|
13
|
-
**问题**: `calcit.core/let` 以宏形式存在,正常编译会由预处理器展开为 `&let`,但作为 Import 出现在 call position 时 WASM codegen 找不到对应函数而报错。
|
|
14
|
-
|
|
15
|
-
**修复**:
|
|
16
|
-
- 在 `emit_call_expr` 的 `calcit.core` 拦截块中新增 `"let"` case
|
|
17
|
-
- 新增 `emit_let_multi` + `emit_let_pairs` 辅助函数,将 `(let ((name val)...) body...)` 格式转换为逐层绑定
|
|
18
|
-
|
|
19
|
-
### 3. `{}` 空 map 字面量 WASM 支持 (`emit_wasm.rs`)
|
|
20
|
-
|
|
21
|
-
**问题**: `{}` 作为裸表达式(非 call head)时,出现为 `calcit.core/{}` 的 Import 或 `CalcitProc::NativeMap`,WASM codegen 报 "unsupported WASM expression"。
|
|
22
|
-
|
|
23
|
-
**修复**:
|
|
24
|
-
- 在 `emit_expr` 的 `Calcit::Import` 分支加入 `def == "{}"` 的检查,调用 `emit_map_new(ctx, &[])`
|
|
25
|
-
- 在 `emit_expr` 新增 `Calcit::Proc(CalcitProc::NativeMap)` case,调用 `emit_map_new`
|
|
26
|
-
|
|
27
|
-
### 4. recollect probe 函数 Cirru 语法修复
|
|
28
|
-
|
|
29
|
-
**问题**: 7 个调试用 probe 函数缺少 `$` 运算符,导致 `let`/`&map:count`/`if` 等出现为裸表达式而非调用头:
|
|
30
|
-
- `probe-nested-*` (4 个): `let ...` → `$ let ...`
|
|
31
|
-
- `probe-*-map*` (3 个): `&map:count ...` → `$ &map:count ...`
|
|
32
|
-
- `probe-nested-changes-count`: fn 内部 `if` → `$ if`
|
|
33
|
-
|
|
34
|
-
**修复**: 用 `cr edit def --overwrite` 重写全部 7 个函数的 Cirru 语法。
|
|
35
|
-
|
|
36
|
-
## 测试结果
|
|
37
|
-
|
|
38
|
-
- `yarn run:wasm:api` (recollect): `api-roundtrip summary=44 expected=44 OK` ✓
|
|
39
|
-
- probe 函数全部通过 WASM 编译并返回正确结果:
|
|
40
|
-
`probe-empty-map=0, probe-map-count-1=1, probe-assoc-simple=2`
|
|
41
|
-
`probe-nested-bonus=3, probe-nested-count=10, probe-nested-map-count=2`
|
|
42
|
-
- WASM skip 数量: 62 → 51(recollect namespace 中全部消除,仅剩 calcit.core HOF/closure/variadic 等已知不支持项)
|
|
43
|
-
|
|
44
|
-
## 剩余已知 skip 分类 (51 个)
|
|
45
|
-
|
|
46
|
-
| 原因 | 数量 | 说明 |
|
|
47
|
-
|------|------|------|
|
|
48
|
-
| `'f` (动态调用头) | 26 | HOF 参数作函数调用,需函数表支持 |
|
|
49
|
-
| nested defn | 9 | 函数内部嵌套 defn(闭包),不支持 |
|
|
50
|
-
| `(&syntax &)` | 3 | 可变参数 `&`,str/str-spaced 已有拦截 |
|
|
51
|
-
| sort | 1 | `&list:sort-by` 需要比较函数回调 |
|
|
52
|
-
| recur arity | 1 | `conj` 内部尾递归 arity 不匹配 |
|
|
53
|
-
| 特殊 proc | 2 | tagging-edn、&core-number-impls |
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
- Fixed WASM `&str:nth` to return a one-character string or nil, matching native Calcit semantics.
|
|
2
|
-
- Added string-content-aware `=` handling in WASM while keeping `identical?` as raw-value equality.
|
|
3
|
-
- Inlined imported top-level value defs in WASM so string constants like `dictionary` are usable at runtime.
|
|
4
|
-
- Fixed `nil?` lowering in WASM to match the backend's nil representation.
|
|
5
|
-
- Corrected `&map:diff-new` argument semantics in WASM codegen.
|
|
6
|
-
- Updated WASM tests/docs to match current `&str:nth` semantics.
|
|
7
|
-
- Validated with `cargo clippy -- -D warnings`, `yarn compile`, `cargo test`, and `yarn check-all` before bumping version to `0.12.26`.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# 发布流程规范与加速
|
|
2
|
-
|
|
3
|
-
## 本次改动
|
|
4
|
-
|
|
5
|
-
- 更新 `Agents.md`:新增"发布流程规范"章节,记录版本升级、PR/tag 习惯、crates.io 加速措施
|
|
6
|
-
- 更新 `.github/workflows/publish.yaml`:加入两项加速
|
|
7
|
-
1. `CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse`:加速 crates.io index 查找(分钟级 → 秒级)
|
|
8
|
-
2. `cargo publish --no-verify`:跳过发布前重复的编译验证,因为本地和 PR CI 已跑过
|
|
9
|
-
|
|
10
|
-
## 关键规范
|
|
11
|
-
|
|
12
|
-
- 版本升级:`Cargo.toml` 和 `package.json` 两边同步改,再更新 `Cargo.lock`/`yarn.lock`
|
|
13
|
-
- Tag 格式:`0.12.27`(无 `v` 前缀),与 commit 一起打,message 注明版本号
|
|
14
|
-
- 分支开发,不自动合并;本地测试全过 → push PR → Actions 全过 → 手动合并
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# 202604251940 — wasm: 新增 test-wasm-suite 多模块入口
|
|
2
|
-
|
|
3
|
-
## 背景
|
|
4
|
-
|
|
5
|
-
`test-wasm.cirru` 是手写的小型 WASM 测试用例集,已经通过;但
|
|
6
|
-
`yarn check-all` 还会运行 `calcit/test-X.cirru` 一系列测试模块
|
|
7
|
-
(test-cond / test-math / test-set / ...),目前 WASM target
|
|
8
|
-
还没有专门的入口把这些测试统一跑起来。
|
|
9
|
-
|
|
10
|
-
## 改动
|
|
11
|
-
|
|
12
|
-
1. 新增 `calcit/test-wasm-suite.cirru`:手写的 snapshot 文件,
|
|
13
|
-
通过 `:modules` 引入 `util.cirru` 与若干测试模块,自身定义
|
|
14
|
-
`test-wasm-suite.main/main!` 依次调用各测试模块的 `main!`。
|
|
15
|
-
- 当前包含:`util` + `test-cond` + `test-math` + `test-set` + `test-tuple`
|
|
16
|
-
- `test-tuple/main!` 因 `&tuple:enum` 未实现,被 codegen 标为
|
|
17
|
-
skip,main! 会以 `f64 0.0` 占位返回,对整体不产生副作用。
|
|
18
|
-
2. 新增 `scripts/test-wasm-suite-extended.sh`:编译并运行新入口的
|
|
19
|
-
一键脚本,输出 `[wasm] skipping ...` 的列表,便于后续逐步补齐
|
|
20
|
-
proc 实现。
|
|
21
|
-
|
|
22
|
-
## 已知阻塞(短期不放进新入口)
|
|
23
|
-
|
|
24
|
-
- `test-recursion`:`emit_bump_alloc` 与 closure-as-value 的交互产生
|
|
25
|
-
无效 WAT(`global.set __heap_ptr` 收到 f64),独立编译也会触发;
|
|
26
|
-
与目前 in-progress refactor(emit_set_find_structural / hash_list_or_set)
|
|
27
|
-
联动后表现尤其明显。
|
|
28
|
-
- `test-list`:`local.set f64` 收到 i32(function 35 体内),bytes 模式
|
|
29
|
-
形如 `local.get a (i32) ; local.get b (i32) ; local.set c (f64)`。
|
|
30
|
-
- `test-string`:`includes?` / `.find-index` / `starts-with?` /
|
|
31
|
-
`strip-prefix` / `strip-suffix` 等字符串过程 WASM 未实现;
|
|
32
|
-
`trim` / `blank?` / `parse-float` / `&str:replace` / `format-to-cirru` /
|
|
33
|
-
`&cirru-quote:to-list` / `get-char-code` 同上。
|
|
34
|
-
- `test-fn`:`(let f2 &+)` 把过程作为值放进局部变量,
|
|
35
|
-
当前 WASM 不支持 first-class proc,整个 `main!` 会被 skip。
|
|
36
|
-
- `test-algebra`、`test-map`:旧的 `unreachable` 失败,与本次改动无关。
|
|
37
|
-
|
|
38
|
-
## 用法
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
bash scripts/test-wasm-suite-extended.sh
|
|
42
|
-
# 期望最后一行: [test-wasm-suite] PASS
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## 后续步骤
|
|
46
|
-
|
|
47
|
-
1. 修 test-recursion 的 closure-as-value / bump_alloc 类型不一致
|
|
48
|
-
(定位 `f64.const 0; local.tee Xf64; global.set __heap_ptr` 来源)。
|
|
49
|
-
2. 修 test-list 的 i32 ↔ f64 binding bug。
|
|
50
|
-
3. 实现 `includes?` / `starts-with?` / `ends-with?` / `strip-prefix` /
|
|
51
|
-
`strip-suffix` / `.find-index` 等 string proc,把 test-string 的
|
|
52
|
-
`test-includes` 子集放进新入口。
|
|
53
|
-
4. 实现 `&tuple:enum` 等 tuple 操作,让 test-tuple/main! 不再被 skip。
|
package/editing-history/archived/2026-04-25-2003-wasm-method-includes-string-and-set-refactor.md
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# 202604252003 — WASM suite extended: .includes? string branch + uncommitted refactor consolidation
|
|
2
|
-
|
|
3
|
-
## Background
|
|
4
|
-
|
|
5
|
-
In the previous session a multi-module WASM suite entry (`calcit/test-wasm-suite.cirru`) was added
|
|
6
|
-
to gradually exercise more of the existing `calcit/test-*.cirru` programs against the WASM codegen.
|
|
7
|
-
At that point a sizable in-progress refactor in `src/codegen/emit_wasm/{heap,hof,lists,runtime,sets}.rs`
|
|
8
|
-
was left uncommitted alongside, and `test-string.cirru` was deferred because folding it into the
|
|
9
|
-
suite triggered an `unreachable` trap.
|
|
10
|
-
|
|
11
|
-
## Findings this round
|
|
12
|
-
|
|
13
|
-
When folding `test-string.main` into `test-wasm-suite.main/main!`, the runtime trap reproduced. By
|
|
14
|
-
calling individual exports (new helper `scripts/test-wasm-call.mjs`) it was clear that:
|
|
15
|
-
|
|
16
|
-
1. `(.includes? "abc" "abc")` returned `0` (false) instead of `1`. Root cause:
|
|
17
|
-
`methods::emit_method_includes` only handled `list/map/set` receivers; for any other type it
|
|
18
|
-
emitted `f64_const(0.0)` as the fallback. Strings therefore never reached
|
|
19
|
-
`__rt_str_find_index`.
|
|
20
|
-
2. After fixing #1, `test-includes` still trapped — the assertions
|
|
21
|
-
`assert= true $ starts-with? :a/b :a/` and `assert= true $ starts-with? :a/b |a/` pass
|
|
22
|
-
tags as arguments. Tags in WASM are encoded as small `f64` values equal to their tag-index id,
|
|
23
|
-
so `__rt_str_starts_with` reads them as bogus heap pointers and silently returns 0. Adding tag→
|
|
24
|
-
string conversion at runtime is a follow-up.
|
|
25
|
-
3. `test-bitwise` traps on `&number:display-by` (radix formatting) which is currently stubbed to
|
|
26
|
-
return `0`.
|
|
27
|
-
|
|
28
|
-
Because #2 and #3 require additional runtime helpers, `test-string.cirru` is left out of the suite
|
|
29
|
-
for this commit. The `.includes?` regression is fixed in isolation; it also benefits any other
|
|
30
|
-
program that calls `.includes?` on a string.
|
|
31
|
-
|
|
32
|
-
## Changes in this commit
|
|
33
|
-
|
|
34
|
-
- `src/codegen/emit_wasm/methods.rs`: extend `emit_method_includes` with a string branch
|
|
35
|
-
(`emit_str_includes_from_local`) that calls `__rt_str_find_index >= 0`.
|
|
36
|
-
- `scripts/test-wasm-call.mjs`: minimal helper to invoke a single named export against the latest
|
|
37
|
-
`js-out/program.wasm`, useful for bisecting which assertion in a `main!` traps.
|
|
38
|
-
|
|
39
|
-
The commit also folds in the previously-uncommitted refactor that landed in
|
|
40
|
-
`src/codegen/emit_wasm/{heap,hof,lists,runtime,sets}.rs`:
|
|
41
|
-
|
|
42
|
-
- `sets.rs`: `emit_set_find_structural` replaces the pointer-only `__rt_set_find_elem` for
|
|
43
|
-
`difference`/`intersection`/set-equality so identical-by-content elements are treated as equal.
|
|
44
|
-
- `runtime.rs`: new `__rt_hash_list_or_set(ptr) -> i32` (XOR-based content hash) plus a couple of
|
|
45
|
-
new helper-function indices.
|
|
46
|
-
- `hof.rs`: `emit_copy_type_tag` so `map`/`filter` preserve the receiver tag (set→set, list→list).
|
|
47
|
-
- `lists.rs`: `range start end step` 3-arg form.
|
|
48
|
-
- `heap.rs`: smarter `emit_hash_proc` that detects heap pointers at runtime and dispatches to the
|
|
49
|
-
list/set hash helper. The dead `emit_hash_expr_i32`/`emit_hash_mix` static helpers are removed.
|
|
50
|
-
- `emit_wasm.rs`: `#[allow(private_interfaces)]` on `emit_equals_core` and
|
|
51
|
-
`emit_equals_core_shallow` (both already returned a `pub(super)`-only opaque local index but are
|
|
52
|
-
used from sibling modules through the `super::*` re-export).
|
|
53
|
-
|
|
54
|
-
## Verification
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
bash scripts/cargo-with-sdk.sh clippy --bin cr-wasm -- -D warnings # clean
|
|
58
|
-
bash scripts/cargo-with-sdk.sh build --bin cr-wasm --release # ok
|
|
59
|
-
bash scripts/test-wasm-suite-extended.sh # PASS
|
|
60
|
-
bash scripts/test-wasm-suite.sh # 6/10 (unchanged)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
`scripts/test-wasm-suite.sh` skips `test-fn`, `test-string`, `test-tuple`, `test-list` for the
|
|
64
|
-
same reasons documented previously; that is independent of this commit.
|
|
65
|
-
|
|
66
|
-
## Follow-ups
|
|
67
|
-
|
|
68
|
-
1. Tag → string conversion at runtime so string procs accept tags (unblocks `test-string`).
|
|
69
|
-
2. `&number:display-by` radix formatting (unblocks the last 3 assertions in `test-bitwise`).
|
|
70
|
-
3. The other test-string skips (`&str:replace`, `parse-float`, `blank?`, `trim`,
|
|
71
|
-
`get-char-code`, `format-to-cirru`, `&cirru-quote:to-list`).
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# 202604252010 — WASM suite extended: + test-fn / test-lens / test-edn
|
|
2
|
-
|
|
3
|
-
## Background
|
|
4
|
-
|
|
5
|
-
After landing the `.includes?` string fix, this round adds three more `test-*.cirru` programs to
|
|
6
|
-
`calcit/test-wasm-suite.cirru` to cover more of the WASM runtime surface. Goal: keep growing the
|
|
7
|
-
"runs end-to-end in WASM" set without depending on Host FFI features.
|
|
8
|
-
|
|
9
|
-
## Process
|
|
10
|
-
|
|
11
|
-
For each candidate module:
|
|
12
|
-
|
|
13
|
-
1. Inspect `cr-wasm <module>.cirru` standalone to enumerate `[wasm] skipping ...` lines (these are
|
|
14
|
-
per-def errors that cause that def to be replaced with a `0.0`-returning stub).
|
|
15
|
-
2. Read the module's `main!` body to confirm trapping assertions can survive when the skipped
|
|
16
|
-
helpers return `0`.
|
|
17
|
-
3. Add to the suite, rebuild, and run `bash scripts/test-wasm-suite-extended.sh`.
|
|
18
|
-
|
|
19
|
-
## Result
|
|
20
|
-
|
|
21
|
-
Suite now covers (in addition to previous `test-cond/test-math/test-set/test-tuple`):
|
|
22
|
-
|
|
23
|
-
- `test-fn` — only `&init-builtin-impls!` skipped; suite passes cleanly.
|
|
24
|
-
- `test-lens` — `test-lens.main/test-lens` is skipped (`:::` rejects a quoted form arg) but other
|
|
25
|
-
defs in the module compile; `main!` does not trip the stub.
|
|
26
|
-
- `test-edn` — many sub-tests skipped (`parse-cirru-edn`, `trim`, `&extract-code-into-edn`), but
|
|
27
|
-
the skipped fns return `0` instead of running their assertions, so `main!` completes.
|
|
28
|
-
|
|
29
|
-
Modules tried but reverted:
|
|
30
|
-
|
|
31
|
-
- `test-string` — assertions feed tags into `starts-with?`/`ends-with?`/`includes?`. Tags in WASM
|
|
32
|
-
are encoded as small `f64` ids (their tag-index value), not heap string pointers, so the procs
|
|
33
|
-
silently return `0` and the assertion traps. Needs a tag→string runtime helper.
|
|
34
|
-
- `test-algebra` — `test-map` exercises `%{} AlgebraBox`, `assert-traits`, `.map` on records, and
|
|
35
|
-
`:value` access; record/trait dispatch is not yet implemented in WASM.
|
|
36
|
-
- `test-map` (the standalone, full map suite) — `test-pairs`/`test-keys` etc. compile but trap at
|
|
37
|
-
runtime, likely from map iteration ordering or hash collision behavior. Needs deeper triage.
|
|
38
|
-
|
|
39
|
-
## Verification
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
bash scripts/test-wasm-suite-extended.sh # PASS (8 modules including util)
|
|
43
|
-
```
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# `&number:display-by` WASM 实现
|
|
2
|
-
|
|
3
|
-
## 摘要
|
|
4
|
-
|
|
5
|
-
实现了 `&number:display-by` 和 `.display-by` 方法的 WASM codegen,支持二进制、八进制、十六进制格式化,并将 `test-string` 模块加入 WASM 扩展测试套件。
|
|
6
|
-
|
|
7
|
-
## 关键实现点
|
|
8
|
-
|
|
9
|
-
### `build_rt_display_by` (runtime.rs)
|
|
10
|
-
|
|
11
|
-
- 函数签名: `(value: f64, radix: f64) -> f64` (返回字符串堆 ptr)
|
|
12
|
-
- 算法:负数检测 → 计数位数(div 循环)→ 计算前缀长度(radix ∈ {2,8,16} → 2, else 0)→ 分配堆字符串 → 写前缀(`0b`/`0o`/`0x`)→ 从右往左写位数(`'0'..digit` 或 `'a'..digit-10`)
|
|
13
|
-
- locals 索引 2-16,手动分配(非 RuntimeFnBuilder 风格)
|
|
14
|
-
- 负数:先检测,计数时用 abs_i64,最后写 '-'
|
|
15
|
-
|
|
16
|
-
### 注意
|
|
17
|
-
|
|
18
|
-
- 必须先用 `collect_strings_from_expr` 收集 tag 名称才能支持 tag→string(前一次提交已做)
|
|
19
|
-
- local 参数:value=0, radix=1;其余 2..16 为局部变量
|
|
20
|
-
|
|
21
|
-
### 测试
|
|
22
|
-
|
|
23
|
-
- `test-display-by-bin()` = 7 (17 → "0b10001")
|
|
24
|
-
- `test-display-by-hex()` = 4 (17 → "0x11")
|
|
25
|
-
- test-string 模块加入 test-wasm-suite(8个模块),全部 PASS
|
|
26
|
-
|
|
27
|
-
## 修改文件
|
|
28
|
-
|
|
29
|
-
- `src/codegen/emit_wasm/runtime.rs` — 新增 `build_rt_display_by` + 注册 `__rt_display_by`
|
|
30
|
-
- `src/codegen/emit_wasm.rs` — 分拆 `NativeNumberDisplayBy` 从 stub 到 `call_rt("__rt_display_by")`
|
|
31
|
-
- `src/codegen/emit_wasm/methods.rs` — 新增 `.display-by` 方法分发
|
|
32
|
-
- `calcit/test-wasm-suite.cirru` — 加入 `test-string`
|
|
33
|
-
- `calcit/test-wasm.cirru` — 新增 `test-display-by-bin` / `test-display-by-hex`
|
|
34
|
-
- `scripts/test-wasm.mjs` — 新增对应断言
|
|
35
|
-
|
|
36
|
-
## 后续计划
|
|
37
|
-
|
|
38
|
-
- `trim`、`blank?`、`&str:replace`、`parse-float`、`get-char-code`
|
|
39
|
-
- HOF closures-as-values (S1 fn-table)
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Fix: Gensym 稳定性问题
|
|
2
|
-
|
|
3
|
-
## 问题描述
|
|
4
|
-
|
|
5
|
-
`cr js` 每次运行会生成不同的 JS 文件,原因是 gensym 计数器不稳定(如 `v__1` 变成 `v__3`)。
|
|
6
|
-
|
|
7
|
-
## 根本原因
|
|
8
|
-
|
|
9
|
-
Calcit 的 gensym 使用 `NS_SYMBOL_DICT: HashMap<Arc<str>, usize>` 记录计数器。由于 Rust 的 `HashMap` 每进程随机化迭代顺序,不同运行时的 def 编译顺序不同,导致 gensym 计数器累积值不一样。
|
|
10
|
-
|
|
11
|
-
有**两条**编译路径,只修了一条是不够的:
|
|
12
|
-
1. `ensure_ns_def_preprocessed` —— 正常编译路径,通过 `with_compiling_def` 重置 gensym 计数器(之前已修)
|
|
13
|
-
2. `compile_source_def_for_snapshot` —— 快照填充路径(JS codegen 时触发),**缺少 `with_compiling_def` 包装**,导致 `CURRENT_COMPILING_DEF` 为 `None`,gensym 退回到 `file_ns`(命名空间级 key),计数器跨 def 累积
|
|
14
|
-
|
|
15
|
-
## 修复方法
|
|
16
|
-
|
|
17
|
-
在 `src/runner/preprocess/mod.rs` 的 `compile_source_def_for_snapshot` 函数中,为 `preprocess_expr` 调用加上 `builtins::meta::with_compiling_def(ns, def, ...)` 包装,与 `ensure_ns_def_preprocessed` 保持一致。
|
|
18
|
-
|
|
19
|
-
## 已修改文件
|
|
20
|
-
|
|
21
|
-
- `src/builtins/syntax.rs`: gensym key 改为 `CURRENT_COMPILING_DEF`(无 `file_ns` 前缀)
|
|
22
|
-
- `src/builtins/meta.rs`: 新增 `CURRENT_COMPILING_DEF` thread_local + `with_compiling_def`(自动重置计数器)
|
|
23
|
-
- `src/runner/preprocess/mod.rs`:
|
|
24
|
-
- `ensure_ns_def_preprocessed`: 包 `with_compiling_def`(第一次修)
|
|
25
|
-
- `compile_source_def_for_snapshot`: 包 `with_compiling_def`(本次修)
|
|
26
|
-
|
|
27
|
-
## 验证
|
|
28
|
-
|
|
29
|
-
- `cr js` 连续 8 次运行,无任何文件变化
|
|
30
|
-
- `cargo test` 67 passed
|
|
31
|
-
- `yarn check-all` 全部通过
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Fix: bind-type 类型槽预编译顺序问题
|
|
2
|
-
|
|
3
|
-
## 问题描述
|
|
4
|
-
|
|
5
|
-
`cr js` 在 tiye-index 项目中,`reel.app.comp.todolist.mjs` 和 `respo.schema.mjs` 仍然不稳定——有时生成 `Op`-aware 版本(带 `import { Op }` 和 `$clt._PCT__$o__$o_(Op, ...)`),有时生成不带 Op 的版本(使用 `$clt._$o__$o_(...)`)。
|
|
6
|
-
|
|
7
|
-
## 根本原因
|
|
8
|
-
|
|
9
|
-
`bind-type :dispatch-op Op` 在 `respo.main/main!` 函数体中,是一个预处理阶段的副作用操作:当 `preprocess_expr` 遇到 `bind-type` 调用时,立即执行 `bind_type_slot("dispatch-op", Op)`,使 `*dispatch-op` 类型槽指向 Op 枚举。
|
|
10
|
-
|
|
11
|
-
问题根源:`reel.app.comp.todolist` 等组件 def 会作为入口函数 `app.main/main!` 的传递依赖被提前编译。由于 HashMap 迭代顺序不确定,某些运行中 `todolist` 在 `respo.main/main!` 之前编译——此时 `*dispatch-op` 类型槽尚未绑定,导致 `d! $ :: :states cursor ...` 中的元组字面量无法被改写为 `%:: Op :states cursor ...`,生成结构上不同的 JS 代码。
|
|
12
|
-
|
|
13
|
-
## 修复方法
|
|
14
|
-
|
|
15
|
-
**双重修复:**
|
|
16
|
-
|
|
17
|
-
### 1. 预处理阶段:`precompile_bind_type_defs` (主要修复)
|
|
18
|
-
|
|
19
|
-
在 `src/lib.rs` 的 `run_program_with_docs` 中,在开始主入口预处理之前,先扫描**所有**程序源代码,找出含有 `bind-type` 调用的 def,并提前编译它们。
|
|
20
|
-
|
|
21
|
-
这确保 `respo.main/main!`(含 `bind-type :dispatch-op Op`)在 `app.main/main!` 的依赖树遍历之前被编译,从而使 `:dispatch-op` 类型槽在所有组件编译前就已绑定。
|
|
22
|
-
|
|
23
|
-
### 2. 快照填充阶段:任务排序 (辅助修复)
|
|
24
|
-
|
|
25
|
-
在 `src/program.rs` 的 `collect_snapshot_fill_tasks` 中,对快照填充任务排序,确保含 `bind-type` 的 def 在快照阶段也优先处理,同时按 (ns, def) 字典序排序保证完全确定性。
|
|
26
|
-
|
|
27
|
-
## 已修改文件
|
|
28
|
-
|
|
29
|
-
- `src/lib.rs`: 在 `run_program_with_docs` 中调用新增的 `precompile_bind_type_defs`
|
|
30
|
-
- `src/runner/preprocess/mod.rs`: 新增 `precompile_bind_type_defs` 公开函数(扫描所有源 def,提前编译含 `bind-type` 的 def)
|
|
31
|
-
- `src/program.rs`:
|
|
32
|
-
- `calcit_contains_bind_type` 改为 `pub fn`(供 preprocess 模块使用)
|
|
33
|
-
- `collect_snapshot_fill_tasks` 中对任务排序(bind-type 优先,其余按字典序)
|
|
34
|
-
|
|
35
|
-
## 验证
|
|
36
|
-
|
|
37
|
-
- `cr js` 在 tiye-index 项目连续 8 次运行,第 1 次(旧输出重新生成)后无任何文件变化
|
|
38
|
-
- `cargo test --lib` 179 tests passed
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# 2026-05-26 match 文档与 check-md 校验
|
|
2
|
-
|
|
3
|
-
## 修改内容
|
|
4
|
-
|
|
5
|
-
- 将 `match` 的文档说明统一为同时适用于 enum tuple 和 plain tuple,不再把 `tag-match` 描述成 plain tuple 的唯一入口。
|
|
6
|
-
- 更新 `features/enums.md`、`features/tuples.md`、`features/common-patterns.md`、`features.md`、`quick-reference.md`、`run/agent-advanced.md` 中的推荐表述与示例。
|
|
7
|
-
- 为 `agent-advanced.md` 里无法独立运行的 DOM / 事件示意片段补上 `cirru.no-check`,使 `cr docs check-md` 只校验可执行代码块。
|
|
8
|
-
|
|
9
|
-
## 验证
|
|
10
|
-
|
|
11
|
-
- `cargo run --bin cr -- eval $'match (:: :point 10 20)\n (:point x y) (+ x y)\n _ 0'`
|
|
12
|
-
- `cargo run --bin cr -- docs check-md docs/features.md`
|
|
13
|
-
- `cargo run --bin cr -- docs check-md docs/features/common-patterns.md`
|
|
14
|
-
- `cargo run --bin cr -- docs check-md docs/features/enums.md`
|
|
15
|
-
- `cargo run --bin cr -- docs check-md docs/features/error-handling.md`
|
|
16
|
-
- `cargo run --bin cr -- docs check-md docs/features/traits.md`
|
|
17
|
-
- `cargo run --bin cr -- docs check-md docs/features/tuples.md`
|
|
18
|
-
- `cargo run --bin cr -- docs check-md docs/quick-reference.md`
|
|
19
|
-
- `cargo run --bin cr -- docs check-md docs/run/agent-advanced.md`
|
|
20
|
-
|
|
21
|
-
## 知识点
|
|
22
|
-
|
|
23
|
-
- 原生 `match` 可以直接匹配 plain tuple;它不只适用于带 `defenum` 类型信息的 tuple。
|
|
24
|
-
- 文档里的示意片段如果依赖 DOM helper、事件桥接函数或其他未加载上下文,应优先标记为 `cirru.no-check`,否则会被 `check-md` 的 `eval` 阻断。
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
- fixed docs query test to be stable both with and without ~/.config/calcit/docs configured, matching CI runner behavior
|
|
2
|
-
- tightened calcit.core fn helper schemas for &fn:apply / &fn:bind / &fn:map to reduce nested schema-dynamic usage
|
|
3
|
-
- validated with focused docs test, full cargo test, runtime cr calcit/test.cirru, weak-types analyze, and yarn check-all
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# 2026-06-01 00:05 release 0.12.36
|
|
2
|
-
|
|
3
|
-
## Summary
|
|
4
|
-
|
|
5
|
-
- bumped crate and npm package version from `0.12.35` to `0.12.36`
|
|
6
|
-
- kept `ts-src/package.json` aligned with the root npm package metadata
|
|
7
|
-
- prepared the workspace for a release lockfile refresh and tag creation
|
|
8
|
-
|
|
9
|
-
## Why
|
|
10
|
-
|
|
11
|
-
- this release publishes the `update` callback specialization and `not` proc typing fix after the PR checks passed
|
|
12
|
-
- keeping repeated package metadata in sync avoids mismatched npm publish/version outputs during future packaging steps
|
|
13
|
-
|
|
14
|
-
## Validation
|
|
15
|
-
|
|
16
|
-
- `cargo update --workspace`
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
- Documented that `defenum` payloads can reference named structs and applied generic structs.
|
|
2
|
-
- Added runnable examples in `docs/features/enums.md` for plain struct payloads and generic struct payloads.
|
|
3
|
-
- Clarified that `%::` validates struct payload values and generic arity at runtime when constructing enum instances.
|
|
4
|
-
- Validation: `cargo run --bin cr -- demos/calcit.cirru docs check-md docs/features/enums.md`
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# 修改记录: cr analyze weak-types 路径打印格式优化使用点号 (2026-06-12)
|
|
2
|
-
|
|
3
|
-
## 知识点与变动树
|
|
4
|
-
|
|
5
|
-
1. **Weak-type 路径打印格式优化**:
|
|
6
|
-
- 原本 `cr analyze weak-types` 命令输出 AST 节点和声明模式中的位置时会使用大量的方括号 `[` 和 `]`,如 `code[3][1][6]`。
|
|
7
|
-
- 现将其重构并统一为标准点号 (`.`) 路径分隔法(如 `code.3.1.6`),以消除视觉冗余。
|
|
8
|
-
|
|
9
|
-
2. **具体实现 & 多位置对齐**:
|
|
10
|
-
- `format_cirru_path`: 修改它的实现,将其内部的 `[idx]` 拼接机制替换成了 `.idx`,从而全局对齐了 Cirru 节点遍历的 dot 符号写法。
|
|
11
|
-
- `scan_schema_dynamic_annotation`: 内部处理 Fn 类型的索引时,把 `{path}.args[{idx}]` 和 `{path}.type-arg[{idx}]` 修改为点号连接的 `{path}.args.{idx}`、`{path}.type-arg.{idx}`,并同步修改了 `schema.args.{idx}` 语法签名位置。
|
|
12
|
-
|
|
13
|
-
3. **测试与质量验证**:
|
|
14
|
-
- 执行 `cargo test --bin cr` 通过了全部 85 项内置和回归测试(无测试报错)。
|
|
15
|
-
- 实地重新构建 `cargo build --bin cr` 并对大规模项目 `termina/msg-buffer` 完美执行 `analyze weak-types` 分析,其输出完美显示为高清晰度的 `code.6.1.3` 及 `schema.args.0.item.item.value` 点号格式。
|