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 else

A 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 inequality

The 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.