<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://metel-lang.org/blog</id>
    <title>Metel Language Wiki Blog</title>
    <updated>2026-07-15T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://metel-lang.org/blog"/>
    <subtitle>Metel Language Wiki Blog</subtitle>
    <icon>https://metel-lang.org/img/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Introducing Metel]]></title>
        <id>https://metel-lang.org/blog/introducing-metel</id>
        <link href="https://metel-lang.org/blog/introducing-metel"/>
        <updated>2026-07-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[You surely know as well as I do that the world does not need another amateur C++/Rust/Zig/Go/Odin clone, so the honest introduction is this: I started building Metel because I wanted to build a programming language.]]></summary>
        <content type="html"><![CDATA[<p>You surely know as well as I do that the world does not need another amateur C++/Rust/Zig/Go/Odin clone, so the honest introduction is this: I started building Metel because I wanted to build a programming language.</p>
<p>Here's a taste of what that turned into:</p>
<div class="language-metel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#2d2a26;--prism-background-color:#f0e9dc"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-metel codeBlock_bY9V thin-scrollbar" style="color:#2d2a26;background-color:#f0e9dc"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#2d2a26"><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">main</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> name </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token string" style="color:#17624e">"Metel"</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> answer</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Perhaps</span><span class="token operator" style="color:#4f463c">&lt;</span><span class="token plain">i64</span><span class="token operator" style="color:#4f463c">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Perhaps</span><span class="token operator" style="color:#4f463c">::</span><span class="token type" style="color:#255fa2;font-weight:600">Some</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> value</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token number" style="color:#8a5a00">42</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token function" style="color:#b63d66;font-weight:600">println</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token string" style="color:#17624e">"</span><span class="token string interpolation punctuation" style="color:#4f463c">${</span><span class="token string interpolation expression" style="color:#9f2f57">name</span><span class="token string interpolation punctuation" style="color:#4f463c">}</span><span class="token string" style="color:#17624e"> says the answer is </span><span class="token string interpolation punctuation" style="color:#4f463c">${</span><span class="token string interpolation expression" style="color:#9f2f57">answer</span><span class="token string interpolation expression punctuation" style="color:#4f463c">.</span><span class="token string interpolation expression function" style="color:#b63d66;font-weight:600">yolo</span><span class="token string interpolation expression punctuation" style="color:#4f463c">(</span><span class="token string interpolation expression punctuation" style="color:#4f463c">)</span><span class="token string interpolation punctuation" style="color:#4f463c">}</span><span class="token string" style="color:#17624e">"</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><br></div></code></pre></div></div>
<p><code>.yolo()</code> is not a typo — more on that name below.</p>
<p>At first, the goal was small and personal: a statically typed, Rust-influenced interpreted language with a garbage collector, <strong>built to learn rather than to ship</strong>.</p>
<p>That version did not stay small for long. Once the basics existed, I started reading more seriously about memory safety, type systems, ownership, regions, linear capabilities, structural typing, and brand-like identity systems — Federico Bruzzone's <a href="https://federicobruzzone.github.io/posts/eter/a-friendly-tour-of-substructural-uniqueness-ownership-and-capabilities-types-and-more.html" target="_blank" rel="noopener noreferrer" class="">A friendly tour of substructural, uniqueness, ownership and capabilities types (and more)</a> was one of the pieces that pushed me deeper in that direction.</p>
<p>What struck me reading that material was how vast it was, and how much of it is already proven out somewhere — region calculus, explicit allocators, branded identity, structural typing, each already shipped in some corner of some language (more on each below). Almost none of the individual ideas is unclaimed.</p>
<p>What is still genuinely open is how much room is left in combining them. Each already solves its own problem well, in its own language; what's still unexplored is whether several of these already-researched concepts can hold together at once, in a single language, rather than each staying in a different one.</p>
<p>There's also a more immediate motivation: mainstream languages are still actively floating new proposals for these exact problems — Rust's own Niko Matsakis has one for <a href="https://smallcultfollowing.com/babysteps/blog/2021/11/05/view-types/" target="_blank" rel="noopener noreferrer" class="">view types</a> and, separately, one for a <a href="https://smallcultfollowing.com/babysteps/blog/2024/06/02/the-borrow-checker-within/" target="_blank" rel="noopener noreferrer" class="">place-based lifetime syntax</a> aimed at teachability. Watching that, I realized I could try my hand at the same problems myself, in a language of my own.</p>
<p>The project slowly stopped being "my small Rust-like interpreter" and became a different question — not "how do I clone Rust" and not "what entirely new idea can I invent," but something in between: what does a language look like that takes several of these already-proven ideas seriously and actually puts them together? That question is what Metel is now.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-shape-of-the-project">The Shape Of The Project<a href="https://metel-lang.org/blog/introducing-metel#the-shape-of-the-project" class="hash-link" aria-label="Direct link to The Shape Of The Project" title="Direct link to The Shape Of The Project" translate="no">​</a></h2>
<p>Metel is a personal project. <strong>There is no team, no company, and no roadmap</strong> driven by anything other than my own curiosity — I work on it because I want to know whether these ideas actually fit together, not because it needs to ship or win adoption. It is not trying to beat Rust, Zig, or C++ at their own game, and it is not production-ready. It is built around a few bets I take seriously:</p>
<ul>
<li class="">Allocation should be explicit when it matters;</li>
<li class="">Resource usage should be visible in the type system;</li>
<li class="">Ordinary code should still read like ordinary modern code;</li>
<li class="">Lifetimes should be easy to understand and to reason about — for now that means treating bindings themselves as lifetime anchors;</li>
<li class="">Ownership should eventually work over structured values, not only whole values.</li>
</ul>
<p>Allocators were the first piece I built, but they turned out to be just the first use case of a broader substrate — structural shape, field-sensitive ownership, brand-like identity, lifetimes named after real bindings. That's too much for one post, so this is the first in a series: an overview here, then a dedicated post on <strong>records</strong> — the piece I currently find most worth pursuing — once that design is further along.</p>
<p>One thing I want to be explicit about upfront: <strong>Metel is heavily AI-assisted</strong>. The implementation of the interpreter especially has been built with a lot of help from AI tools.
The design work however, while also AI-assisted, is very carefully curated and reviewed in detail. Whether that puts the result closer to careful engineering or vibe-coded slop, I'll let you be the judge – but I'd like to think closer to the middle than to the latter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-metel">Why Metel?<a href="https://metel-lang.org/blog/introducing-metel#why-metel" class="hash-link" aria-label="Direct link to Why Metel?" title="Direct link to Why Metel?" translate="no">​</a></h2>
<p>The name has had two prior lives, and neither one explains itself, so it's worth telling.</p>
<p>The project started as <strong>Yoloscript</strong>, with one deliberately silly objective: a language where <code>.yolo()</code> was the equivalent of <code>unwrap()</code>. That objective actually survived every rewrite since — <strong><code>.yolo()</code> is still there today</strong>, the way you unwrap a <code>Result</code> or a <code>Perhaps</code>.</p>
<p>The next iteration tried to be a mix of Rust and Go, and I named it <strong>Gust</strong> — which felt clever for about a week, until I realized I was nowhere near the first person to think "a Rust/Go hybrid should be called Gust." A fair number of other projects had already landed on the same name. That was a small crisis: I'd already grown attached to the wind theme Gust had put in my head, and I wasn't ready to let it go.</p>
<p>After a bit of wandering, I landed on <strong>Metel</strong> — Russian for "blizzard," and the title of a poem by Sergei Yesenin, one of my late father's favorite poets:</p>
<blockquote>
<p>Прядите, дни, свою былую пряжу...</p>
<p><em>(Spin on, you days, your age-old thread...)</em></p>
<p>— Sergei Yesenin, "Метель" (1924)</p>
</blockquote>
<p>It kept the wind, carried more weight than a pun, and it's the one that stuck.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-already-exists">What Already Exists<a href="https://metel-lang.org/blog/introducing-metel#what-already-exists" class="hash-link" aria-label="Direct link to What Already Exists" title="Direct link to What Already Exists" translate="no">​</a></h2>
<p>Metel is already in a pretty good shape. There is a real interpreter, a module system, generics, aspects, exhaustive pattern matching, a standard library with <code>Perhaps</code>, <code>Result</code>, <code>List</code>, strings, host-backed <code>fs</code>/<code>env</code>/<code>process</code> modules, and a growing specification and RFC process. Recent work has also moved a large batch of type-system and surface-language ideas into the implementation: negative bounds and impls, associated types, bottom type <code>!</code>, structural aspect bounds, coherence checks, <code>return</code>/<code>break</code>/<code>continue</code> as expressions, and the newer <code>public</code>/<code>var</code>/<code>extend</code> surface syntax. For example, this is ordinary Metel today:</p>
<div class="language-metel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#2d2a26;--prism-background-color:#f0e9dc"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-metel codeBlock_bY9V thin-scrollbar" style="color:#2d2a26;background-color:#f0e9dc"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#2d2a26"><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">aspect</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Greet</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">greet</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token plain">self</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">-&gt;</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">String</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">struct</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> name</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">extend</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Person</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Greet</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">greet</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token plain">self</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">-&gt;</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> </span><span class="token string" style="color:#17624e">"Hello, </span><span class="token string interpolation punctuation" style="color:#4f463c">${</span><span class="token string interpolation expression" style="color:#9f2f57">self</span><span class="token string interpolation expression punctuation" style="color:#4f463c">.</span><span class="token string interpolation expression" style="color:#9f2f57">name</span><span class="token string interpolation punctuation" style="color:#4f463c">}</span><span class="token string" style="color:#17624e">!"</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">rename</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">var</span><span class="token plain"> self</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> new_name</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">String</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> self</span><span class="token punctuation" style="color:#4f463c">.</span><span class="token plain">name </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> new_name</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> greet_all</span><span class="token operator" style="color:#4f463c">&lt;</span><span class="token type" style="color:#255fa2;font-weight:600">T</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Greet</span><span class="token operator" style="color:#4f463c">&gt;</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">people</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">T</span><span class="token punctuation" style="color:#4f463c">[</span><span class="token punctuation" style="color:#4f463c">]</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">p </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">in</span><span class="token plain"> people</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">println</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#4f463c">.</span><span class="token function" style="color:#b63d66;font-weight:600">greet</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">main</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">-&gt;</span><span class="token plain"> i64 </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">var</span><span class="token plain"> ada </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> name</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token string" style="color:#17624e">"Ada"</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> ada_ref</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">var</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Person</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">var</span><span class="token plain"> ada</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    ada_ref</span><span class="token punctuation" style="color:#4f463c">.</span><span class="token function" style="color:#b63d66;font-weight:600">rename</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token string" style="color:#17624e">"Ada Lovelace"</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain">   </span><span class="token comment" style="color:#6f6559;font-style:italic">// auto-deref through &amp;var — writes back to ada</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token function" style="color:#b63d66;font-weight:600">greet_all</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token punctuation" style="color:#4f463c">[</span><span class="token plain">ada</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> name</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token string" style="color:#17624e">"Grace"</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token punctuation" style="color:#4f463c">]</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">return</span><span class="token plain"> </span><span class="token number" style="color:#8a5a00">0</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><br></div></code></pre></div></div>
<p>The deepest ownership and allocation model is still ahead of the runtime. <strong>The interpreter is a feedback mechanism, not a finished semantic engine</strong>, but it is enough machinery for syntax, modules, generics, aspects, and standard-library code to push back on design ideas before they are written down in stone.</p>
<p>That means that all of the ideas described in this article are subject to change. Any feedback on them is welcome and may very well make me change my mind on some things.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-foundation-allocators-and-lifetimes">The Foundation: Allocators And Lifetimes<a href="https://metel-lang.org/blog/introducing-metel#the-foundation-allocators-and-lifetimes" class="hash-link" aria-label="Direct link to The Foundation: Allocators And Lifetimes" title="Direct link to The Foundation: Allocators And Lifetimes" translate="no">​</a></h2>
<p>Two questions that many systems languages tie tightly together, Metel keeps apart: where does a value live, and for how long is a reference to it valid? Allocators answer the first, lifetime anchors answer the second. Both are background for the main event, so I will keep them short.</p>
<p><strong>Allocators</strong> make storage an explicit program-level choice. <a href="https://ziglang.org/documentation/master/#Choosing-an-Allocator" target="_blank" rel="noopener noreferrer" class="">Zig</a> and <a href="https://odin-lang.org/docs/overview/#allocators" target="_blank" rel="noopener noreferrer" class="">Odin</a> already make allocator-passing normal, and Rust has an experimental <a href="https://doc.rust-lang.org/std/alloc/trait.Allocator.html" target="_blank" rel="noopener noreferrer" class=""><code>Allocator</code> API</a>. Metel's bet is that allocator identity should be visible in the language's own type and syntax rules, not only in library APIs, because allocator choice is often part of an invariant a value's type should preserve:</p>
<div class="language-metel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#2d2a26;--prism-background-color:#f0e9dc"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-metel codeBlock_bY9V thin-scrollbar" style="color:#2d2a26;background-color:#f0e9dc"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#2d2a26"><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> user </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">@</span><span class="token type" style="color:#255fa2;font-weight:600">Heap</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> name</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token string" style="color:#17624e">"Ada"</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">identity</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">value</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">@</span><span class="token type" style="color:#255fa2;font-weight:600">Node</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">-&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">@</span><span class="token type" style="color:#255fa2;font-weight:600">Node</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> value </span><span class="token punctuation" style="color:#4f463c">}</span><br></div></code></pre></div></div>
<p><strong>Lifetimes</strong> in Metel anchor to a binding that already exists in the program, rather than a fresh abstract variable (<code>'a</code>). The idea descends from Tofte and Talpin's <a href="https://dl.acm.org/doi/10.1145/174675.177855" target="_blank" rel="noopener noreferrer" class="">region calculus</a> and <a href="https://cyclone.thelanguage.org/wiki/Introduction%20to%20Regions/" target="_blank" rel="noopener noreferrer" class="">Cyclone</a>'s named regions, the direct ancestor of <a href="https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" target="_blank" rel="noopener noreferrer" class="">Rust</a>'s lifetimes; what Metel varies is only the spelling:</p>
<div class="language-metel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#2d2a26;--prism-background-color:#f0e9dc"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-metel codeBlock_bY9V thin-scrollbar" style="color:#2d2a26;background-color:#f0e9dc"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#2d2a26"><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> </span><span class="token function" style="color:#b63d66;font-weight:600">first</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">x</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token type" style="color:#255fa2;font-weight:600">Str</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> y</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token type" style="color:#255fa2;font-weight:600">Str</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">-&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token plain">x </span><span class="token type" style="color:#255fa2;font-weight:600">Str</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    x</span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><br></div></code></pre></div></div>
<p>Both code samples above are design sketches, not executable Metel — the allocator and
lifetime-anchor cluster is accepted design, not yet built. The name in the return type
refers to a real binding in the function. The common case should still avoid
annotation — <strong>treat this as an ergonomic variant on old machinery, not a new
capability</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="records-and-field-sensitive-ownership">Records And Field-Sensitive Ownership<a href="https://metel-lang.org/blog/introducing-metel#records-and-field-sensitive-ownership" class="hash-link" aria-label="Direct link to Records And Field-Sensitive Ownership" title="Direct link to Records And Field-Sensitive Ownership" translate="no">​</a></h2>
<p>This is the first post in a series, and records are the idea I want to introduce here rather than fully argue for — they get a dedicated, more in-depth post of their own, because they are the part of Metel I find most worth pursuing.
They may let <strong>nominal and structural typing coexist</strong> without choosing one as the whole language, and they are the closest Metel gets to a genuinely open problem rather than re-treading solved ground. What follows is the shape of the idea, not the full case for it.</p>
<p>Purely structural systems are powerful — <a href="https://www.typescriptlang.org/docs/handbook/type-compatibility.html" target="_blank" rel="noopener noreferrer" class="">TypeScript</a> is built around structural compatibility, and <a href="https://book.purescript.org/chapter3.html" target="_blank" rel="noopener noreferrer" class="">PureScript</a> has records as a standard feature — but structural compatibility can also <strong>blur distinctions that matter</strong>. That is one reason TypeScript developers reach for <a href="https://www.learningtypescript.com/articles/branded-types" target="_blank" rel="noopener noreferrer" class="">branded types</a> and other <a href="https://www.totaltypescript.com/workshops/advanced-typescript-patterns/branded-types/what-is-a-branded-type" target="_blank" rel="noopener noreferrer" class="">nominal-typing patterns</a>.</p>
<p>What I want to explore in Metel is narrower: <strong>ordinary nominal types, plus an explicit structural <code>record</code> view</strong> when the checker needs to reason about fields. The bridge would be opt-in — a nominal type can derive <code>ToRecord</code> to expose its fields as a structural row, and <code>FromRecord</code> to allow reconstruction from the full row again:</p>
<div class="language-metel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#2d2a26;--prism-background-color:#f0e9dc"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-metel codeBlock_bY9V thin-scrollbar" style="color:#2d2a26;background-color:#f0e9dc"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#2d2a26"><span class="token operator" style="color:#4f463c">@</span><span class="token function" style="color:#b63d66;font-weight:600">derive</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token type" style="color:#255fa2;font-weight:600">ToRecord</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">FromRecord</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">struct</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Handle</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    fd</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> i32</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    label</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">String</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> handle </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Handle</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> fd</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token number" style="color:#8a5a00">3</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> label</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token string" style="color:#17624e">"log"</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> row</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">record</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"> fd</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> i32</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> label</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> handle</span><span class="token punctuation" style="color:#4f463c">.</span><span class="token function" style="color:#b63d66;font-weight:600">to_record</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> handle2 </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">Handle</span><span class="token operator" style="color:#4f463c">::</span><span class="token function" style="color:#b63d66;font-weight:600">from_record</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">row</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><br></div></code></pre></div></div>
<p>Those two aspects are deliberately separate: types with constructor-checked invariants may want <code>ToRecord</code> without derived <code>FromRecord</code>.</p>
<p>The real use case is <strong>partial consumption</strong> — a program needs to say: this field is gone, these fields are still here.</p>
<div class="language-metel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#2d2a26;--prism-background-color:#f0e9dc"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-metel codeBlock_bY9V thin-scrollbar" style="color:#2d2a26;background-color:#f0e9dc"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#2d2a26"><span class="token operator" style="color:#4f463c">@</span><span class="token function" style="color:#b63d66;font-weight:600">derive</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token type" style="color:#255fa2;font-weight:600">ToRecord</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">FromRecord</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">struct</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">RcBox</span><span class="token operator" style="color:#4f463c">&lt;</span><span class="token type" style="color:#255fa2;font-weight:600">T</span><span class="token operator" style="color:#4f463c">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    strong</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">AtomicUsize</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    weak</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">AtomicUsize</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    value</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">T</span><span class="token punctuation" style="color:#4f463c">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">fun</span><span class="token plain"> drop_value</span><span class="token operator" style="color:#4f463c">&lt;</span><span class="token type" style="color:#255fa2;font-weight:600">T</span><span class="token operator" style="color:#4f463c">&gt;</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">cell</span><span class="token operator" style="color:#4f463c">:</span><span class="token plain"> </span><span class="token operator" style="color:#4f463c">&amp;</span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">var</span><span class="token plain"> </span><span class="token type" style="color:#255fa2;font-weight:600">RcBox</span><span class="token operator" style="color:#4f463c">&lt;</span><span class="token type" style="color:#255fa2;font-weight:600">T</span><span class="token operator" style="color:#4f463c">&gt;</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#4f463c">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> view </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> cell</span><span class="token punctuation" style="color:#4f463c">.</span><span class="token function" style="color:#b63d66;font-weight:600">to_record_mut</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">let</span><span class="token plain"> value </span><span class="token operator" style="color:#4f463c">=</span><span class="token plain"> </span><span class="token keyword" style="color:#174474;font-style:normal;font-weight:600">move</span><span class="token plain"> view</span><span class="token punctuation" style="color:#4f463c">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token function" style="color:#b63d66;font-weight:600">drop</span><span class="token punctuation" style="color:#4f463c">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#4f463c">)</span><span class="token punctuation" style="color:#4f463c">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain">    </span><span class="token comment" style="color:#6f6559;font-style:italic">// view is now `&amp;var record { strong: AtomicUsize, weak: AtomicUsize }`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#2d2a26"><span class="token plain"></span><span class="token punctuation" style="color:#4f463c">}</span><br></div></code></pre></div></div>
<p>This is a design sketch, not executable Metel. The motivating case is <code>Rc</code>/<code>Arc</code>-style teardown: the payload may need to be destroyed when the last strong reference disappears, while the allocation and counters remain alive until weak references are gone too — exactly the kind of logic visible in the standard library's actual <a href="https://doc.rust-lang.org/src/alloc/rc.rs.html#284-288" target="_blank" rel="noopener noreferrer" class=""><code>RcInner</code>/<code>Rc::drop_slow</code></a> and <a href="https://doc.rust-lang.org/src/alloc/sync.rs.html#387-391" target="_blank" rel="noopener noreferrer" class=""><code>ArcInner</code>/<code>Arc::drop_slow</code></a> layouts. <strong>The nominal type remains the normal interface, and the structural view appears only when the program deliberately takes a value apart.</strong></p>
<p>This is where Metel is closest to an open problem. The same need — letting a function say "I only touch these fields" so that a partial move or a disjoint borrow can type-check — is exactly what Rust compiler team member Niko Matsakis's <a href="https://smallcultfollowing.com/babysteps/blog/2021/11/05/view-types/" target="_blank" rel="noopener noreferrer" class="">"view types" idea</a> is reaching for. It is a personal exploration on his blog, not an accepted RFC or a language feature Rust has committed to, but it names the same open problem Rust's affine-only field-sensitivity keeps running into. Metel's bet is to reach it through an explicit nominal-to-structural bridge rather than by annotating references — <strong>a different approach to an acknowledged-hard problem, not a demonstrated improvement over it</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-directions-im-weighing">Other Directions I'm Weighing<a href="https://metel-lang.org/blog/introducing-metel#other-directions-im-weighing" class="hash-link" aria-label="Direct link to Other Directions I'm Weighing" title="Direct link to Other Directions I'm Weighing" translate="no">​</a></h2>
<p><strong>Brands</strong> are already decided as a piece of Metel — a single mechanism for tracking allocator, lifetime, and capability identity, in the spirit of <a href="https://plv.mpi-sws.org/rustbelt/ghostcell/" target="_blank" rel="noopener noreferrer" class="">GhostCell</a> and Scala's <a href="https://docs.scala-lang.org/scala3/reference/experimental/cc.html" target="_blank" rel="noopener noreferrer" class="">capture checking</a> — <strong>it is the details that are still unsettled, not whether they belong</strong>.</p>
<p><strong>Comptime</strong> is further along than either, on paper: two draft RFCs already specify it in Zig's image — compile-time execution of ordinary Metel code, staged by the same evaluator, rather than a separate macro language with its own grammar and hygiene rules. The interesting bet in those drafts is that generalizing a single primitive — <code>emit</code>, which lets comptime code register a declaration or splice an expression back at its own call site — plus exposing Metel's own parser as an ordinary comptime-callable function, <strong>closes most of what a macro system is normally needed for</strong>: derive, repetitive declaration generation, compile-time-validated embedded DSLs, even Rust's <code>matches!</code>-style pattern macros. No token-stream grammar, no macro-invocation syntax, no hygiene system to design. It is still draft and deferred to after the core language settles.</p>
<p>Less settled than either are <a href="https://arxiv.org/abs/1710.09756" target="_blank" rel="noopener noreferrer" class="">linear types</a> (use <em>exactly</em> once, stricter than Rust's affine ownership, as shipped in <a href="https://borretti.me/article/introducing-austral" target="_blank" rel="noopener noreferrer" class="">Austral</a>) and <a href="https://arxiv.org/abs/1312.1399" target="_blank" rel="noopener noreferrer" class="">algebraic effects and handlers</a> in the style of <a href="https://koka-lang.github.io/koka/doc/index.html" target="_blank" rel="noopener noreferrer" class="">Koka</a> — but "less settled" means different things for each. Linear types already have a draft RFC and real design work behind them; effects don't have an RFC at all yet. Both have strong prior art elsewhere, and I think both are worth having — <strong>the honest open question isn't whether they belong, it's whether either fits Metel's own memory model cleanly enough to commit to</strong>, rather than sitting beside it as a bolted-on feature. I will write these up separately as they firm up.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-build-it">Why Build It?<a href="https://metel-lang.org/blog/introducing-metel#why-build-it" class="hash-link" aria-label="Direct link to Why Build It?" title="Direct link to Why Build It?" translate="no">​</a></h2>
<p>A lot of languages sound interesting in design documents. <strong>The hard part is whether the ideas still hold together</strong> when they collide with generics, borrowing, closures, partial moves, collections, modules, diagnostics, and performance constraints. Metel is at that stage now. Some ideas have worked; some have been reopened after implementation exposed problems. That is healthy.</p>
<p>What Metel actually claims is <strong>smaller than "new research"</strong>: almost none of the individual ingredients is novel, and several are already formalized and proven sound. If Metel is worth anything, it will be because the <em>combination</em>, and the ergonomics of that combination, turn out to be coherent, teachable, and implementable. The single place Metel might push past the state of the art is field-sensitive ownership over structured data — and even there the status is "an open problem others are also stuck on," not "solved."</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-now">What Now?<a href="https://metel-lang.org/blog/introducing-metel#what-now" class="hash-link" aria-label="Direct link to What Now?" title="Direct link to What Now?" translate="no">​</a></h2>
<p>Allocators were initially thought of as the public face of the language, but they're the <em>last</em> major piece I plan to build. The more I work on the design, the more it looks like a combination of simpler things — an <code>@a T</code> is roughly an owned box carrying a brand, and checking it doesn't outlive its allocator is just the borrow checker's job — rather than a primitive of its own. So allocators wait until brands, records, and borrow-checking exist, and the finished design becomes an acceptance test: can I rebuild <code>Heap</code> and <code>BumpAlloc</code> from those pieces, or is there a genuinely allocator-specific remainder?</p>
<p>So: <strong>short term</strong>, the records post and <code>ToRecord</code>/<code>FromRecord</code> working in the interpreter. <strong>Medium term</strong>, the borrow checker, linear types, and brands as real primitives. <strong>Then allocators</strong>, on top of all of it. <strong>Long term:</strong> a real compiler and soundness arguments for the parts that matter most — an interpreter can pressure-test syntax, but it can't carry that weight.</p>
<p>I'd also like to <strong>open parts of the process to outside contributions</strong>. Not design-by-committee — I want the room to be wrong in my own direction for a while first — but real feedback, critique, counterexamples, and eventually carefully-scoped contributions, once there's enough structure for that to land somewhere useful.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">References<a href="https://metel-lang.org/blog/introducing-metel#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class="">Federico Bruzzone, <a href="https://federicobruzzone.github.io/posts/eter/a-friendly-tour-of-substructural-uniqueness-ownership-and-capabilities-types-and-more.html" target="_blank" rel="noopener noreferrer" class="">A friendly tour of substructural, uniqueness, ownership and capabilities types (and more)</a></li>
<li class="">The Rust Programming Language, <a href="https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" target="_blank" rel="noopener noreferrer" class="">Validating References with Lifetimes</a></li>
<li class="">Mads Tofte, Jean-Pierre Talpin, <a href="https://dl.acm.org/doi/10.1145/174675.177855" target="_blank" rel="noopener noreferrer" class="">Implementation of the Typed Call-by-Value λ-calculus using a Stack of Regions</a> (POPL 1994)</li>
<li class="">Dan Grossman, Greg Morrisett, Trevor Jim, Michael Hicks, Yanling Wang, <a href="https://dl.acm.org/doi/10.1145/543552.512563" target="_blank" rel="noopener noreferrer" class="">Region-Based Memory Management in Cyclone</a> (PLDI 2002); see also the <a href="https://cyclone.thelanguage.org/wiki/Introduction%20to%20Regions/" target="_blank" rel="noopener noreferrer" class="">Cyclone regions manual</a></li>
<li class="">Rust standard library source, <a href="https://doc.rust-lang.org/src/alloc/rc.rs.html" target="_blank" rel="noopener noreferrer" class=""><code>RcInner</code> and <code>Rc::drop_slow</code></a></li>
<li class="">Rust standard library source, <a href="https://doc.rust-lang.org/src/alloc/sync.rs.html" target="_blank" rel="noopener noreferrer" class=""><code>ArcInner</code> and <code>Arc::drop_slow</code></a></li>
<li class="">Niko Matsakis, <a href="https://smallcultfollowing.com/babysteps/blog/2021/11/05/view-types/" target="_blank" rel="noopener noreferrer" class="">View types for Rust</a></li>
<li class="">TypeScript Handbook, <a href="https://www.typescriptlang.org/docs/handbook/type-compatibility.html" target="_blank" rel="noopener noreferrer" class="">Type Compatibility</a></li>
<li class="">PureScript Book, <a href="https://book.purescript.org/chapter3.html" target="_blank" rel="noopener noreferrer" class="">Records and Row Polymorphism</a></li>
</ul>]]></content>
        <author>
            <name>Vladislav Parfeniuc</name>
        </author>
        <category label="language-design" term="language-design"/>
        <category label="metel" term="metel"/>
        <category label="roadmap" term="roadmap"/>
    </entry>
</feed>