v4.2.3
Released 2026-05-24 · GitHub release · CHANGELOG
Type-name passthrough is now total, and statically-typed targets enforce typed parameters. Surface syntax is unchanged; the behavior change affects only sources that relied on the old portable-alias translation.
Highlights
- Type names pass through verbatim on every target (#37) — framec no longer
rewrites a portable alias to a per-backend native type (
int→i64,str→String, …); it copies the type name you write straight into the output, honoring Frame’s “no type system — type names pass through” contract. Structural transforms (Rust borrow→owned widening, Kotlinvoid→Unit, C runtime containers) are unaffected. - E606 — statically-typed targets require typed parameters (#37) — on C, C++, Java, Go, Rust, C#, Kotlin, and Swift, an untyped event / handler / state / lifecycle parameter is now a hard error with a fix-it.
- Default-target warning +
FRAMEC_DEFAULT_TARGET(#36) — framec warns once before falling back topython_3, and the env var sets the implicit target. - WASM build /
@frame-lang/framec-wasm— the library builds forwasm32; the wasm-bindgen entry point lives in a separateframec-wasmcrate.
Action required
Statically-typed targets (C, C++, Java, Go, Rust, C#, Kotlin, Swift): write
your target’s own type names instead of portable aliases — e.g. x: i64
(Rust), x: long (Java), x: std::string (C++). Dynamic targets (Python,
JS, TS, Ruby, Lua, PHP, Dart, GDScript) are unaffected.
4.2.2 was tagged but never released — its commit tripped the CI formatting gate; 4.2.3 is the same content cut from a clean commit.