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:
| Candidate | Notes |
|---|---|
.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
| Item | Change | When |
|---|---|---|
nope / Perhaps::Nope | → None / Perhaps::None | v0.2 (breaking) |
aspect keyword | → aspect | v0.2 (breaking) |
harness | reserved keyword | v0.2 (reserved, activated in RFC-0009) |
.yolo() | deferred | stdlib migration phase |
File extension .mln | adopted | v0.1 |
Open Questions
-
Somevariant —Perhaps::Someis unchanged. IfNoneis accepted,Somestays for consistency with the ML/Kotlin/Swift tradition. No wind-themed rename proposed. -
extend Type: Aspectphrasing —implis unchanged. The full syntax readsextend 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:
| Change | Shipped |
|---|---|
nope / Perhaps::Nope → None / Perhaps::None | v0.4.2 |
aspect keyword confirmed (not renamed further) | v0.2 |
harness reserved keyword | v0.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.