Skip to content

Specification §25

Rejected decisions

language-design.md §25 · 21 lines · 2 min read

Capabilities considered and consciously discarded, recorded here so they do not resurface in the future. Unlike the open ones (not yet decided), these are closed against. (Some detail rejections have context in their own section of origin: Qwik’s resumability in section 20, the Plan9-like normalized assembly syntax in section 18.)

Consciously out, for two converging reasons. The first: the reverse compensation is buildable with defer inside the catch (registers the undo on the error path; the defer LIFO gives the reverse order), so it is not a primitive. The second: the durable version (compensating after the node crashes, when the stack is gone) requires persisted external state (a database, a saga log), explicitly out of the language’s scope. It is buildable in a library over what already exists; it does not become a construct.

Two @shared were considered, and both came out. The first: shared memory between processes (section 5); every use case is solved by @transfer plus a channel, without opening a vector of corruption between heaps, and the pattern is a process that holds the data and serves it via a channel. The second: a marker in the UI extension; since @server/@client became restrictions (you annotate only what is bound to one side, and the rest crosses by default), a third marker “runs on both” would be redundant, because “crossing” is already the default, not a state to mark.

Considered early in the design of @supervisor (section 8) as a defer that would only run on the error path. Discarded in favor of the catch system: a defer inside the catch is already “defer on failure”, because the catch is the error path, so any defer there only runs when something fails. No new construct needed.

The transpile of the UI extension goes in one direction only (our .mkoui to JS, section 20). The inverse, compiling JS/TS to our language or native, was discarded on purpose: it would be a Trojan horse that hijacks the language’s purpose (the JS community would use it only as “JS compiled to native”, ignoring the rest), besides requiring a whole TypeScript front-end, at enormous cost.