Skip to content

fix(typecheck): make len/show truly polymorphic schemes (Refs #122)#125

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/polymorphic-len-show-scheme
May 16, 2026
Merged

fix(typecheck): make len/show truly polymorphic schemes (Refs #122)#125
hyperpolymath merged 1 commit into
mainfrom
fix/polymorphic-len-show-scheme

Conversation

@hyperpolymath
Copy link
Copy Markdown
Owner

fix(typecheck): make len/show truly polymorphic schemes (Refs #122)

v2.5/v2.6 (merged in #123) bound len and show via bind_var as
'a -> Int / 'a -> String using a SINGLE SHARED unification tyvar,
not a generalized scheme. The first use pinned it (e.g. len(name)
=> tv:=String), so a later len(ids) on [String] failed with
Unify TypeMismatch (String, Array[String]). This blocked any program
mixing len over strings and arrays — notably the ubicity#30 storage
port (diagnosed to root cause via an sb7 minimal repro).

Bind both as generalized schemes via bind_scheme (poly1 helper:
fresh tyvar quantified in sc_tyvars, instantiated per call site), so
len/show are properly polymorphic.

Verified green prior to an environment loss (WSL /tmp wipe): the sb7
repro and the full ubicity storage.affine compiled; the 5 Deno-ESM
harnesses and dune runtest (214 tests, unchanged — same 2 pre-existing
E2E Node-CJS vscode failures) all passed. CI re-verifies the build here.

Refs #122 (follow-up to #123; unblocks ubicity#30).

Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com

v2.5/v2.6 (merged in #123) bound `len` and `show` via `bind_var` as
`'a -> Int` / `'a -> String` using a SINGLE SHARED unification tyvar,
not a generalized scheme. The first use pinned it (e.g. `len(name)`
=> tv:=String), so a later `len(ids)` on `[String]` failed with
`Unify TypeMismatch (String, Array[String])`. This blocked any program
mixing `len` over strings and arrays — notably the ubicity#30 storage
port (diagnosed to root cause via an `sb7` minimal repro).

Bind both as generalized schemes via `bind_scheme` (`poly1` helper:
fresh tyvar quantified in `sc_tyvars`, instantiated per call site), so
`len`/`show` are properly polymorphic.

Verified green prior to an environment loss (WSL /tmp wipe): the sb7
repro and the full ubicity storage.affine compiled; the 5 Deno-ESM
harnesses and `dune runtest` (214 tests, unchanged — same 2 pre-existing
E2E Node-CJS vscode failures) all passed. CI re-verifies the build here.

Refs #122 (follow-up to #123; unblocks ubicity#30).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@hyperpolymath hyperpolymath merged commit 1045d1a into main May 16, 2026
20 of 21 checks passed
@hyperpolymath hyperpolymath deleted the fix/polymorphic-len-show-scheme branch May 16, 2026 15:09
hyperpolymath added a commit that referenced this pull request May 16, 2026
Synthesised class methods are `async` and an associated cross-method
call lowers to `(await this.m(...))`. But the expression-position IIFE
wrappers (block / try / match / let / return) were always plain
`(() => { ... })()` — so a contained `await` produced
`SyntaxError: Unexpected reserved word` (hit by ubicity's
`loadAllExperiences`: a try whose body `await this.ensureDirectories()`).

Add `ctx.in_async` (set while emitting a synthesised `async` method
body) and an `iife` helper: in async context the wrapper is
`(await (async () => { ... })())`, otherwise the plain form. Applied to
gen_block_expr / gen_try / gen_match / ExprLet / ExprReturn /
ExprUnsafe. Free functions, constructors and module top-level stay
non-async (they never emit an awaited associated call).

Verified: affinescript `dune build` clean, `dune runtest` 214 tests /
same 2 pre-existing E2E Node-CJS vscode failures (zero regressions),
5 Deno-ESM harnesses green; the regenerated ubicity src/storage.js now
parses and `deno task test` is **44 passed / 0 failed** (the full suite,
incl. the .test.js variants that import the migrated storage.js via
mapper/privacy/export).

Refs #122 (follow-up to #123/#125; completes the ubicity#30 consumer).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant