<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lowering on Thunderseethe's Devlog</title><link>https://thunderseethe.dev/tags/lowering/</link><description>Recent content in Lowering on Thunderseethe's Devlog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 08 Dec 2025 14:03:05 +0000</lastBuildDate><atom:link href="https://thunderseethe.dev/tags/lowering/index.xml" rel="self" type="application/rss+xml"/><item><title>Lowering Top Level Items</title><link>https://thunderseethe.dev/posts/lowering-items/</link><pubDate>Tue, 04 Mar 2025 00:00:00 +0000</pubDate><guid>https://thunderseethe.dev/posts/lowering-items/</guid><description>&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Making a Language&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>This post is part of the &lt;a 
 href="https://thunderseethe.dev/series/making-a-language"
 
 >
 making a language series
 
&lt;/a>
.
A series that teaches you how to implement a programming language using Rust.&lt;/p>
&lt;p>This post lowers top level functions from our &lt;a 
 href="https://thunderseethe.dev/posts/check-top-level-items"
 
 >
 prior pass
 
&lt;/a>
.
It extends the row language with support for items (top level functions) in our IR.&lt;/p>
&lt;/div>
&lt;/details>

&lt;p>&lt;a 
 href="https://thunderseethe.dev/posts/lowering-rows-intro"
 
 >
 Last time
 
&lt;/a>
 saw us endeavoring upon a trilogy to bring rows crashing down from their high-flying AST nodes into the realities of our lowly IR.
Our goals this time are less highfalutin.
We&amp;rsquo;re going to be lowering items.
I can&amp;rsquo;t tell you how relieved I am to see this titled &amp;ldquo;.Items&amp;rdquo;, not &amp;ldquo;.Items[0]&amp;rdquo;.&lt;/p></description></item><item><title>The Heart of Lowered Rows</title><link>https://thunderseethe.dev/posts/lowering-rows-ast/</link><pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate><guid>https://thunderseethe.dev/posts/lowering-rows-ast/</guid><description>&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Making a Language&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>This post is part of the &lt;a 
 href="https://thunderseethe.dev/series/making-a-language"
 
 >
 making a language series
 
&lt;/a>
.
A series that teaches you how to implement a programming language using Rust.&lt;/p>
&lt;p>This post continues lowering rows from our &lt;a 
 href="https://thunderseethe.dev/posts/lowering-rows-ty"
 
 >
 previous post
 
&lt;/a>
.&lt;/p>
&lt;/div>
&lt;/details>

&lt;p>&lt;a 
 href="https://thunderseethe.dev/posts/lowering-rows-ty"
 
 >
 Last time
 
&lt;/a>
 we upgraded &lt;code>lower_ty_scheme&lt;/code> to support rows and saw how we&amp;rsquo;d use it&amp;rsquo;s evidence to inform &lt;code>lower_ast&lt;/code>.
We&amp;rsquo;re getting to the heart of lowering rows this time: generating and applying our evidence terms.&lt;/p></description></item><item><title>The Types of Lowered Rows</title><link>https://thunderseethe.dev/posts/lowering-rows-ty/</link><pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate><guid>https://thunderseethe.dev/posts/lowering-rows-ty/</guid><description>&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Making a Language&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>This post is part of the &lt;a 
 href="https://thunderseethe.dev/series/making-a-language"
 
 >
 making a language series
 
&lt;/a>
.
A series that teaches you how to implement a programming language using Rust.&lt;/p>
&lt;p>This post continues lowering rows from our &lt;a 
 href="https://thunderseethe.dev/posts/lowering-rows-intro"
 
 >
 previous post
 
&lt;/a>
.&lt;/p>
&lt;/div>
&lt;/details>

&lt;p>&lt;a 
 href="https://thunderseethe.dev/posts/lowering-rows-intro"
 
 >
 Last time
 
&lt;/a>
 we learned how we&amp;rsquo;re going to lower row types and made some row addendums for &lt;code>IR&lt;/code> and &lt;code>Type&lt;/code>.
Today, we&amp;rsquo;ll update &lt;code>lower_ty_scheme&lt;/code>, using those addendums, to generate types for &lt;code>Evidence&lt;/code>.&lt;/p>
&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Quick Refresher&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>Here&amp;rsquo;s a quick rundown of the stuff we&amp;rsquo;ll need from &lt;a 
 href="https://thunderseethe.dev/posts/row-types"
 
 >
 types/rows
 
&lt;/a>
.&lt;/p></description></item><item><title>Lowering Row Types, Evidently</title><link>https://thunderseethe.dev/posts/lowering-rows-intro/</link><pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate><guid>https://thunderseethe.dev/posts/lowering-rows-intro/</guid><description>&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Making a Language&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>This post is part of the &lt;a 
 href="https://thunderseethe.dev/series/making-a-language"
 
 >
 making a language series
 
&lt;/a>
.
A series that teaches you how to implement a programming language using Rust.&lt;/p>
&lt;p>This post undertakes lowering rows building on our &lt;a 
 href="https://thunderseethe.dev/posts/row-types"
 
 >
 previous pass
 
&lt;/a>
 that inferred row types.
It extends the &lt;a 
 href="https://thunderseethe.dev/posts/lowering-base-ir"
 
 >
 lowering
 
&lt;/a>
 we did for the base language.&lt;/p>
&lt;/div>
&lt;/details>

&lt;p>&lt;a 
 href="https://thunderseethe.dev/posts/lowering-base-ir"
 
 >
 Last time
 
