Skip to main content
v0.13.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: nopeNone, aspectaspect, and modharness (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. nopeNone

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

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::NopeNone / Perhaps::Nonev0.2 (breaking)
aspect keywordaspectv0.2 (breaking)
harnessreserved keywordv0.2 (reserved, activated in RFC-0009)
.yolo()deferredstdlib migration phase
File extension .mlnadoptedv0.1

Open Questions

  1. Some variantPerhaps::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 phrasingimpl 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::NopeNone / 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.