Skip to main content
v0.14.0
rfc-0020

Language Keyword Rebranding

Summary​

Rename a set of language keywords and builtin identifiers to align with the Metel wind theme. This is a breaking change targeting v0.2 — no edition gating. Three changes are accepted: nope → None, aspect → aspect, and mod → harness (reserved for the future module system). One item is deferred: the .yolo() builtin rename, pending the stdlib migration of Result and Perhaps.

:

Motivation​

The language is named Metel. The current keyword set is a mix of Rust-influenced names (aspect) and prototype-era playful names (nope) from an earlier development phase. A coherent naming strategy signals the language's identity and removes misleading familiarity: aspect in Metel does not carry Rust's semantics (no orphan rules, no lifetime bounds, no dyn dispatch by default), so using the same word invites incorrect assumptions.

Accepted Changes​

1. nope → None​

The Perhaps type's empty variant is renamed from nope (or Perhaps::Nope) to None.

// Before
let x: Perhaps<Int> := nope;

// After
let x: Perhaps<Int> := None;

Rationale: None is the near-universal spelling for an absent optional value (Python, Swift, Kotlin, ML family). nope is memorable but teaches the wrong habit and surprises every developer familiar with typed languages.

:

2. aspect → aspect​

Behaviour contracts are declared with aspect instead of aspect.

// Before
aspect Comparable {
fun compare(other: Self) -> Int;
}

extend Point: Comparable { ... }

// After
aspect Comparable {
fun compare(other: Self) -> Int;
}

extend Point: Comparable { ... }

Rationale: aspect is thematically grounded (an aspect of the wind, a facet of a surface facing the wind) and distinct enough from Rust's aspect to signal semantic differences. It is also unambiguous — unlike face, vane, or current, it does not collide with common field names or control-flow vocabulary.

Impact on RFC-0002: All aspect occurrences in the aspect bound syntax proposal become aspect.

3. harness — reserved for the module system​

Coverage: untestable (see frontmatter). This reserves inactive future module syntax; the module-system mechanism does not exist yet.

harness is reserved as the module declaration keyword, to be activated when the module system (RFC-0009) is implemented.

// Future syntax (RFC-0009)
harness math {
pub fun sqrt(x: Float) -> Float { ... }
}

use math::sqrt;

Rationale: A harness holds and channels multiple components — fitting for a module boundary. It is consistent with the language name and meaningfully different from mod (which carries Rust baggage about visibility and file layout). Reserving the keyword now avoids a parse-level breaking change when the module system lands.

:

Deferred: .yolo() Method Rename​

The .yolo() builtin (if it exists as a method) is deferred. Result and Perhaps are planned for migration into the standard library; the rename will be decided as part of that work, when the full method surface of both types is known.

Candidates noted for that future RFC:

CandidateNotes
.yolo()Self-referential, memorable
.blow()Direct wind action; terse
.squall()Fits panic semantics — sudden, violent
.breeze()Connotation: effortless — fits a "just give me the value" call
.updraft()Evokes surfacing a value

Unchanged Keywords​

All other keywords remain as-is: fun, let, mut, struct, enum, type, match, for, while, return, break, continue, if, else, use, pub, impl, where, in, as. The language is not undergoing a wholesale retheme — only the three items above are changed.

:

Impact Summary​

ItemChangeWhen
nope / Perhaps::Nope→ None / Perhaps::Nonev0.2 (breaking)
aspect keyword→ aspectv0.2 (breaking)
harnessreserved keywordv0.2 (reserved, activated in RFC-0009)
.yolo()deferredstdlib migration phase
File extension .mlnadoptedv0.1

Open Questions​

  1. Some variant — Perhaps::Some is unchanged. If None is accepted, Some stays for consistency with the ML/Kotlin/Swift tradition. No wind-themed rename proposed.

  2. extend Type: Aspect phrasing — impl is unchanged. The full syntax reads extend Point: Comparable, which remains clear. No action needed.

:

Decision​

Outcome: Accepted
Target: v0.2

All three accepted changes shipped in v0.2–v0.4.2:

ChangeShipped
nope / Perhaps::Nope → None / Perhaps::Nonev0.4.2
aspect keyword confirmed (not renamed further)v0.2
harness reserved keywordv0.2 (superseded by RFC-0030 which adopted import instead)

The .yolo() rename remains deferred — no stdlib migration has occurred and the RFC-0015 decision on unwrap syntax is still pending.