Every entry here is a decision, not an oversight: a boundary the compiler enforces loudly today, together with the spelling that works now and the release line on which the boundary moves. When a limitation is lifted, its entry leaves this page in the same release.

Language

A sum type’s fields hold plain values, strings and arrays of those

The field sets of a sum type hold plain values, strings and dynamic arrays of those: numbers, booleans, enumerations, strings, fixed arrays and records of those, other sum types over them, and array of any of these that holds no array, pointer or sum type of its own. A pointer, an array of arrays, a stringbuffer or a borrowed stringpart is refused with analyzer error 5560, which also refuses a case that reaches its own sum type through array of or pointer; a case that holds its own sum type directly is refused with error 5559, because a value would contain itself. Arrays of arrays and a sum type reaching itself need a copy and a release that recurse, which is the next step on the 7.x line and brings trees such as a JSON value. Until then, keep the inner arrays in an array beside the value and store their indexes in the field set.

A sum type is neither generic nor exported

A case with a field set inside a generic type template is refused with analyzer error 5561, and an exp mark on a sum type in a library with error 5580: a library’s contract has no form for a sum type’s cases yet. Declare the sum type over concrete field types, and keep it inside the library, exporting routines over plain values. Both are on the 7.x line.

A case test binds only as the whole condition of an if

value is Case(binding) binds the case’s fields only when the test is the whole condition of an if; anywhere else, in a while condition or under and, it is refused with analyzer error 5574, because the binding has no arm to live in. Test with the wildcard there, value is Case(*), and read the fields with a case statement.

A sum value behind a pointer is matched through a variable

A case arm or an is test that binds cannot match a place reached through a pointer, cell.form with cell : pointer Shape, because the protection that keeps the matched value still inside the arm cannot follow a pointer; analyzer error 5565 says so. Assign the value to a variable and match the variable.

A generic function does not admit a nested subprogram

A function or procedure declared inside a generic function is refused with analyzer error 5424. A specialization clones the generic’s body once per type argument, and a nested subprogram would demand a second specialization authored inside the first. Declare the helper beside the generic function and pass what it needs.

Sort is unstable

Sort is heapsort: equal elements do not keep their relative order. When a report must group by one key and preserve an earlier order inside the group, sort by a compound key instead. A stable variant is on the release-8 line.

Unicode case mapping is one-to-one

Upper and Lower map each code point to exactly one code point: ß stays ß rather than becoming SS, and the Greek final sigma is not selected by position. The one-to-many and positional rules are on the release-8 line.

Build and run

Debug builds walk s[i] loops quadratically under utf-8

Under the utf-8 encoding, a hand-written while loop that indexes s[i] re-measures the string’s prefix on every access in a debug build — O(N²) for the whole walk. The taught idiom is free of this on every tier:

for c in s do

Release builds optimize the indexed walk; the debug behaviour is the cost of keeping that tier’s code shaped exactly like the source.

A checked build’s memory grows with the run

The checked build keeps every cell a program releases, poisoned, so that a read through a pointer to it is recognized; blocks it can serve no further cell from are quarantined for the rest of the run. Its memory therefore grows with the work the program does, however carefully the program releases what it owns. A fixed-arena program sized with its release build exhausts that arena under a checked build, and the failure report says so in a closing note. Size a checked run for the whole run, or give it the hosted heap; the guarantee is not traded for a smaller budget. See what the checked tier costs in memory.

Tooling and platforms

On Darwin/ARM64 the compiler cross-compiles both Linux targets, but linking is not available — the binutils integration is bound to Linux hosts. Linux containers on macOS build and run everything, and the container image is the supported macOS road today. macOS as a full host is the headline of release 8.

JSON has no library surface yet

JSON was a named non-goal of the 6.x line and is planned as a release-7 citizen with its own design pass. Starting programs has its surface: the process unit’s Spawn, described in scripting.