Mica 7.0.1 ships one day after 7.0.0, and the speed is the point. Writing the new tutorial series against the freshly released compiler surfaced two places where the language allowed silence it should not, and a tightening like that costs the least it will ever cost on the day after a debut. So it ships now.
A case answers every value
A case statement must say what happens to every value of its selector,
and from 7.0.1 the compiler checks that it does. Over a bounded domain —
an enum, a bool, a subrange, a char, an integer width through 32 bits —
the arms cover the domain or the statement carries an else:
analyzer error 5285: the case over 'Color' covers 2 of the 3 values of its domain and has no else: a case must say what happens to every value — cover the domain or add an elseA 64-bit selector needs an else unless its range arms provably tile the
whole domain. A masked case over a bitset always carries its default arm
— an else or a full don’t-care pattern — because coverage by masks is
not provable, and the datasheet tables the masked case photographs write
their default row anyway.
The rule cuts both ways, deliberately. An else behind arms that already
cover the whole domain is refused — it can never fire — and that refusal
is the feature’s sharpest edge: add a member to an enum later, and every
total case over it stops compiling until each site answers the new
member by name. The silent-growth bug, where a new variant slides into a
forgotten default arm, is not available.
A subrange keeps the promise its declaration makes: a case over
WorkHour = 8..17 whose arms tile 8..17 needs no else. Naming your
domain buys dispatch over exactly it.
This is a breaking change, taken on purpose: a program with a partial
case that compiled yesterday is refused today, with the refusal counting
exactly what is missing. Across our entire test suite of over eleven
thousand runs, precisely one program needed a one-line fix — measured on
the day the rule landed, which is why it landed on that day.
Three spellings, one answer
<>, ==, and != are not operators in Mica, and each now answers with
the facts instead of a puzzle:
scanner error 1041: '!=' is not an operator in Mica: '=' compares for equality and '#' for inequalityThe scanner then reads the operator that was meant, so one diagnostic reports, the rest of the file is still analysed, and no cascade of parse errors chases a stranded token.
Getting it
The download page has the 7.0.1 packages for both
architectures, and apt changelog mica tells this release’s story from
the package itself. The typesystem reference
carries the totality rule; the
choices tutorial teaches it where it first bites.