&lt;/a>
, we lowered &lt;a 
 href="https://github.com/thunderseethe/making-a-language/tree/main/types/base"
 
 
 target="_blank" 
 rel="noopener" 
 data-goatcounter-click="https://github.com/thunderseethe/making-a-language/tree/main/types/base"
 data-goatcounter-title="types/base"
 data-goatcounter-referrer="Lowering Row Types, Evidently"
 >
 types/base
 
 &lt;i class="fa-solid fa-arrow-up-right-from-square">&lt;/i>
 
&lt;/a>
 into our IR.
That was exciting, but I professed some anxieties that all we had really done is swap an &lt;code>Ast::&lt;/code> prefix for an &lt;code>IR::&lt;/code> prefix.
Today, we&amp;rsquo;re going to assuage those concerns by lowering &lt;a 
 href="https://github.com/thunderseethe/making-a-language/tree/main/types/rows"
 
 
 target="_blank" 
 rel="noopener" 
 data-goatcounter-click="https://github.com/thunderseethe/making-a-language/tree/main/types/rows"
 data-goatcounter-title="types/rows"
 data-goatcounter-referrer="Lowering Row Types, Evidently"
 >
 types/rows
 
 &lt;i class="fa-solid fa-arrow-up-right-from-square">&lt;/i>
 
&lt;/a>
.
A more seismic lowering.
Recall that &lt;a 
 href="https://thunderseethe.dev/posts/row-types"
 
 >
 row types
 
&lt;/a>
 provide data types for our language.
Rows are great in the surface language and the type checker but start to lose their luster once we need to represent them in memory.&lt;/p></description></item><item><title>Escaping the Typechecker, an Implementation</title><link>https://thunderseethe.dev/posts/lowering-base-impl/</link><pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate><guid>https://thunderseethe.dev/posts/lowering-base-impl/</guid><description>&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Making a Language&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>This post is part of the &lt;a 
 href="https://thunderseethe.dev/series/making-a-language"
 
 >
 making a language series
 
&lt;/a>
.
A series that teaches you how to implement a programming language using Rust.&lt;/p>
&lt;p>This post builds on the &lt;a 
 href="https://thunderseethe.dev/posts/lowering-base-ir"
 
 >
 previous lowering post
 
&lt;/a>
.
Now that we have some more theory about lowering we undertake Implementation this time around.&lt;/p>
&lt;/div>
&lt;/details>

&lt;p>Armed with the knowledge of &lt;code>IR&lt;/code> and &lt;code>Type&lt;/code> from &lt;a 
 href="https://thunderseethe.dev/posts/lowering-base-ir"
 
 >
 last time
 
&lt;/a>
, we can finally write some code:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-rs" data-lang="rs">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c678dd">fn&lt;/span> &lt;span style="color:#00b1f7">lower&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">ast&lt;/span>: &lt;span style="color:#76a9f9">Ast&lt;/span>&lt;span style="color:#c7bf54">&amp;lt;&lt;/span>&lt;span style="color:#c1abea">TypedVar&lt;/span>&lt;span style="color:#c7bf54">&amp;gt;&lt;/span>, 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">scheme&lt;/span>: &lt;span style="color:#76a9f9">ast&lt;/span>::&lt;span style="color:#c1abea">TypeScheme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>) -&amp;gt; (&lt;span style="color:#b756ff;font-weight:bold">IR&lt;/span>, &lt;span style="color:#c1abea">Type&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c678dd">let&lt;/span> (&lt;span style="color:#c1abea">ir_ty&lt;/span>, &lt;span style="color:#c1abea">types&lt;/span>) &lt;span style="color:#c7bf54">=&lt;/span> &lt;span style="color:#c1abea">lower_ty_scheme&lt;/span>(&lt;span style="color:#c1abea">scheme&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#00b1f7">todo!&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>One line down.
That&amp;rsquo;s great progress (especially compared to last post)!&lt;/p></description></item><item><title>Lowering our AST to Escape the Typechecker</title><link>https://thunderseethe.dev/posts/lowering-base-ir/</link><pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate><guid>https://thunderseethe.dev/posts/lowering-base-ir/</guid><description>&lt;details class="accessory">
 &lt;summary>&lt;div class="title">Making a Language&lt;/div>&lt;/summary>
 &lt;div class="inner">&lt;p>This post is part of the &lt;a 
 href="https://thunderseethe.dev/series/making-a-language"
 
 >
 making a language series
 
&lt;/a>
.
A series that teaches you how to implement a programming language using Rust.&lt;/p>
&lt;p>This post covers turning our typed AST into our intermediate representation for our base language.
It builds on the outputs of the &lt;a 
 href="https://thunderseethe.dev/posts/type-inference"
 
 >
 previous pass
 
&lt;/a>
 where we inferred types for the base language.&lt;/p>
&lt;/div>
&lt;/details>

&lt;p>We&amp;rsquo;ve been in &lt;a 
 href="https://thunderseethe.dev/posts/check-top-level-items"
 
 >
 type checking
 
&lt;/a>
 so long it&amp;rsquo;s becoming a tar pit deep enough to rival picking a parser.
Our only hope of escape is to delve deeper, lest we find ourselves fretting over the endlessly enticing type checker features available to adjoin.
We&amp;rsquo;re always free to return to our type checker older and wiser.
But this series is called making a language, not type check until our motivation evaporates.&lt;/p></description></item></channel></rss>