Reserved keywords
Lexer-level reserved words cannot be used as identifiers. The table below is the complete set, generated from the grammar’s keyword table; a keyword carrying a clarifying note shows it inline.
| Keyword | Note |
|---|---|
abstract | RFD 0027 D6 — substrate-neutral declaration modifier: no direct instances. Legal on metatype declarations (every introduced type is abstract) and per-type on concept declarations (pub abstract type Vehicle). Instantiability for the OE1327 coverage gate is NOT-abstract — the compiler reads this flag, never a user axis name. |
across | |
acyclic | |
all_shortest | |
always | |
ambiguous | |
any | |
as | |
as_of | Bitemporal time-travel query clause. pub query foo() -> T as_of <expr> filters events by transaction time at query execution. Wire-encoded as an Option<CborValue> on QueryDeclBody. |
asc | |
assert | |
async | |
at | |
await | |
both | |
box | |
box_minus | |
box_plus | |
bridge | |
by | |
check | |
const | |
delete | |
derive | |
desc | |
detach | |
diamond | |
diamond_minus | |
diamond_plus | |
do | |
during | |
else | |
emit | |
enum | |
ever | |
except | |
exists | |
expect | |
fact | |
false | |
fixed | RFD 0027 D6 — substrate-neutral declaration modifier: classification decided at construction. Metatype-level only (pub fixed metatype kind = { … };). insert iof / delete iof against a type introduced by a fixed metatype refuses (OE0234); construction is unaffected. Dynamic classification is the default; fixed is the opt-in restriction. |
fixture | |
fn | |
for | |
forall | |
forget | |
from | |
group | |
having | |
if | |
iff | |
impl | |
in | |
insert | |
intersect | |
into | |
iof | |
is | |
k_shortest | |
let | |
limit | |
logic | |
macro | |
mapping | |
match | |
meta | |
metarel | |
metatype | |
metaxis | |
mod | |
mut | |
mutate | |
not | |
not_fact | RFD 0010 — strong (classical) negation of facts. Distinct from not (NAF in rule bodies, no wire trace) — pub not_fact P(x) is a declaration that lowers to an IofRefutation / RelationTupleRefutation axiom event. |
offset | |
on | |
optional | |
or | |
path | |
pub | |
query | |
require | |
return | |
select | |
Self | |
self | |
set | |
shortest | |
simple | |
since | |
sink | |
specializes | |
standpoint | |
struct | |
test | |
timeout | |
trail | |
trait | |
true | |
union | |
unknown | |
unsafe | |
until | |
update | |
upsert | |
use | |
walk | |
where | |
with |
Reserved for future use (parse but currently unimplemented): async, await, do, or.
Plus type-level constants and primordial types (always in scope, see the standard library): Top, ⊤, Bot, ⊥, Nat, Int, Real, Decimal, Money, Bool, String, Date, Time, DateTime, Duration.
Formerly reserved. mode and ordered are no longer keywords (RFD 0031 D7): both were vestigial reservations with no parser rule consuming them, and mode blocked a common vocabulary word (pub metatype mode). The documented graph-traversal mode clause (mode-spec, the rule atom) is recognized contextually in the role-step position when that surface lands, never as a reserved word. The Allen interval relations (before, meets, met_by, overlaps, overlapped_by, contains, starts, started_by, finishes, finished_by) are no longer keywords; Allen interval algebra ships as std::allen library vocabulary (RFD 0024), freeing those words for modelers. during remains reserved — it is the temporal-qualifier keyword (at | during | since), not an Allen operator.
Not reserved at lexer level — introducer names are ordinary identifiers: type, rel, and any vocabulary-introduced metatype or metarel name (UFO’s kind, subkind, role, phase, category, relator, mixin, mediation, material, BFO’s class, …). These are contextual identifiers resolved per name resolution against the pub metatype / pub metarel declarations visible in scope — names come from vocabulary packages, declared in the using package or imported from an external one; an unresolved introducer is OE0605 / OE0606. type and rel are not ambient: they are declared in std::core (see the standard library) and brought into scope by use std::core::{type, rel} or a [package].prelude entry (RFD 0038), exactly like any vocabulary. No vocabulary — not even the std::core baseline — ships ambient.
Compiler-known attribute names (reserved against macro shadowing, but not lexer keywords) live in a separate list — see annotations.