<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Latest Posts on kojobailey.me</title><link>https://kojobailey.me/posts/</link><description>Recent content in Latest Posts on kojobailey.me</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>kojomolojo@gmail.com (map[email:kojomolojo@gmail.com name:Kojo Bailey])</managingEditor><webMaster>kojomolojo@gmail.com (Kojo Bailey)</webMaster><lastBuildDate>Fri, 10 Jul 2026 20:08:00 +0000</lastBuildDate><atom:link href="https://kojobailey.me/posts/feed.xml" rel="self" type="application/rss+xml"/><item><title>First-Class Pattern Matching</title><link>https://kojobailey.me/posts/first-class-pattern-matching/</link><pubDate>Fri, 10 Jul 2026 20:08:00 +0000</pubDate><author>kojomolojo@gmail.com (Kojo Bailey)</author><guid>https://kojobailey.me/posts/first-class-pattern-matching/</guid><description>&lt;p>I was reading through the &lt;a href="https://docs.scala-lang.org/tour/tour-of-scala.html"
target="_blank" rel="noopener noreferrer"
>Tour of Scala&lt;/a>
, interested in Scala&amp;rsquo;s fusion of functional programming and Java-style object-oriented programming, when I came across the concept of &lt;strong>&lt;a href="https://docs.scala-lang.org/tour/extractor-objects.html"
target="_blank" rel="noopener noreferrer"
>extractor objects&lt;/a>
&lt;/strong>.&lt;/p>
&lt;p>Essentially, a Scala &lt;code>object&lt;/code> is a singleton class, and it comes with two methods you can define that - weirdly enough - can be used used for custom &lt;strong>pattern matching&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-scala" data-lang="scala">&lt;span class="line">&lt;span class="cl">&lt;span class="k">object&lt;/span> &lt;span class="nc">CustomerID&lt;/span>&lt;span class="k">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">def&lt;/span> &lt;span class="kt">apply&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kt">name:&lt;/span> &lt;span class="kt">String&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">s&amp;#34;&lt;/span>&lt;span class="si">$name&lt;/span>&lt;span class="s">--23098234908&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="n">unapply&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">customerID&lt;/span>&lt;span class="k">:&lt;/span> &lt;span class="kt">String&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="k">:&lt;/span> &lt;span class="kt">Option&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="kt">String&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="k">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">val&lt;/span> &lt;span class="n">stringArray&lt;/span>&lt;span class="k">:&lt;/span> &lt;span class="kt">Array&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="kt">String&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="k">=&lt;/span> &lt;span class="n">customerID&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;--&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">stringArray&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tail&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">nonEmpty&lt;/span> &lt;span class="n">then&lt;/span> &lt;span class="nc">Some&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">stringArray&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="nc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">val&lt;/span> &lt;span class="n">customer1ID&lt;/span> &lt;span class="k">=&lt;/span> &lt;span class="nc">CustomerID&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;Sukyoung&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="c1">// Sukyoung--23098234908
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">customer1ID&lt;/span> &lt;span class="k">match&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nc">CustomerID&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="k">=&amp;gt;&lt;/span> &lt;span class="n">println&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="c1">// prints Sukyoung
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">case&lt;/span> &lt;span class="k">_&lt;/span> &lt;span class="k">=&amp;gt;&lt;/span> &lt;span class="n">println&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;Could not extract a CustomerID&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="godbolt-button">
&lt;a target="_blank" href="https://scastie.scala-lang.org/ywAtEDF8TNSHHI9OZxggZw">Run this code!&lt;/a>
&lt;/div>
&lt;p>This caught me by major surprise as I was not aware any language yet had a way to support first-class pattern matching to any extent.&lt;/p></description><content:encoded><![CDATA[<p>I was reading through the <a href="https://docs.scala-lang.org/tour/tour-of-scala.html"
	
		target="_blank" rel="noopener noreferrer"
	>Tour of Scala</a>
, interested in Scala&rsquo;s fusion of functional programming and Java-style object-oriented programming, when I came across the concept of <strong><a href="https://docs.scala-lang.org/tour/extractor-objects.html"
	
		target="_blank" rel="noopener noreferrer"
	>extractor objects</a>
</strong>.</p>
<p>Essentially, a Scala <code>object</code> is a singleton class, and it comes with two methods you can define that - weirdly enough - can be used used for custom <strong>pattern matching</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">object</span> <span class="nc">CustomerID</span><span class="k">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kt">def</span> <span class="kt">apply</span><span class="o">(</span><span class="kt">name:</span> <span class="kt">String</span><span class="o">)</span> <span class="o">=</span> <span class="s">s&#34;</span><span class="si">$name</span><span class="s">--23098234908&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">def</span> <span class="n">unapply</span><span class="o">(</span><span class="n">customerID</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="k">=</span>
</span></span><span class="line"><span class="cl">    <span class="k">val</span> <span class="n">stringArray</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="k">=</span> <span class="n">customerID</span><span class="o">.</span><span class="n">split</span><span class="o">(</span><span class="s">&#34;--&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">stringArray</span><span class="o">.</span><span class="n">tail</span><span class="o">.</span><span class="n">nonEmpty</span> <span class="n">then</span> <span class="nc">Some</span><span class="o">(</span><span class="n">stringArray</span><span class="o">.</span><span class="n">head</span><span class="o">)</span> <span class="k">else</span> <span class="nc">None</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="n">customer1ID</span> <span class="k">=</span> <span class="nc">CustomerID</span><span class="o">(</span><span class="s">&#34;Sukyoung&#34;</span><span class="o">)</span>  <span class="c1">// Sukyoung--23098234908
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">customer1ID</span> <span class="k">match</span>
</span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="nc">CustomerID</span><span class="o">(</span><span class="n">name</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">println</span><span class="o">(</span><span class="n">name</span><span class="o">)</span>  <span class="c1">// prints Sukyoung
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">case</span> <span class="k">_</span> <span class="k">=&gt;</span> <span class="n">println</span><span class="o">(</span><span class="s">&#34;Could not extract a CustomerID&#34;</span><span class="o">)</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://scastie.scala-lang.org/ywAtEDF8TNSHHI9OZxggZw">Run this code!</a>
</div>

<p>This caught me by major surprise as I was not aware any language yet had a way to support first-class pattern matching to any extent.</p>
<p>I was even more surprised to then learn that something similar is also supported in Haskell:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="cm">{-# LANGUAGE PatternSynonyms #-}</span>
</span></span><span class="line"><span class="cl"><span class="cm">{-# LANGUAGE ViewPatterns #-}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">-- A space is used instead of `--` because Haskell&#39;s</span>
</span></span><span class="line"><span class="cl"><span class="c1">-- standard library has no `splitOn` function :(</span>
</span></span><span class="line"><span class="cl"><span class="nf">applyCustomerId</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">String</span>
</span></span><span class="line"><span class="cl"><span class="nf">applyCustomerId</span> <span class="n">name</span> <span class="ow">=</span> <span class="n">name</span> <span class="o">++</span> <span class="s">&#34; 23098234908&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">unapplyCustomerId</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">String</span>
</span></span><span class="line"><span class="cl"><span class="nf">unapplyCustomerId</span> <span class="n">str</span> <span class="ow">=</span> <span class="kr">case</span> <span class="n">words</span> <span class="n">str</span> <span class="kr">of</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="n">name</span><span class="kt">:</span><span class="kr">_</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">Just</span> <span class="n">name</span>
</span></span><span class="line"><span class="cl">  <span class="kr">_</span> <span class="ow">-&gt;</span> <span class="kt">Nothing</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">String</span>
</span></span><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="n">name</span> <span class="ow">&lt;-</span> <span class="p">(</span><span class="n">unapplyCustomerId</span> <span class="ow">-&gt;</span> <span class="kt">Just</span> <span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="ow">=</span> <span class="kr">case</span> <span class="n">applyCustomerId</span> <span class="s">&#34;Sukyoung&#34;</span> <span class="kr">of</span>
</span></span><span class="line"><span class="cl">  <span class="kt">CustomerId</span> <span class="n">name</span> <span class="ow">-&gt;</span> <span class="n">putStrLn</span> <span class="n">name</span>
</span></span><span class="line"><span class="cl">  <span class="kr">_</span> <span class="ow">-&gt;</span> <span class="n">putStrLn</span> <span class="s">&#34;Could not extract a CustomerID&#34;</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://play.haskell.org/saved/pvfBZfs5">Run this code!</a>
</div>

<p>I do like the Haskell approach much more than Scala&rsquo;s since it makes the &ldquo;pattern&rdquo; more obvious via the <code>pattern</code> keyword and specific <code>&lt;- (f -&gt; x)</code> syntax.</p>
<p>But it still isn&rsquo;t quite satisfactory.</p>
<h2 id="the-is-operator">The <code>is</code> operator</h2>
<p>Suppose Haskell had an <strong>operator</strong> that could pattern match on a value as a boolean expression:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">isCustomerId</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">Bool</span>
</span></span><span class="line"><span class="cl"><span class="nf">isCustomerId</span> <span class="n">str</span> <span class="ow">=</span> <span class="n">safeHead</span> <span class="p">(</span><span class="n">words</span> <span class="n">str</span><span class="p">)</span> <span class="p">`</span><span class="n">is</span><span class="p">`</span> <span class="p">(</span><span class="kt">Just</span> <span class="kr">_</span><span class="p">)</span>
</span></span></code></pre></div><p>Right now, the <code>CustomerId</code> pattern is checked like <code>unapplyCustomerId -&gt; Just name</code>, but if the function before the <code>-&gt;</code> were to always return a boolean anyway, then we could simplify this syntax:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">String</span>
</span></span><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="n">name</span> <span class="ow">&lt;-</span> <span class="n">isCustomerId</span>
</span></span></code></pre></div><p>And the compiler would know what to bind <code>name</code> to as it could check where pattern matching occurs within <code>isCustomerId</code>, which in this case is via the <code>is</code> operator.</p>
<p>Well, I&rsquo;ve been designing a language that happens to already have such an <code>is</code> operator, and so I was able to come across this solution naturally. Here&rsquo;s how you&rsquo;d define it:</p>
<div class="note">
	<blockquote>
		<small><i>The following isn&rsquo;t Haskell. I just borrow Haskell&rsquo;s syntax highlighting.</i></small>
	</blockquote>
</div>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">def</span> <span class="kt">CustomerId</span> <span class="o">#=</span> <span class="n">subtype</span><span class="p">[</span><span class="kt">String</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">impl</span> <span class="kt">From</span><span class="p">[</span><span class="kt">String</span><span class="p">,</span> <span class="kt">U64</span><span class="p">]</span> <span class="n">for</span> <span class="kt">CustomerId:</span>
</span></span><span class="line"><span class="cl">	<span class="n">static</span> <span class="n">def</span> <span class="n">from</span> <span class="o">#=</span> <span class="n">fn</span><span class="p">(</span><span class="n">name</span> <span class="o">#</span> <span class="kt">String</span><span class="p">,</span> <span class="n">id</span> <span class="o">#</span> <span class="kt">U64</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">Self:</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;${name}--${id}&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">impl</span> <span class="kt">Match</span><span class="p">[</span><span class="kt">String</span><span class="p">,</span> <span class="kt">U64</span><span class="p">]</span> <span class="n">for</span> <span class="kt">CustomerId:</span>
</span></span><span class="line"><span class="cl">	<span class="n">def</span> <span class="n">is</span> <span class="o">#=</span> <span class="n">fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">name</span> <span class="o">#</span> <span class="kt">String</span><span class="p">,</span> <span class="n">id</span> <span class="o">#</span> <span class="kt">U64</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">Bool:</span>
</span></span><span class="line"><span class="cl">		<span class="n">self</span><span class="o">.</span><span class="n">splitAt</span><span class="p">(</span><span class="s">&#34;--&#34;</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="o">@.</span><span class="n">length</span> <span class="n">is</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">			<span class="n">and</span> <span class="o">@.</span><span class="n">at</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="n">is</span> <span class="n">name</span>
</span></span><span class="line"><span class="cl">			<span class="n">and</span> <span class="kt">U64</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="o">@.</span><span class="n">at</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="n">is</span> <span class="n">id</span>
</span></span></code></pre></div><p>First off, this language is in its very early stages of design, and so a lot of the syntax is subject to change. Those who have used Rust before, though, should be familiar with the <code>impl</code> definition where we implement the <code>From</code> and <code>Match</code> traits for our <code>CustomerId</code> subtype.</p>
<p>A <code>subtype</code> differs from a <code>type</code> in that it does not wrap the underlying data. Instead, the data can be accessed directly and all of its properties and functions are still available to access - i.e., <code>&quot;Foo-1801&quot; is CustomerId(&quot;Foo-1801&quot;)</code>. It is also possible to impose restrictions on the input values, but that&rsquo;s a topic for a different article.</p>
<p>The <code>From</code> trait works very much like it does in Rust where it allows you to call <code>CustomerId::from()</code> on data that isn&rsquo;t implicitly convertible to a <code>String</code>. The <code>Match</code> trait, however, is something new. It allows you to overload the <code>is</code> operator for a particular type and set of parameters.</p>
<p>In pratice, it is used like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="kr">if</span> <span class="kt">CustomerId</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="s">&#34;Jeff&#34;</span><span class="p">,</span> <span class="mi">19970823</span><span class="p">)</span> <span class="n">is</span>
</span></span><span class="line"><span class="cl">	<span class="o">|</span> <span class="kt">CustomerId</span><span class="p">(</span><span class="s">&#34;Kojo&#34;</span><span class="p">,</span> <span class="mi">20060717</span><span class="p">)</span><span class="kt">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">echo</span><span class="p">(</span><span class="s">&#34;You must be Kojo Bailey!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="o">|</span> <span class="kt">CustomerId</span><span class="p">(</span><span class="s">&#34;Jeff&#34;</span><span class="p">,</span> <span class="kr">_</span><span class="p">)</span><span class="kt">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">echo</span><span class="p">(</span><span class="s">&#34;Woah! Jeffs are banned from this company!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="o">|</span> <span class="kt">CustomerId</span><span class="p">(</span><span class="kr">_</span><span class="p">,</span> <span class="n">def</span> <span class="n">id</span><span class="p">)</span><span class="kt">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">echo</span><span class="p">(</span><span class="s">&#34;Welcome patient ${id}!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="o">|</span> <span class="kr">_</span><span class="kt">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">echo</span><span class="p">(</span><span class="s">&#34;Your ID appears to be invalid...&#34;</span><span class="p">)</span>
</span></span></code></pre></div><div class="note">
	<blockquote>
		<small><i>Usually, these would use named arguments, but I&rsquo;ve excluded them for the sake of this example lest it be confusing to some.</i></small>
	</blockquote>
</div>

<p>Not particularly complicated, really. There are some rules to keep in mind though:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="c1">-- Compile Error: Left side must be a value.</span>
</span></span><span class="line"><span class="cl"><span class="kt">CustomerId</span><span class="p">(</span><span class="n">name</span> <span class="ow">=</span> <span class="s">&#34;Kojo&#34;</span><span class="p">,</span> <span class="n">id</span> <span class="ow">=</span> <span class="mi">20060717</span><span class="p">)</span> <span class="n">is</span> <span class="s">&#34;Kojo--20060717&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">-- Compares value to value.</span>
</span></span><span class="line"><span class="cl"><span class="kt">CustomerId</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="n">name</span> <span class="ow">=</span> <span class="s">&#34;Kojo&#34;</span><span class="p">,</span> <span class="n">id</span> <span class="ow">=</span> <span class="mi">20060717</span><span class="p">)</span> <span class="n">is</span> <span class="s">&#34;Kojo--20060717&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">-- Compares value to pattern.</span>
</span></span><span class="line"><span class="cl"><span class="s">&#34;Kojo--20060717&#34;</span> <span class="n">is</span> <span class="kt">CustomerId</span><span class="p">(</span><span class="n">name</span> <span class="ow">=</span> <span class="s">&#34;Kojo&#34;</span><span class="p">,</span> <span class="n">id</span> <span class="ow">=</span> <span class="mi">20060717</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">-- Compares value to value.</span>
</span></span><span class="line"><span class="cl"><span class="s">&#34;Kojo--20060717&#34;</span> <span class="n">is</span> <span class="kt">CustomerId</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="n">name</span> <span class="ow">=</span> <span class="s">&#34;Kojo&#34;</span><span class="p">,</span> <span class="n">id</span> <span class="ow">=</span> <span class="mi">20060717</span><span class="p">)</span>
</span></span></code></pre></div><p>And that&rsquo;s it! The <code>is</code> operator helps to keep things very simple.</p>
<p>You might be wondering though, how exactly does the compiler know what values to bind to from the <code>is</code> overload? To help answer that question, first have a look at this comparison with if the language did not have an <code>is</code> operator and instead had to rely on a classic <code>match</code> expression:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">def</span> <span class="n">is</span> <span class="o">#=</span> <span class="n">fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">name</span> <span class="o">#</span> <span class="kt">String</span><span class="p">,</span> <span class="n">id</span> <span class="o">#</span> <span class="kt">U64</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">Bool:</span>
</span></span><span class="line"><span class="cl">    <span class="n">self</span><span class="o">.</span><span class="n">splitAt</span><span class="p">(</span><span class="s">&#34;--&#34;</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="o">@.</span><span class="n">length</span> <span class="n">is</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="n">and</span> <span class="o">@.</span><span class="n">at</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="n">is</span> <span class="n">name</span>
</span></span><span class="line"><span class="cl">        <span class="n">and</span> <span class="kt">U64</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="o">@.</span><span class="n">at</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="n">is</span> <span class="n">id</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">def</span> <span class="n">match</span> <span class="o">#=</span> <span class="n">fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">name</span> <span class="o">#</span> <span class="kt">String</span><span class="p">,</span> <span class="n">id</span> <span class="o">#</span> <span class="kt">U64</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">Bool:</span>
</span></span><span class="line"><span class="cl">    <span class="n">def</span> <span class="n">strArray</span> <span class="o">#=</span> <span class="n">self</span><span class="o">.</span><span class="n">splitAt</span><span class="p">(</span><span class="s">&#34;--&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kr">if</span> <span class="n">str</span><span class="o">.</span><span class="n">length</span> <span class="o">!=</span> <span class="mi">2</span><span class="kt">:</span> <span class="n">return</span> <span class="kt">False</span>
</span></span><span class="line"><span class="cl">    <span class="n">match</span> <span class="p">(</span><span class="n">strArray</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="kt">U64</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="n">strArray</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="mi">1</span><span class="p">)))</span><span class="kt">:</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">True</span>
</span></span><span class="line"><span class="cl">        <span class="kr">_</span> <span class="ow">-&gt;</span> <span class="kt">False</span>
</span></span></code></pre></div><p>The compiler should be able to deduce what both <code>name</code> and <code>id</code> bind to based on what they pattern matched against. To write it in a way that is even clearer:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">def</span> <span class="n">is</span> <span class="o">#=</span> <span class="n">fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">name</span> <span class="o">#</span> <span class="kt">String</span><span class="p">,</span> <span class="n">id</span> <span class="o">#</span> <span class="kt">U64</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">Bool:</span>
</span></span><span class="line"><span class="cl">    <span class="n">self</span><span class="o">.</span><span class="n">splitAt</span><span class="p">(</span><span class="s">&#34;--&#34;</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="o">@.</span><span class="n">length</span> <span class="n">is</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="n">and</span> <span class="p">(</span><span class="o">@.</span><span class="n">at</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="kt">U64</span><span class="ow">::</span><span class="n">from</span><span class="p">(</span><span class="o">@.</span><span class="n">at</span><span class="p">(</span><span class="mi">1</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">            <span class="n">is</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span>
</span></span></code></pre></div><p>However, the compiler also needs to enforce that each argument that could bind is used exactly once an only in an <code>is</code> expression. Any other case would either cause other issues or just not be very useful anyway. I do admit that having these implicit compiler restrictions isn&rsquo;t ideal and I will continue to look for possible alternatives that may feel more intuitive, but at the very least, it wouldn&rsquo;t be hard for the programmer to learn given the compiler should give useful error messages.</p>
<p>What Haskell does with its <code>(f -&gt; x)</code> syntax is very robust since it restricts you from misusing the binding arguments; the syntax is just quite confusing in my opinion. This is largely how Haskell quite frankly &ldquo;cheats&rdquo; via its type signature grammar:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">String</span>
</span></span><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="n">name</span> <span class="ow">&lt;-</span> <span class="p">(</span><span class="n">unapplyCustomerId</span> <span class="ow">-&gt;</span> <span class="kt">Just</span> <span class="n">name</span><span class="p">)</span>
</span></span></code></pre></div><p>This pattern&rsquo;s type is written as <code>String -&gt; String</code>, but that is not accurate considering it does not take a string and then return a string. Haskell having its type signatures separate from its definitions means it can get away with this, whereas you would struggle to make the type annotations inline:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="nf">pattern</span> <span class="kt">CustomerId</span> <span class="p">(</span><span class="n">name</span> <span class="ow">::</span> <span class="kt">String</span><span class="p">)</span> <span class="p">(</span><span class="n">input</span> <span class="ow">::</span> <span class="kt">String</span><span class="p">)</span> <span class="ow">=</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="n">unapplyCustomerId</span> <span class="n">input</span> <span class="ow">-&gt;</span> <span class="kt">Just</span> <span class="n">name</span><span class="p">)</span>
</span></span></code></pre></div><p>This is already dodgy, and what exactly would its return type even be? A boolean? Because that would just get us to where I am currently.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Regardless, I think this is very interesting (to put it lightly) and I hope I or someone else can think of an elegant solution in the not-so-distant future.</p>
<p>This has been by first blog post on this new language I&rsquo;m designing, and I look forward to sharing more of it. My dissatisfaction with existing programming languages has pushed me to a point where I want to focus solely on developing this language until I have it implemented so that I can use it! Whether or not it will finally satisfy my needs remains to be seen&hellip; but I am optimistic.</p>
]]></content:encoded></item><item><title>First Date with Nim</title><link>https://kojobailey.me/posts/first-date-with-nim/</link><pubDate>Mon, 15 Jun 2026 14:25:00 +0000</pubDate><author>kojomolojo@gmail.com (Kojo Bailey)</author><guid>https://kojobailey.me/posts/first-date-with-nim/</guid><description>&lt;p>&lt;strong>&lt;a href="https://nim-lang.org"
target="_blank" rel="noopener noreferrer"
>Nim&lt;/a>
&lt;/strong> is a programming language I had been eager to try for a while, ever since I started looking more deeply into C++ alternatives (beyond Rust).&lt;/p>
&lt;p>I remember it immediately stuck out to me for having seemingly Python-like syntax while promising high performance as a systems language. I am constantly thinking about ways that programming languages can be made more ergonomic, so naturally, I get very excited when I come across a language that actually strays from typical C-like syntax. Right now, I&amp;rsquo;m very excited to see how &lt;a href="https://mojolang.org"
target="_blank" rel="noopener noreferrer"
>Mojo&lt;/a>
develops!&lt;/p></description><content:encoded><![CDATA[<p><strong><a href="https://nim-lang.org"
	
		target="_blank" rel="noopener noreferrer"
	>Nim</a>
</strong> is a programming language I had been eager to try for a while, ever since I started looking more deeply into C++ alternatives (beyond Rust).</p>
<p>I remember it immediately stuck out to me for having seemingly Python-like syntax while promising high performance as a systems language. I am constantly thinking about ways that programming languages can be made more ergonomic, so naturally, I get very excited when I come across a language that actually strays from typical C-like syntax. Right now, I&rsquo;m very excited to see how <a href="https://mojolang.org"
	
		target="_blank" rel="noopener noreferrer"
	>Mojo</a>
 develops!</p>
<p>I was also intruiged by how the language <em>can</em> be <strong>garbage collected</strong> yet also supports custom allocation and memory management strategies. Although I&rsquo;m not experienced with things like custom allocators, I do primarily come from a C++ background, and so I&rsquo;m not too keen on using garbage collected languages - it&rsquo;s why I&rsquo;m yet to really give <a href="https://go.dev"
	
		target="_blank" rel="noopener noreferrer"
	>Go</a>
 a go.</p>
<p>Having recently finished an implementation of <a href="https://github.com/KojoBailey/pong-odin"
	
		target="_blank" rel="noopener noreferrer"
	>Pong</a>
 in <a href="https://odin-lang.org"
	
		target="_blank" rel="noopener noreferrer"
	>Odin</a>
, I was left rather disappointed and was craving something more interesting. And so I pulled up my list of languages to try out and saw Nim towards the top of the list. As such, I decided to program another classic game, <a href="https://github.com/KojoBailey/snake-nim"
	
		target="_blank" rel="noopener noreferrer"
	>Snake</a>
, with the help of <a href="https://www.raylib.com"
	
		target="_blank" rel="noopener noreferrer"
	>Raylib</a>
. In particular, I used <a href="https://github.com/planetis-m/naylib"
	
		target="_blank" rel="noopener noreferrer"
	>Naylib</a>
, a wrapping for Nim that conforms to its style.</p>
<p>In this article, I&rsquo;ll to go over my thoughts about the language after having used it for a whopping 4 hours, and explain why I probably won&rsquo;t be using it again anytime soon!</p>
<h2 id="first-impressions">First Impressions</h2>
<p>Before I got started with my Snake project, I first installed the Nim compiler and toolchain - including its package manager, Nimble - and compiled a hello world program as I typically do when I install a new language:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="n">echo</span> <span class="s">&#34;Hello from Arch Linux Hyprland!&#34;</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://play.nim-lang.org/#pasty=uRdgruWi">Run this code!</a>
</div>

<p>How succinct! Although I must say, I don&rsquo;t get the appeal of using <code>echo</code> over <code>print</code>. Maybe it&rsquo;s to help emphasise the Bash-like command syntax. I am a fan of said syntax though, especially coming from <a href="https://www.haskell.org"
	
		target="_blank" rel="noopener noreferrer"
	>Haskell</a>
. It&rsquo;s just as clean as it gets really.</p>
<h2 id="entry-point">Entry Point</h2>
<p>I don&rsquo;t feel particularly strong on the absence of an explicit <code>main</code> function. Conventionally, <code>main</code> is handy for finding the entry point of a program, of course, but it&rsquo;s not that much more difficult to navigate without it. Plus, if you do feel strongly about it, you can always define a custom entry point, even if just for some organisation.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">main</span><span class="p">()</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">echo</span> <span class="s">&#34;echo&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">main</span><span class="p">()</span>
</span></span></code></pre></div><p>The lack of <code>main</code> also means you need to read command-line arguments via the <code>std/os</code> module, and you likewise can&rsquo;t just return an exit code like you would in C. Thing is, these conventions are seemingly being abandoned anyway, with both Rust and Zig treating <code>main</code> as <code>void</code> and processing command-line arguments via library functions. Plus, the entry point being the top of the file itself is something Python programmers will already be familiar with, so really it&rsquo;s leaving one convention for another.</p>
<h2 id="procedures-vs-functions">Procedures vs Functions</h2>
<p>What many will be less familiar with, however, is the <code>proc</code> keyword - &ldquo;procedure&rdquo; rather than &ldquo;function&rdquo;. Well, except Nim does have functions, but they are reserved for the more mathematical concept of a <strong>pure</strong> function that has no <a href="https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29"
	
		target="_blank" rel="noopener noreferrer"
	>side effects</a>
. I first saw <code>proc</code> used in Odin, and I&rsquo;m glad that Nim also makes the distinction between a process and a function.</p>
<p>That being said, I am weary of how pure functions can get in the way of <strong>debugging</strong>. The thing that made debugging logic errors in Haskell so hellish was the inability to print without changing the function&rsquo;s signature from pure to <code>IO ()</code>. Thankfully, Nim actually does have a solution in the form of <code>debugEcho</code> - an <code>echo</code> treated by the compiler as if it has no side effects.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">func</span> <span class="n">foo</span><span class="p">()</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">echo</span> <span class="s">&#34;caw&#34;</span> <span class="c"># Compile error</span>
</span></span><span class="line"><span class="cl">    <span class="mi">23</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="k">func</span> <span class="n">bar</span><span class="p">()</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">debugEcho</span> <span class="s">&#34;caw&#34;</span> <span class="c"># A-OK</span>
</span></span><span class="line"><span class="cl">    <span class="mi">67</span>
</span></span></code></pre></div><p>It comes across as a bit hacky, but I appreciate it all the same. Perhaps all the hype around pure functions will one day lead to good debugging for them becoming mainstream, preferably built into compilers.</p>
<h2 id="implicit-result">Implicit Result</h2>
<p>You will also notice that Nim supports implicit returns when you end a procedure with an expression, like Rust. Well, this is partially true, as Nim also has a feature that I actually also thought of myself a while ago, and I was surprised to actually see implemented in a popular language:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="kn">import</span> <span class="n">std</span><span class="o">/</span><span class="n">math</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">func</span> <span class="n">quadratic</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">:</span> <span class="kt">float64</span><span class="p">):</span> <span class="kt">float64</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">pow</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">a</span> <span class="o">*</span> <span class="n">c</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span> <span class="o">+=</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span> <span class="o">/=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">a</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="n">quadratic</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
</span></span></code></pre></div><p>Here, <code>result</code> is an implicit variable for the result of a non-void procedure. And it does genuinely have its uses - for example, here&rsquo;s how I used it in a &ldquo;constructor&rdquo;:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">newSnake</span><span class="p">(</span><span class="n">startPos</span><span class="p">:</span> <span class="n">Vector2</span><span class="p">):</span> <span class="n">Snake</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="k">addr</span> <span class="n">result</span><span class="p">.</span><span class="n">body</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">length</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">head</span><span class="p">.</span><span class="n">position</span> <span class="o">=</span> <span class="n">startPos</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">head</span><span class="p">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">right</span>
</span></span></code></pre></div><h2 id="keywords-vs-symbols">Keywords vs Symbols</h2>
<p>Notice how I get the address of <code>result.body[0]</code> via the <code>addr</code> keyword rather than a symbol like <code>&amp;</code>. The same is true for pointer types being denoted via <code>ptr</code> rather than a <code>*</code> or <code>^</code>. And yet, in order to reference a pointer, you use <code>[]</code> rather than a keyword&hellip;</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">a</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">23</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">b</span><span class="p">:</span> <span class="k">ptr</span> <span class="kt">int</span> <span class="o">=</span> <span class="k">addr</span> <span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span><span class="o">[]</span> <span class="o">+=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="n">b</span><span class="o">[]</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://play.nim-lang.org/#pasty=IaxWzOAE">Run this code!</a>
</div>

<p>&hellip;something which I find rather strange. It is consistent with indexed dereference syntax for arrays though, if you think of arrays as pointers. Issue is, arrays aren&rsquo;t just pointers, and <code>[i]</code> semantically means &ldquo;get the element at this index of this list container&rdquo;, which is why it is used for more than just pointers in most languages.</p>
<p>And weirdly (and I can&rsquo;t wrap my head aroud this), Nim then uses the <code>*</code> to&hellip; denote members as public within modules.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">type</span>
</span></span><span class="line"><span class="cl">  <span class="n">Person</span><span class="o">*</span> <span class="o">=</span> <span class="k">object</span> <span class="c"># Person is visible to other modules</span>
</span></span><span class="line"><span class="cl">    <span class="n">name</span><span class="o">*</span><span class="p">:</span> <span class="kt">string</span>  <span class="c"># name is visible to other modules accessing Person</span>
</span></span></code></pre></div><p>I&rsquo;m not sure how this is better than <code>public</code>, let alone the more concise <code>pub</code>. I didn&rsquo;t end up splitting my project into modules though, so maybe there&rsquo;s some nuance I&rsquo;ve missed.</p>
<p>Nim also replaces <code>&amp;&amp;</code> with <code>and</code>, <code>||</code> with <code>or</code>, and <code>!</code> with <code>not</code>, although still uses <code>!=</code> (<code>!</code>+<code>=</code>) for &ldquo;not equals&rdquo;. I am a fan of this, and have even considered using this convention in my C++ code since C++ does in fact support <a href="https://en.cppreference.com/cpp/language/operator_alternative"
	
		target="_blank" rel="noopener noreferrer"
	>operator alternatives</a>
, including <code>not_eq</code> for <code>!=</code>. Whether or not to use <code>!=</code> is quite a dilemma since, on one hand, cool fonts (like on this blog) can change it to a long equals with a slash through the middle, but it will normally be displayed as a <code>!</code>+<code>=</code> which may leave a programmer wondering why <code>!</code> is used to mean &ldquo;not&rdquo;, and creates friction if the <code>!</code> operator is to be repurposed for something else.</p>
<p>One such solution is to simply not support it and instead require expressions like <code>not (5 == 3)</code>, but that can be quite cumbersome. You could also instead use <code>/=</code> as seen in Haskell, but this conflicts with divide-equals, and would therefore also impact <code>+=</code>, <code>-=</code>, and <code>*=</code>. Two other symbols that could actually work are <code>\=</code> and <code>=/=</code> (<code>=</code>+<code>!</code>+<code>=</code>), the latter of which is used in <a href="https://www.erlang.org/doc/system/expressions.html#term-comparisons"
	
		target="_blank" rel="noopener noreferrer"
	>Erlang</a>
 for strict equality.</p>
<p>Generally though, I do like the idea of using keywords over symbols like <code>&amp;&amp;</code>, <code>||</code>, and <code>!</code>, especially since the words <code>and</code>, <code>or</code>, and <code>not</code> are only 2-3 letters long anyway. Then, I&rsquo;d finish off by replacing <code>!=</code> with <code>=/=</code> or something. I also don&rsquo;t mind the use of <code>ptr</code>, <code>addr</code>, and <code>ref</code> keywords for similar reasons, but really that comes down to how often you use raw pointers and access addresses in the language. A language like Rust that uses <code>&amp;</code> to denote borrowing should absolutely use a special symbol over a keyword due to the sheer frequency of it use, and that&rsquo;s a general rule that can be applied to symbols in all languages - if it is extremely common, make it quick-n-easy to type.</p>
<h2 id="variables-constants-and-lets">Variables, Constants, and&hellip; Lets?</h2>
<p>Nim supports 3 ways to bind values to names:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="kd">var</span> <span class="n">a</span><span class="p">:</span> <span class="kt">int</span> <span class="o">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="k">const</span> <span class="n">b</span><span class="p">:</span> <span class="kt">string</span> <span class="o">=</span> <span class="s">&#34;foo&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="n">c</span><span class="p">:</span> <span class="kt">float</span> <span class="o">=</span> <span class="mf">4.2</span>
</span></span></code></pre></div><p><code>var</code> defines a mutable variable as you would expect, but both <code>const</code> and <code>let</code> define immutable bindings. The difference is that <code>const</code> is analogous to C++&rsquo;s <code>constexpr</code> in that a <code>const</code> value must be known at compile-time. My main issue with this is its inconsistency when read. <code>a</code> is a <code>var</code>. <code>b</code> is a <code>const</code>. But <code>c</code> is a&hellip; <code>let</code>? Rust suffers from the same issue since, although it uses <code>let</code> and <code>let mut</code>, it also supports <code>const</code> for compile-time constants.</p>
<p>Really, I don&rsquo;t see why there particularly needs to be a distinction, as the compiler should be able to deduce from context whether an immutable binding can be known at compile-time or not - I mean, hell, it literally has to check in order to report an error when you try marking something runtime as <code>const</code>. To my knowledge, Zig is an example that doesn&rsquo;t make a distinction, yet allows you to force compile-time evaluation via <code>comptime</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">comptime</span><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">foo</span><span class="p">();</span><span class="w">
</span></span></span></code></pre></div><p>But there is an argument for more explicit contracts being better for communicating programmer intent. In that case, I will shoutout Odin&rsquo;s syntax for defining compile-time constants, especially as it&rsquo;s consistent with the language&rsquo;s syntax for defining procedures, structs, and others:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-odin" data-lang="odin"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="n">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="s">&#34;core:fmt&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">msg</span><span class="w"> </span><span class="o">::</span><span class="w"> </span><span class="s">&#34;hello&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">main</span><span class="w"> </span><span class="o">::</span><span class="w"> </span><span class="kd">proc</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">fmt</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/j5oh7Wb87">Run this code!</a>
</div>

<p>In general though, I think I&rsquo;ve come to appreciate and prefer <code>let</code> and <code>let mut</code> over <code>var</code> and <code>const</code>. It means there&rsquo;s an expectation for everything to be constant unless you define it as <code>mut</code> - the inverse of C++&rsquo;s situation with its <code>const</code> keyword - and means that if you forget to mark something as <code>mut</code>, you either get told by the compiler or accidentally get the better result anyway. It also just semantically signifies that you can make something mutable later if needed, whereas changing a <code>const</code> to <code>var</code> can <em>feel</em> more&hellip; impactful, in a way that&rsquo;s hard to put into words. You could argue that it&rsquo;s better for it to feel more impactful and that Rust in general struggles with making bad decisions feel too easy (another example is the <code>?</code> operator and <code>.unwrap()</code>), but that&rsquo;s a whole post in of itself, I think.</p>
<p>I will mention though - I find there&rsquo;s currently a disconnect between how we define bindings in source code and how they actually get mapped in memory, if mapped at all. For example, consider the following snippet:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">const</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;</span><span class="si">{}</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">3</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><p>Under normal circumstances, there is no way that <code>X</code> here is stored as a binding in memory. Instead, it is certainly made <strong>inline</strong> at compile-time, and then further used to evaluate <code>X + 3 = 5 + 3 = 8</code> as well, so <code>8</code> (or even <code>&quot;8&quot;</code>) just becomes hard-coded into the machine instructions. For reasons I can&rsquo;t quite define, it feels ill-fitting to refer to <code>X</code> as a &ldquo;constant&rdquo;, and maybe <code>inline</code> would be more fitting, although then what if you have a <code>const</code> array that <em>is</em> actually stored in memory at runtime? This is something I want to think more on, but for now, I can say that Odin&rsquo;s <code>x :: 5</code> speaks to me for this reason, and may be worth exploring in more depth.</p>
<h2 id="implicit-namespacing">Implicit Namespacing</h2>
<p>I just had to mention this briefly, because I love it when languages support the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">type</span> <span class="n">Direction</span> <span class="o">=</span> <span class="k">enum</span>
</span></span><span class="line"><span class="cl">    <span class="n">up</span><span class="p">,</span> <span class="n">down</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">right</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">advance</span><span class="p">(</span><span class="n">direction</span><span class="p">:</span> <span class="n">Direction</span><span class="p">)</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="n">direction</span>
</span></span><span class="line"><span class="cl">    <span class="k">of</span>    <span class="n">up</span><span class="p">:</span> <span class="n">snake</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">y</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">of</span>  <span class="n">down</span><span class="p">:</span> <span class="n">snake</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">of</span> <span class="n">right</span><span class="p">:</span> <span class="n">snake</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">of</span>  <span class="n">left</span><span class="p">:</span> <span class="n">snake</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">x</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">advance</span><span class="p">(</span><span class="n">up</span><span class="p">)</span> <span class="c"># Direction.up</span>
</span></span><span class="line"><span class="cl"><span class="n">advance</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="c"># Direction.left</span>
</span></span></code></pre></div><p>iirc OCaml supports this (to an extent), and I really wish Rust and other languages did too&hellip; I&rsquo;d imagine the effects on compilation time are minor, meanwhile the ergonomics are insane. The same goes for namespacing in general, as Nim doesn&rsquo;t require you to prefix imports with the library name. It&rsquo;s why I was able to use Raylib like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">while</span> <span class="ow">not</span> <span class="n">windowShouldClose</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">beginDrawing</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">clearBackground</span><span class="p">(</span><span class="n">Black</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">isGameOver</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">isKeyDown</span><span class="p">(</span><span class="n">Enter</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">reset</span><span class="p">()</span>
</span></span></code></pre></div><p>Rather than something like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">while</span> <span class="ow">not</span> <span class="n">rl</span><span class="p">.</span><span class="n">windowShouldClose</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">rl</span><span class="p">.</span><span class="n">beginDrawing</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">rl</span><span class="p">.</span><span class="n">clearBackground</span><span class="p">(</span><span class="n">rl</span><span class="p">.</span><span class="n">Color</span><span class="p">.</span><span class="n">Black</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">isGameOver</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">rl</span><span class="p">.</span><span class="n">isKeyDown</span><span class="p">(</span><span class="n">rl</span><span class="p">.</span><span class="n">KeyboardKey</span><span class="p">.</span><span class="n">Enter</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">reset</span><span class="p">()</span>
</span></span></code></pre></div><p>It seems unimportant at first, but the improvement on readability is honestly more significant than is often acknowledged.</p>
<p>Yes, namespace conflicts are an issue, but the habit of prefixing literally everything with a namespace - even stuff from the standard library - is very much due to C++&rsquo;s issues with <code>#include</code>. In a language where you can control what you import from a module and even specify your own namespace for it independent of what the module specifies, I don&rsquo;t believe the habit is necessary. Rust code uses <code>Vec</code> over <code>std::Vec</code>, Zig allows custom namespaces via <code>const whatever = @import(&quot;std&quot;)</code>, and Go just uses the package name as the qualifier even with its standard library, like with <code>fmt.Println</code>.</p>
<h2 id="significant-whitespace">Significant Whitespace</h2>
<p>On the topic of readability, I have found that I am a big fan of <strong>significant whitespace</strong>. Consider this code snippet in Nim:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">if</span> <span class="ow">not</span> <span class="n">isGameOver</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">snake</span><span class="p">.</span><span class="n">updateDirection</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">getTime</span><span class="p">()</span> <span class="o">-</span> <span class="n">lastTick</span> <span class="o">&gt;=</span> <span class="n">tickRate</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">snake</span><span class="p">.</span><span class="n">advance</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">snake</span><span class="p">.</span><span class="n">checkCollision</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">snake</span><span class="p">.</span><span class="n">head</span><span class="p">.</span><span class="n">position</span> <span class="o">==</span> <span class="n">apple</span><span class="p">.</span><span class="n">position</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">apple</span><span class="p">.</span><span class="n">goToRandPos</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="n">snake</span><span class="p">.</span><span class="n">grow</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">lastTick</span> <span class="o">=</span> <span class="n">getTime</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">apple</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">snake</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">let</span> <span class="n">scoreStr</span> <span class="o">=</span> <span class="o">$</span><span class="n">score</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="n">scoreFontWidth</span> <span class="o">=</span> <span class="mi">60</span>
</span></span><span class="line"><span class="cl">    <span class="n">drawText</span><span class="p">(</span><span class="n">scoreStr</span><span class="p">,</span> <span class="n">centerTextHorizontal</span><span class="p">(</span><span class="n">scoreStr</span><span class="p">,</span> <span class="n">scoreFontWidth</span><span class="p">),</span> <span class="mi">40</span><span class="p">,</span> <span class="n">scoreFontWidth</span><span class="p">,</span> <span class="n">White</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">endDrawing</span><span class="p">()</span>
</span></span></code></pre></div><p>And how it would look without significant whitespace:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">if</span> <span class="ow">not</span> <span class="n">isGameOver</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">snake</span><span class="p">.</span><span class="n">updateDirection</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">getTime</span><span class="p">()</span> <span class="o">-</span> <span class="n">lastTick</span> <span class="o">&gt;=</span> <span class="n">tickRate</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">snake</span><span class="p">.</span><span class="n">advance</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="n">snake</span><span class="p">.</span><span class="n">checkCollision</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">snake</span><span class="p">.</span><span class="n">head</span><span class="p">.</span><span class="n">position</span> <span class="o">==</span> <span class="n">apple</span><span class="p">.</span><span class="n">position</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">apple</span><span class="p">.</span><span class="n">goToRandPos</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">            <span class="n">snake</span><span class="p">.</span><span class="n">grow</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="n">lastTick</span> <span class="o">=</span> <span class="n">getTime</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">apple</span><span class="p">.</span><span class="n">draw</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">snake</span><span class="p">.</span><span class="n">draw</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">let</span> <span class="n">scoreStr</span> <span class="o">=</span> <span class="o">$</span><span class="n">score</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="n">scoreFontWidth</span> <span class="o">=</span> <span class="mi">60</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">drawText</span><span class="p">(</span><span class="n">scoreStr</span><span class="p">,</span> <span class="n">centerTextHorizontal</span><span class="p">(</span><span class="n">scoreStr</span><span class="p">,</span> <span class="n">scoreFontWidth</span><span class="p">),</span> <span class="mi">40</span><span class="p">,</span> <span class="n">scoreFontWidth</span><span class="p">,</span> <span class="n">White</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">endDrawing</span><span class="p">();</span>
</span></span></code></pre></div><p>You may be inclined to disagree, but I personally do <em>not</em> find that the braces <code>{}</code> and semicolons <code>;</code> help with readability. If anything, they add visual noise and make it harder to read, and make writing code more prone to errors that waste compilation cycles.</p>
<p>You will also notice that despite using braces, we still conventionally use the same indentation; and despite using using semicolons, we still conventionally put statements on the same lines. And that is only by <strong>convention</strong>, which can of course be ignored.</p>
<p>A key benefit of significant whitespace is that it forces code to be much more uniform, which is something to be appreciated. It&rsquo;s the reason that many modern languages enforce formatting rules despite them not benefitting the compiler. And while I understand that significant whitespace is more difficult to parse, modern computer hardware should be at the stage where the impact on compilation times is minimal, or so I assume given languages like Python, Haskell, and Nim exist.</p>
<p>However, Nim also opts to force spaces over tabs which I am less happy about. I don&rsquo;t see same-width indentation being particularly important - I didn&rsquo;t like it in Haskell either, and my opinion wouldn&rsquo;t change unless I see examples of where it actually matters for readability. Instead, I&rsquo;d advocate for enforcing tabs. Really, it&rsquo;s just an accessibility feature that allows people to personally customise their tab widths when reading anyone&rsquo;s code.</p>
<h2 id="camelcase">camelCase</h2>
<p>Speaking of spacing, camelCase has grown on me due to its compactness. Initially, especially due to coming from C++, I hated camelCase and much preferred to use snake_case, going out of my way to use it in Unity with C# for a while before realising I was fighting the compiler and causing myself unnecessary aids.</p>
<p>Since then, I&rsquo;ve come to actually like camelCase simply because it is much more compact than snake_case. This has become particularly true as a result of me trying to use better variable names. For example, <code>go_to_rand_pos()</code> becomes <code>goToRandPos()</code>, and <code>is_game_over</code> becomes <code>isGameOver</code>.</p>
<p>Perhaps you do not see the appeal, but is it not strange that even in languages like C++, programmers opt to use PascalCase for things like user-defined types? You almost never see Whatever_This_Case_Is_Called because it looks quite weird. It also means that the underscore <code>_</code> can be reserved for something else in identifiers, although I can&rsquo;t imagine what right now.</p>
<p>The only real annoyance with camelCase is in the less-rare-than-you&rsquo;d-expect instances where you want to add/remove a word at the start of an identifier, like <code>position</code> to <code>newPosition</code>. It&rsquo;s minor, but worth mentioning.</p>
<h2 id="object-oriented-programming">Object-Oriented Programming</h2>
<p>So far, I&rsquo;ve had a lot of good things to say about Nim. But unfortunately, this negative is a real deal-breaker for me, and honestly makes me quite sad :(</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">type</span> <span class="n">Snake</span> <span class="o">=</span> <span class="k">object</span>
</span></span><span class="line"><span class="cl">    <span class="n">head</span><span class="p">:</span> <span class="k">ptr</span> <span class="n">SnakePiece</span>
</span></span><span class="line"><span class="cl">    <span class="n">body</span><span class="p">:</span> <span class="kt">array</span><span class="o">[</span><span class="mf">0</span><span class="p">..</span><span class="mi">512</span><span class="p">,</span> <span class="n">SnakePiece</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">length</span><span class="p">:</span> <span class="n">uint32</span>
</span></span><span class="line"><span class="cl">    <span class="n">oldDirection</span><span class="p">:</span> <span class="n">Direction</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">newSnake</span><span class="p">(</span><span class="n">startPos</span><span class="p">:</span> <span class="n">Vector2</span><span class="p">):</span> <span class="n">Snake</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="k">addr</span> <span class="n">result</span><span class="p">.</span><span class="n">body</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">length</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">head</span><span class="p">.</span><span class="n">position</span> <span class="o">=</span> <span class="n">startPos</span>
</span></span><span class="line"><span class="cl">    <span class="n">result</span><span class="p">.</span><span class="n">head</span><span class="p">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">right</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">grow</span><span class="p">(</span><span class="n">self</span><span class="p">:</span> <span class="kd">var</span> <span class="n">Snake</span><span class="p">)</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">self</span><span class="p">.</span><span class="n">length</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="n">self</span><span class="p">.</span><span class="n">body</span><span class="o">[</span><span class="n">self</span><span class="p">.</span><span class="n">length</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span><span class="p">.</span><span class="n">position</span> <span class="o">=</span> <span class="n">Vector2</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="o">-</span><span class="mf">1000.0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="o">-</span><span class="mf">1000.0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">score</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">draw</span><span class="p">(</span><span class="n">self</span><span class="p">:</span> <span class="n">Snake</span><span class="p">)</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="mi">0</span> <span class="p">..</span> <span class="n">self</span><span class="p">.</span><span class="n">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">self</span><span class="p">.</span><span class="n">body</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span>
</span></span></code></pre></div><p>Nim supports <a href="https://en.wikipedia.org/wiki/Object-oriented_programming"
	
		target="_blank" rel="noopener noreferrer"
	>OOP</a>
. In fact, it supports the bad version of OOP as it outright supports inheritance via <code>ref object of</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">type</span>
</span></span><span class="line"><span class="cl">  <span class="n">Person</span> <span class="o">=</span> <span class="k">ref</span> <span class="k">object</span> <span class="k">of</span> <span class="n">RootObj</span>
</span></span><span class="line"><span class="cl">    <span class="n">name</span><span class="o">*</span><span class="p">:</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="n">age</span><span class="p">:</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">Student</span> <span class="o">=</span> <span class="k">ref</span> <span class="k">object</span> <span class="k">of</span> <span class="n">Person</span> <span class="c"># Student inherits from Person</span>
</span></span><span class="line"><span class="cl">    <span class="n">id</span><span class="p">:</span> <span class="kt">int</span>
</span></span></code></pre></div><blockquote>
<p><em>For reference, the &ldquo;good&rdquo; version of OOP is akin to what Rust does with type traits and <code>impl</code>.</em></p></blockquote>
<p>And yet despite this, Nim has&hellip; outright terrible <strong>encapsulation</strong>!</p>
<p>It goes down the C path of not allowing methods nested within or attached to structs. Instead, it makes use of global <strong>dot syntax</strong> such that <code>foo.bar()</code> is analogous to <code>bar(foo)</code>. Already this is an issue as it means there are two or more ways to do the exact same thing - not good.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">add</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="kt">int</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="kt">int</span><span class="p">):</span> <span class="kt">int</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="n">add</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="mf">3.</span><span class="n">add</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="mf">4.</span><span class="n">add</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://play.nim-lang.org/#pasty=DiYlYmQy">Run this code!</a>
</div>

<p>And then the language tries to rely solely on this feature! So the only way to actually associate procedures with a struct is by making the type of the first parameter said struct. This means the functions can be defined literally anywhere, making them hard to track - especially because the order of declaration matters in Nim!! This ended up being a big annoyance for me and is the main reason I couldn&rsquo;t be bothered with splitting my project across multiple source files. Apparently it&rsquo;s something to do with metaprogramming, but given that other languages cope fine with order-independence, I don&rsquo;t quite understand why Nim has it be this way.</p>
<p>And then to top it all off, because the only way to get makeshift struct methods is via this dot syntax, you cannot have <strong>static</strong> struct procedures. That means no <code>Foo::new()</code> or <code>Foo::from(bar)</code>, patterns I love in Rust. Instead, static constructors that return a struct object are declared as <code>newFoo()</code> (and only by convention).</p>
<p>I would have much rather have liked to have seen something more akin to Rust&rsquo;s way of doing it, and I hope I come across a language with Nim/Python-like syntax that does someday. I don&rsquo;t like the term &ldquo;OOP&rdquo; because it has bad connotations, but the core idea of encapsulating not just data but abstraction in objects is so fundamental to how we operate as humans. A language which messes up this feature is doomed to only appeal to C programmers, I fear (<em>ahem</em> Odin).</p>
<h2 id="final-thoughts">Final Thoughts</h2>
<p>So, as much as I appreciated a lot about Nim, I unfortunately can&rsquo;t see myself continuing to use it when other options exist. The extent of its fun is limited due to its issues with OOP, and honestly I would probably have a better experience using Python at that point.</p>
<p>What&rsquo;s more, I tried compiling my Snake game to <a href="https://webassembly.org"
	
		target="_blank" rel="noopener noreferrer"
	>WASM</a>
 (since I&rsquo;m on Arch Linux), but the process turned out to be more struggle than I could be bothered to put up with at the time. It didn&rsquo;t help that, a) the documentation on Nim is limited compared to other communities, and b) the compiler honestly isn&rsquo;t great at reporting errors in a way that&rsquo;s easy to understand.</p>
<p>I will say though, for the short time I did use it, it was fun and quite refreshing trying out Nim, and it helps that I had a clear, simple project in mind that I could use Raylib for. It&rsquo;s important that new languages are made that deviate from conventional syntax and practices because it allows us to try and test new things. Haskell sure as hell isn&rsquo;t a lovely language to use (despite what FP purists may try and tell you), but it is jam-packed with so many cool, novel, and useful features that helped lead to languages like Rust and Zig today.</p>
<p>So although I don&rsquo;t see Nim or Odin competing with the likes of Rust, Zig, and modern C++, I do appreciate them merely for existing. And hey, this was a good excuse for me to make a Snake game. The next time I do something like this, I&rsquo;ll try harder to compile it to WASM so I can embed it into the article&hellip;</p>
]]></content:encoded></item><item><title>Compile-Time Embedding with #include</title><link>https://kojobailey.me/posts/cpp-comptime-embedding/</link><pubDate>Sat, 21 Mar 2026 16:58:00 +0000</pubDate><author>kojomolojo@gmail.com (Kojo Bailey)</author><guid>https://kojobailey.me/posts/cpp-comptime-embedding/</guid><description>&lt;p>Although executing code at &lt;strong>compile-time&lt;/strong> is not a new idea by any means, the &lt;a href="https://ziglang.org"
target="_blank" rel="noopener noreferrer"
>Zig&lt;/a>
programming language popularised the term &lt;strong>&lt;a href="https://zig.guide/language-basics/comptime/"
target="_blank" rel="noopener noreferrer"
>comptime&lt;/a>
&lt;/strong>, and has brought a lot of eyes back on the topic by making it easier to use than in other languages.&lt;/p>
&lt;p>I personally haven&amp;rsquo;t taken the time to dabble in Zig yet - I&amp;rsquo;m already busy with &lt;a href="https://github.com/KojoBailey/japi-merging-rs"
target="_blank" rel="noopener noreferrer"
>Rust&lt;/a>
and &lt;a href="https://github.com/KojoBailey/cli-calculator-ocaml"
target="_blank" rel="noopener noreferrer"
>OCaml&lt;/a>
- but curious as I am, I particularly wanted to know if &lt;strong>files&lt;/strong> could be accessed at compile-time in the language I still know best: &lt;strong>C++&lt;/strong>.&lt;/p></description><content:encoded><![CDATA[<p>Although executing code at <strong>compile-time</strong> is not a new idea by any means, the <a href="https://ziglang.org"
	
		target="_blank" rel="noopener noreferrer"
	>Zig</a>
 programming language popularised the term <strong><a href="https://zig.guide/language-basics/comptime/"
	
		target="_blank" rel="noopener noreferrer"
	>comptime</a>
</strong>, and has brought a lot of eyes back on the topic by making it easier to use than in other languages.</p>
<p>I personally haven&rsquo;t taken the time to dabble in Zig yet - I&rsquo;m already busy with <a href="https://github.com/KojoBailey/japi-merging-rs"
	
		target="_blank" rel="noopener noreferrer"
	>Rust</a>
 and <a href="https://github.com/KojoBailey/cli-calculator-ocaml"
	
		target="_blank" rel="noopener noreferrer"
	>OCaml</a>
 - but curious as I am, I particularly wanted to know if <strong>files</strong> could be accessed at compile-time in the language I still know best: <strong>C++</strong>.</p>
<p>Turns out, the answer is&hellip; yes! Although, surprising to me, it&rsquo;s not through some <code>constexpr</code> version of <code>std::ifstream</code>.</p>
<h2 id="some-context">Some Context</h2>
<p>Instead, we can turn to a new feature in <a href="https://en.cppreference.com/w/c/23.html"
	
		target="_blank" rel="noopener noreferrer"
	>C23</a>
 <em>and</em> <a href="https://en.cppreference.com/w/cpp/26.html"
	
		target="_blank" rel="noopener noreferrer"
	>C++26</a>
: the <a href="https://en.cppreference.com/w/c/preprocessor/embed"
	
		target="_blank" rel="noopener noreferrer"
	><code>#embed</code></a>
 preprocessor directive. It allows file data to be embedded into a program at compile-time like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">foo</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="cp">#embed &#34;foo.dat&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="p">};</span>
</span></span></code></pre></div><p>and even allows data to be read directly into structs!</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">T</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">e</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">;</span> <span class="p">}</span> <span class="n">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">double</span> <span class="n">h</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">T</span> <span class="n">x</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="c1">// well-formed if the directive produces nine or fewer values
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#embed &#34;s.dat&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="p">};</span>
</span></span></code></pre></div><p>There are also optional <a href="https://en.cppreference.com/w/cpp/preprocessor/embed.html#Embed_parameters"
	
		target="_blank" rel="noopener noreferrer"
	>embed parameters</a>
 for even more power; and all-in-all, this is a welcome alternative to encoding file data into scripts manually. Plus, it better allows compilers to make optimisations!</p>
<p>However, although <code>#embed</code> is a nice solution to embedding files for the timebeing, it is still a <strong>preprocessor</strong>, which we in C++ would rather avoid.</p>
<p>The &ldquo;proper&rdquo; C++ alternative is proposed via <a href="https://thephd.dev/_vendor/future_cxx/papers/d1040.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>std::embed</code></a>
 by the same author of <code>#embed</code>, <a href="https://thephd.dev/about/"
	
		target="_blank" rel="noopener noreferrer"
	>JeanHeyd Meneide</a>
, and was actually first proposed <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1040r0.html"
	
		target="_blank" rel="noopener noreferrer"
	>back in 2018</a>
 - although perhaps this shouldn&rsquo;t come as a surprise considering C++ is far from the easiest language to design and implement new features for.</p>
<p>Although there&rsquo;s a lot more to be said about these features, I want to focus this article on something&hellip; a bit less useful (obsolete even) - another, rather fun way to embed data. A method <em>without</em> <code>#embed</code>, <code>std::embed</code>, special conversion tools, or manually copying bytes by hand!</p>
<h2 id="the-power-of-the-preprocessor">The Power of the Preprocessor</h2>
<p>The <a href="https://en.cppreference.com/w/cpp/preprocessor/include.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>#include</code></a>
 preprocessor is a relic of C&rsquo;s past that C++ is only recently beginning to escape from, with popular compilers slowly but surely implementing C++20&rsquo;s new <a href="https://en.cppreference.com/w/cpp/language/modules.html"
	
		target="_blank" rel="noopener noreferrer"
	>modules</a>
 system. After all C&rsquo;s old include system is widely considered to be glorified copy-paste, leaving C++ programmers to struggle with header guards, namespaces, and build times manually.</p>
<p>However, because <code>#include</code> effectively just copies a file&rsquo;s contents directly into a C++ file - regardless of the file&rsquo;s type - we can exploit this to load more than just header files, and at compile-time!</p>
<p>But there is an obvious drawback: the content that is pasted into our C++ script has to be valid C++ code. Therefore, a reliable way to have this work for any arbitrary data is to include it as a C++ string literal. This is because C strings are nothing more than <code>char</code> arrays, where each <code>char</code> represents a single byte, thus acting as a suitable container for binary-encoded data.</p>
<p>For instance, the following program encodes some binary data:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdint&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">data</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;</span><span class="se">\x64\0\0\0\0\0\x20\x40\x31\x6A\x6E\x74\x30\x31\0\0</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Character</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="kt">uint32_t</span> <span class="n">hp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">float</span> <span class="n">speed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">id</span><span class="p">[</span><span class="mi">8</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Assume little endian.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">Character</span> <span class="n">character</span> <span class="o">=</span> <span class="o">*</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">Character</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">data</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="s">&#34;Character ID: &#34;</span>    <span class="o">&lt;&lt;</span> <span class="n">character</span><span class="p">.</span><span class="n">id</span>    <span class="o">&lt;&lt;</span> <span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="s">&#34;Character HP: &#34;</span>    <span class="o">&lt;&lt;</span> <span class="n">character</span><span class="p">.</span><span class="n">hp</span>    <span class="o">&lt;&lt;</span> <span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="s">&#34;Character Speed: &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">character</span><span class="p">.</span><span class="n">speed</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/jGMxsvxqY">Run this code!</a>
</div>

<p><strong>Expected output:</strong></p>
<pre tabindex="0"><code>Character ID: 1jnt01
Character HP: 100
Character Speed: 2.5
</code></pre><p>So, seeing as that works, let&rsquo;s <code>#include</code> a file in place of the string:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">data</span><span class="p">[]</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="cp">#include</span> <span class="cpf">&#34;1jnt01.bin&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="p">;</span>
</span></span></code></pre></div><p>Fairly straightforward, although because there is no way (that I could find, anyway) to wrap the include in a string from the C++ file itself, we need to add it to the binary file directly. As a result, it&rsquo;s important we format the data as a <strong>raw string literal</strong>, since then we don&rsquo;t need to worry about random <code>&quot;</code> characters in the middle of the data breaking our string.</p>
<p>More specifically, we should use a prefix that is highly unlikely to show up randomly elsewhere in the data, like <code>R&quot;CEmbd(</code>. Notice that this is also 8 characters/bytes long, which is because we should maintain 64-bit alignment. This in turn gives a suffix of 7 bytes, <code>)CEmbd&quot;</code>, for a total of 15 bytes of boilerplate - not particularly expensive.</p>
<p>To better illustrate what I&rsquo;m on about, let&rsquo;s construct a simple example with a file <code>hello.bin</code> that contains the following content:</p>
<pre tabindex="0"><code>R&#34;CEmbd(Hello, &#34;world&#34;!)CEmbd&#34;
</code></pre><p>which we include in a program like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">data</span><span class="p">[]</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="cp">#include</span> <span class="cpf">&#34;hello.bin&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="p">;</span>
</span></span></code></pre></div><p>which, after the preprocessor includes the file, will result in:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">data</span><span class="p">[]</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">    <span class="n">R</span><span class="s">&#34;CEmbd(Hello, &#34;</span><span class="n">world</span><span class="s">&#34;!)CEmbd&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">;</span>
</span></span></code></pre></div><p>which is equivalent to:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">data</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;Hello, </span><span class="se">\&#34;</span><span class="s">world</span><span class="se">\&#34;</span><span class="s">!&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>And that&rsquo;s it! We have successfully embedded data from a non-C++ file into our C++ code. This method should work for any binary data that includes the proper raw string wrapping, whether edited to include it or designed as some kind of special data format (wouldn&rsquo;t that be interesting!).</p>
<p>If you want to see a more practical example (with better visual aid), then feel free to check out this video:</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LZXAx-s42PE?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="why">Why?</h2>
<p><code>#embed</code> is already making its way into C++26, and <code>std::embed</code> may eventually be added as well, rendering this method as obsolete for anyone on the latest standard. Not to mention, the major drawback of using <code>#include</code> to embed is that you&rsquo;d need to edit existing files to add the raw string wrapper.</p>
<p>That being said, for anyone on a version before C++26 who doesn&rsquo;t want to have to convert their file to C++ source code every time they swap or edit it, this is one such solution. And don&rsquo;t get me wrong - this isn&rsquo;t some revolutionary discovery. I wouldn&rsquo;t be surprised if some developer somewhere at some point in history has ended up genuinely making use of this hack because of their needs. Nevertheless, for developers that do have access to <code>#embed</code>, it is clearly the better option. Ergonomics aside, the additional performance benefits make it a true no-brainer.</p>
<p>Nevertheless, this was as interesting idea to test out, and I&rsquo;m honestly surprised it worked so smoothly in the first place. C++ is full of strange features (I imagine largely unintentionally so) and it&rsquo;s fun to see how they can be used in creative, sometimes mildly useful ways. With more compile-time features coming soon<sup>TM</sup> to C++, including <strong>reflection</strong>, I very much look forward to seeing what else becomes possible!</p>
]]></content:encoded></item><item><title>Perfectly Readable C++</title><link>https://kojobailey.me/posts/perfectly-readable-cpp/</link><pubDate>Mon, 02 Mar 2026 21:07:00 +0000</pubDate><author>kojomolojo@gmail.com (Kojo Bailey)</author><guid>https://kojobailey.me/posts/perfectly-readable-cpp/</guid><description>&lt;p>&lt;a href="https://en.wikipedia.org/wiki/C%2B%2B"
target="_blank" rel="noopener noreferrer"
>C++&lt;/a>
is full of weird features, quirks, and historical artefacts. This is in part due to its aim to have classic &lt;a href="https://en.wikipedia.org/wiki/C_%28programming_language%29"
target="_blank" rel="noopener noreferrer"
>C&lt;/a>
code be valid under the C++ standard from day one. It is also due to the fact that C++ was &lt;a href="https://en.cppreference.com/w/cpp/language/history.html"
target="_blank" rel="noopener noreferrer"
>first published in 1985&lt;/a>
, and has naturally been filled with all sorts of features, good and bad, over the past 40+ years.&lt;/p>
&lt;p>As someone interested in programming language design, I&amp;rsquo;ve taken an interest in some of these features, eager to see just how hilariously difficult to read C++ code can be.&lt;/p></description><content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/C%2B%2B"
	
		target="_blank" rel="noopener noreferrer"
	>C++</a>
 is full of weird features, quirks, and historical artefacts. This is in part due to its aim to have classic <a href="https://en.wikipedia.org/wiki/C_%28programming_language%29"
	
		target="_blank" rel="noopener noreferrer"
	>C</a>
 code be valid under the C++ standard from day one. It is also due to the fact that C++ was <a href="https://en.cppreference.com/w/cpp/language/history.html"
	
		target="_blank" rel="noopener noreferrer"
	>first published in 1985</a>
, and has naturally been filled with all sorts of features, good and bad, over the past 40+ years.</p>
<p>As someone interested in programming language design, I&rsquo;ve taken an interest in some of these features, eager to see just how hilariously difficult to read C++ code can be.</p>
<p>In this article, I intend to showcase some of these features in action, and so I present you with the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="o">%:</span><span class="n">import</span> <span class="s">&#34;bits/stdc++.h&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="o">&lt;::&gt;</span><span class="p">)</span> <span class="k">noexcept</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="o">&lt;:</span><span class="nl">_</span><span class="p">:</span><span class="o">&gt;</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">&lt;%</span><span class="n">C</span><span class="o">++%&gt;</span><span class="p">,</span> <span class="n">not</span> <span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/M8aWz1raE">Run this code!</a>
</div>

<p>I wrote this code while playing around with <a href="https://compiler.gg"
	
		target="_blank" rel="noopener noreferrer"
	>compiler.gg</a>
 which uses <a href="https://godbolt.org"
	
		target="_blank" rel="noopener noreferrer"
	>Godbolt&rsquo;s Compiler Explorer</a>
. It is intended to be compiled in that environment, so if you want to test it yourself, do so via <a href="https://godbolt.org/clientstate/eyJzZXNzaW9ucyI6W3siaWQiOjAsImxhbmd1YWdlIjoiYysrIiwic291cmNlIjoiJTppbXBvcnQgXCJpb3N0cmVhbVwiXG5hdXRvIG1haW4ocmVnaXN0ZXIgaW50KEMpLCBjb25zdCBjaGFyKihfKTw6Oj4pIG5vZXhjZXB0IC0&#43;IGludCB7XG4gIHJldHVybiBvcGVyYXRvcjw8KHN0ZDo6d2Nsb2csICooQyBePSAwNzQxNDQsIE5VTEw8Ol86PiArIDkpKVxuICAgIDw8ICh0eXBlb2YoKl8pKW5ldyB2b2xhdGlsZSBjb25zdCBzaWduZWQgbG9uZyBsb25nPCVDKyslPiwgbm90IHRydWU7XG59XG4iLCJjb21waWxlcnMiOlt7ImlkIjoiZzE1MiIsIm9wdGlvbnMiOiIifV0sImV4ZWN1dG9ycyI6W3siYXJndW1lbnRzIjoiIiwiY29tcGlsZXIiOnsiaWQiOiJnMTUyIiwibGlicyI6W10sIm9wdGlvbnMiOiIifSwic3RkaW4iOiIifV19XX0="
	
		target="_blank" rel="noopener noreferrer"
	>this link</a>
 with the &ldquo;x86-64 gcc 15.2&rdquo; compiler option.</p>
<p>Now, what this code does is simple: It outputs &ldquo;sex&rdquo; to the console.</p>
<p>How it goes about it&hellip; is less simple, and is what I will attempt to explain in the rest of this article! As I do so though, I invite you to also try and figure things out yourself to test your understanding of C and C++!</p>
<h2 id="digraphs">Digraphs</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/operator_alternative.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/operator_alternative.html</a>
</p></blockquote>
<p>Right away, we are met with this strange <code>%:</code> pair of symbols, and similar symbols like <code>&lt;: :&gt;</code> and <code>&lt;% %&gt;</code> can be seen later in the code as well.</p>
<p>Such symbols are called <strong>digraphs</strong> - as in &ldquo;double symbol&rdquo; - and act as alternative ways to write common symbols for keyboards/systems that do not support <a href="https://en.wikipedia.org/wiki/ASCII"
	
		target="_blank" rel="noopener noreferrer"
	>ASCII</a>
. In particular, this is to comply with the <a href="https://en.wikipedia.org/wiki/ISO/IEC_646"
	
		target="_blank" rel="noopener noreferrer"
	>ISO 646</a>
 7-bit character set, which lacks common symbols that you may be familiar with as a programmer.</p>
<p>C&rsquo;s digraphs include:</p>
<ul>
<li><code>%:</code> = <code>#</code></li>
<li><code>&lt;:</code> = <code>[</code></li>
<li><code>:&gt;</code> = <code>]</code></li>
<li><code>&lt;%</code> = <code>{</code></li>
<li><code>%&gt;</code> = <code>}</code></li>
</ul>
<p>Furthermore, rather than use a digraph for the not operator, <code>!</code>, C includes the <code>not</code> keyword, which can be see towards the end of this code in <code>not true</code>.</p>
<p>Replacing all these alternative representations with their &ldquo;normal&rdquo; ASCII counterparts already helps to make the code a lot more readable:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#import &#34;bits/stdc++.h&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">auto</span> <span class="nf">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="k">noexcept</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="bonus-trigraphs">Bonus: Trigraphs</h3>
<p>C++ also used to support <strong>trigraphs</strong> <a href="https://en.wikipedia.org/wiki/C%2B%2B17#Removed_features"
	
		target="_blank" rel="noopener noreferrer"
	>up until C++17</a>
. These functioned similar to digraphs, except were parsed before both comments and string literals, leading to some funky situations such as <code>&quot;Enter date ??/??/??&quot;</code> becoming <code>&quot;Enter date \\??&quot;</code>, hence their eventual removal.</p>
<p>Some of these trigraphs were:</p>
<ul>
<li><code>??&lt;</code> = <code>{</code></li>
<li><code>??&gt;</code> = <code>}</code></li>
<li><code>??(</code> = <code>[</code></li>
<li><code>??)</code> = <code>]</code></li>
<li><code>??=</code> = <code>#</code></li>
<li><code>??/</code> = <code>\</code></li>
</ul>
<p>That being said, GCC does still include trigraphs as an opt-in feature via the <code>-trigraphs</code> flag - and I must admit, I&rsquo;m quite tempted to use them for stylised includes.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="o">??=</span><span class="n">include</span><span class="o">&lt;</span><span class="n">stdio</span><span class="p">.</span><span class="n">h</span><span class="o">&gt;</span>
</span></span></code></pre></div><h2 id="import"><code>#import</code></h2>
<blockquote>
<p><a href="https://gcc.gnu.org/onlinedocs/cpp/Alternatives-to-Wrapper-_0023ifndef.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://gcc.gnu.org/onlinedocs/cpp/Alternatives-to-Wrapper-_0023ifndef.html</a>
</p></blockquote>
<p>Those who have been keeping up with modern C++ should recognise the <code>import</code> keyword, used to import <a href="https://en.cppreference.com/w/cpp/language/modules.html"
	
		target="_blank" rel="noopener noreferrer"
	>modules</a>
 as an alternative to classic header includes.</p>
<p>However, <code>#import</code> is not to be confused with this, and goes way back to the 80s/90s when GCC implemented support for <a href="https://www.trevorlasn.com/blog/objective-c-is-the-ugliest-programming-language-and-a-total-abomination"
	
		target="_blank" rel="noopener noreferrer"
	>Objective-C</a>
. While also an alternative to <code>#include</code>, its function is to ensure that a header is only included in a project once. Although, this feature was later deprecated as it became agreed that it&rsquo;s better that the header file is responsible for whether or not it is included multiple times. Hence, developers nowadays are instead expected to either use <code>#ifndef</code> guards (generally recommended) or <code>#pragma once</code> (not standard) - or soon, perhaps, modules!</p>
<p>In the case of our code, there aren&rsquo;t multiple source files anyway, so <code>#import</code> is synonymous with <code>#include</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;bits/stdc++.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="nf">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="k">noexcept</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="bitsstdch"><code>bits/stdc++.h</code></h2>
<blockquote>
<p><a href="https://stackoverflow.com/questions/25311011/how-does-include-bits-stdc-h-work-in-c"
	
		target="_blank" rel="noopener noreferrer"
	>https://stackoverflow.com/questions/25311011/how-does-include-bits-stdc-h-work-in-c</a>
</p></blockquote>
<p><a href="https://stackoverflow.com/questions/25311011/how-does-include-bits-stdc-h-work-in-c"
	
		target="_blank" rel="noopener noreferrer"
	><code>bits/stdc++.h</code></a>
 is essentially a header that includes all the C and C++ headers, useful for quick testing, and especially useful for precompiled headers. Otherwise, though, it unsurprisingly slows down compilation, and it&rsquo;s better to just include the independent headers that are actually used. In our case, all we&rsquo;re doing is using <code>std::wclog</code> which comes from <code>iostream</code>, so we can just include that instead.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;iostream&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="nf">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="k">noexcept</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Moreover, we can replace the <code>&quot;&quot;</code> around <code>iostream</code> with the more typical <code>&lt;&gt;</code> as the only real difference in this case is expressing intention. This change signifies that <code>iostream</code> is an external header that is independent of our project:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="nf">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="k">noexcept</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="trailing-return-type">Trailing return type</h2>
<blockquote>
<p><a href="https://en.wikipedia.org/wiki/Trailing_return_type"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.wikipedia.org/wiki/Trailing_return_type</a>
</p></blockquote>
<p><strong>Trailing return types</strong> have been supported since C++11, which can make functions more readable in some cases via the syntax <code>auto foo() -&gt; T {}</code>, reminiscent of <a href="https://rust-lang.org/"
	
		target="_blank" rel="noopener noreferrer"
	>Rust</a>
&rsquo;s:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rs" data-lang="rs"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">foo</span><span class="p">(</span><span class="n">x</span>: <span class="kt">u32</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="kt">u32</span> <span class="p">{</span><span class="w"> </span><span class="cm">/* ... */</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>Generally-speaking, trailing return types have 3 main uses:</p>
<ol>
<li>Return type with <a href="https://en.cppreference.com/w/cpp/language/decltype.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>decltype</code></a>
 (in C++11), before <code>decltype(auto)</code> was around (added in C++14):</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">A</span><span class="p">,</span> <span class="k">typename</span> <span class="n">B</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">add</span><span class="p">(</span><span class="n">A</span> <span class="n">a</span><span class="p">,</span> <span class="n">B</span> <span class="n">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">);</span>
</span></span></code></pre></div><ol start="2">
<li><a href="https://en.cppreference.com/w/cpp/language/lambda.html"
	
		target="_blank" rel="noopener noreferrer"
	>Lambda expressions</a>
 (also introduced in C++11).</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">f</span> <span class="o">=</span> <span class="p">[](</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">double</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="p">;</span> <span class="p">};</span>
</span></span></code></pre></div><ol start="3">
<li>Readability of more complex types.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">template</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">integral</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">expected</span><span class="o">&lt;</span><span class="n">BinaryView</span><span class="o">::</span><span class="n">Error</span><span class="p">,</span> <span class="n">T</span><span class="o">&gt;</span> <span class="n">BinaryView</span><span class="o">::</span><span class="n">read</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">endian</span> <span class="n">endian</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">template</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">integral</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">BinaryView</span><span class="o">::</span><span class="n">read</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">endian</span> <span class="n">endian</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">expected</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">BinaryView</span><span class="o">::</span><span class="n">Error</span><span class="o">&gt;</span><span class="p">;</span>
</span></span></code></pre></div><p>In the case of <code>main</code>, the return type is just <code>int</code>, and so using a trailing return type is nothing but stylistic choice. Although I personally don&rsquo;t enforce trailing return types in my code unless I&rsquo;m using something verbose like <a href="https://en.cppreference.com/w/cpp/utility/expected.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>std::expected</code></a>
, I do see why some programmers choose to use them in every function for consistency&rsquo;s sake.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="k">noexcept</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="noexcept"><code>noexcept</code></h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/noexcept_spec.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/noexcept_spec.html</a>
</p></blockquote>
<p>In short, <code>noexcept</code> as a specifier tells the compiler that a function will not attempt to propagate exceptions outwards - i.e., any exceptions that are propagated into the function are caught. This enables the compiler to make some optimisations as a result, but if the <code>noexcept</code> promise is broken, <a href="https://en.cppreference.com/w/cpp/error/terminate.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>std::terminate</code></a>
 is called instead, exiting the program.</p>
<p>So is there any point in tagging <code>main</code> with <code>noexcept</code>? Well, no, because <code>main</code> will exit if it has a propagating exception anyway. Therefore, it serves no real purpose here:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="register"><code>register</code></h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/storage_duration.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/storage_duration.html</a>
</p></blockquote>
<p>The <code>register</code> keyword is an artefact of a time when compilers weren&rsquo;t as intelligent as they are now; the first time I ever saw it used was in the <a href="https://github.com/id-Software/DOOM/blob/a77dfb96cb91780ca334d0d4cfd86957558007e0/linuxdoom-1.10/am_map.c#L978"
	
		target="_blank" rel="noopener noreferrer"
	>DOOM codebase</a>
 of all places.</p>
<img src="images/DOOM.png" height="400px"/>
<p>What <code>register</code> does is signal to the compiler that a declared variable is going to be heavily used and should therefore be stored directly in a <a href="https://en.wikipedia.org/wiki/Processor_register"
	
		target="_blank" rel="noopener noreferrer"
	>CPU register</a>
 if possible, as registers are significantly faster than memory stores.</p>
<p>However, the keyword was deprecated as of C++11 and outright removed in C++17, as compilers are allowed to ignore this hint if needed, and they can generally decide when a variable should be in a register more reliably than a human can. Therefore, we have no need for it here:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Additionally, 64-bit systems primarily use the <a href="https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170"
	
		target="_blank" rel="noopener noreferrer"
	>fast-call</a>
 convention which puts the first 4 arguments of a function into CPU registers anyway, so using <code>register</code> on the 1st argument of a function like this really is pointless.</p>
<h2 id="parenthesised-declarators">Parenthesised declarators</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/declarations.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/declarations.html</a>
</p></blockquote>
<p>C++ supports <strong>parenthesised declarators</strong> to help with disambiguation in certain contexts, although can also be used in other contexts too. For instance, the following code is valid C++:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">int</span><span class="p">((((((((</span><span class="n">a</span><span class="p">))))))))</span><span class="o">=</span><span class="mi">5</span><span class="p">;</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/n7re33oaf">Run this code!</a>
</div>

<p>More useful cases include:</p>
<ol>
<li>Function pointers</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">int</span> <span class="o">*</span><span class="nf">f</span><span class="p">();</span>   <span class="c1">// A function that returns int*
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="p">(</span><span class="o">*</span><span class="n">f</span><span class="p">)();</span> <span class="c1">// A pointer to a function that returns int
</span></span></span></code></pre></div><ol start="2">
<li>Array pointers</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">int</span> <span class="o">*</span><span class="n">a</span><span class="p">[</span><span class="mi">23</span><span class="p">];</span>   <span class="c1">// An array of 23 int*&#39;s
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">)[</span><span class="mi">23</span><span class="p">];</span> <span class="c1">// A pointer to an array of 23 int&#39;s
</span></span></span></code></pre></div><p>There&rsquo;s also this funky case where the use of a constructor can be confused for a function declaration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">Foo</span> <span class="nf">bar</span><span class="p">(</span><span class="n">Baz</span><span class="p">());</span>   <span class="c1">// Could be a function that has a parameter for a function that returns Baz
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Foo</span> <span class="nf">bar</span><span class="p">((</span><span class="n">Baz</span><span class="p">()));</span> <span class="c1">// Unambiguous - simply takes the result of the function call Baz() in Foo&#39;s constructor
</span></span></span></code></pre></div><p>But C++11 added curly-brace initialisation for this exact reason, which I for one use religiously:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">Foo</span> <span class="n">bar</span><span class="p">{</span><span class="n">Baz</span><span class="p">()};</span>
</span></span></code></pre></div><p>In the context of our code, however, we don&rsquo;t need this disambiguation. The first parameter of <code>main</code> is simply an <code>int</code>, and the second is a <code>char*</code> array (<code>char**</code>), so the parenthesis just hurt readability and should be removed:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">C</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">_</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">_</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">C</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="underscore-identifier">Underscore identifier</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/identifiers.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/identifiers.html</a>
</p></blockquote>
<p>Ignoring funky unicode stuff, C++ <strong>identfiers</strong> (such as variable names) can me made up of uppercase and lowercase Latin letters (A-Z and a-Z), underscores, and the digits 0-9 except for as the first character. There are also reserved identifiers, like with keywords and patterns like <code>_Foo</code> and <code>__bar</code>. However, a single underscore, <code>_</code>, rather than be reserved for wildcard syntax as seen in <a href="https://www.haskell.org/onlinereport/lexemes.html"
	
		target="_blank" rel="noopener noreferrer"
	>Haskell</a>
 and <a href="https://doc.rust-lang.org/book/ch19-03-pattern-syntax.html"
	
		target="_blank" rel="noopener noreferrer"
	>Rust</a>
, manages to somehow slip through as a valid identifer. This means that <code>_</code> can be used as a variable name.</p>
<p>Furthermore, C++ function <a href="https://breese.github.io/2022/03/06/deducing-function-signatures.html"
	
		target="_blank" rel="noopener noreferrer"
	>type signatures</a>
 are independent of the names given to the function&rsquo;s parameters, hence we are able to change the typical <code>argc</code> to just <code>C</code> (in order to have <code>C++</code> later in the code!) and <code>argv</code> to <code>_</code>. Changing these names back to normal, we get:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">argv</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">argv</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>It is also worth noting that <code>const</code> can be used here without any issues as well. In fact, it is the first obfuscation so far that can actually be argued as idomatic C++, even if it is unusual! As such, I will choose leave it in.</p>
<h2 id="operator-overloading">Operator overloading</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/operators.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/operators.html</a>
</p></blockquote>
<p>Anyone who knows C++ should remember the first time they learned how to print to the terminal, using the <code>&lt;&lt;</code> operator as if constructing a conveyor belt for which to stream content into <code>std::cout</code>. Hopefully, with <a href="https://en.cppreference.com/w/cpp/io/println.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>std::println</code></a>
 slowly making its way into compilers, newcomers to C++ will never have to face this atrocity ever again. It is a textbook example of <strong>operator overloading</strong> gone wrong. At least, most would likely agree that overloading an operator to do something completely different from what it was originally intended to do is not a great idea, and we&rsquo;d be better of defining new operators instead (<a href="https://www.haskell.org/tutorial/monads.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>&gt;&gt;=</code></a>
 anyone?).</p>
<p><code>&lt;&lt;</code> is originally the <a href="https://en.cppreference.com/w/cpp/language/operator_arithmetic.html"
	
		target="_blank" rel="noopener noreferrer"
	>bitwise left shift</a>
 operator, used for&hellip; well, shifting <a href="https://en.wikipedia.org/wiki/Bit"
	
		target="_blank" rel="noopener noreferrer"
	>bits</a>
. It was unfortunate enough to have the <a href="https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/ostream.h"
	
		target="_blank" rel="noopener noreferrer"
	><code>ostream</code></a>
 header overload it with its own custom behaviour.</p>
<p>That being said, a cool quirk of operator overloading, is that it necessitates some way to&hellip; overload operators, and C++ provides this by making it possible to define operators as functions, their symbols prefixed with <code>operator</code> (e.g., <code>operator+</code> or <code>operator&lt;&lt;</code>).</p>
<p>This also means that when such an overload is defined, it can be <em>called</em> in this way too, hence the following code snippets are equivalent:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Hello, world!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="p">,</span> <span class="s">&#34;Hello, world!&#34;</span><span class="p">).</span><span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">);</span>
</span></span></code></pre></div><p>With this mind, we can once again make our code significantly easier to read:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">wclog</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">argv</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">argv</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="stdwclog"><code>std::wclog</code></h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/io/clog.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/io/clog.html</a>
</p></blockquote>
<p>But hold on, what is <code>std::wclog</code>? Shouldn&rsquo;t it be <code>std::cout</code> that writes to standard output?</p>
<p><code>std::clog</code> is similar to <code>std::cerr</code> in that they both write to <a href="https://en.cppreference.com/w/cpp/io/c/std_streams.html"
	
		target="_blank" rel="noopener noreferrer"
	>standard error</a>
 (stderr). However, unlike <code>std::cerr</code>, <code>std::clog</code> is not automatically <a href="https://en.cppreference.com/w/cpp/io/manip/flush.html"
	
		target="_blank" rel="noopener noreferrer"
	>flushed</a>
, which is important where performance-critical conditions.</p>
<p><code>std::wclog</code> is just the <a href="https://en.wikipedia.org/wiki/Wide_character#C/C&#43;&#43;"
	
		target="_blank" rel="noopener noreferrer"
	>wide char</a>
 version of this. Typically, a wide char is more than just 1 byte, but <code>std::wcout</code> and its variants all <strong>implicitly convert</strong> <code>char*</code> to <code>wchar_t*</code>. Therefore, both these code snippets have the same visual result when a wide char is 4 bytes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">static_assert</span><span class="p">(</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">wchar_t</span><span class="p">)</span> <span class="o">==</span> <span class="mi">4</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Snippet 1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">wchar_t</span><span class="o">*</span><span class="p">)</span><span class="s">&#34;b</span><span class="se">\0\0\0</span><span class="s">a</span><span class="se">\0\0\0</span><span class="s">z</span><span class="se">\0\0\0\0\0\0\0</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Snippet 2
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;baz&#34;</span><span class="p">;</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/cWf559nGn">Run this code!</a>
</div>

<p>Now, although it&rsquo;s not immediately obvious that our code uses normal <code>char*</code> as input to <code>std::wclog</code>, we can see that <code>(typeof(*argv))</code> is used as a cast (more on that later), which should evaluate to a <code>(char*)</code> cast. Therefore, it&rsquo;s fairly safe to assume that we can just use <code>std::cout</code> instead, and we&rsquo;ll also simplify the cast while we&rsquo;re at it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">argv</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">},</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="comma-operator">Comma operator</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/operator_other.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/operator_other.html</a>
</p></blockquote>
<p>One of my absolute favourite features of C is the <strong>comma operator</strong>, which I imagine many programmers aren&rsquo;t aware even exists. What I find so fascinating about it is that it is technically useful - potentially really useful in some contexts - but is nevertheless generally <em>bad</em> to use.</p>
<p>Not to be confused with the use of commas in other C/C++ contexts (e.g. lists), the comma operator forms an <strong>expression</strong> in which the left-hand argument(s) are evaluated with their results discarded, while the evaluation of the right-most argument is what the expression returns, eerily similar to the <code>&gt;&gt;</code> operator in Haskell, minus the <a href="https://wiki.haskell.org/Monad"
	
		target="_blank" rel="noopener noreferrer"
	>monads</a>
.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-haskell" data-lang="haskell"><span class="line"><span class="cl"><span class="c1">-- putStr returns an IO (), which main requires.</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span>
</span></span><span class="line"><span class="cl"><span class="nf">main</span> <span class="ow">=</span> <span class="n">putStr</span> <span class="s">&#34;Hello, &#34;</span> <span class="o">&gt;&gt;</span> <span class="n">putStr</span> <span class="s">&#34;world!&#34;</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/YevvPKq3v">Run this code!</a>
</div>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// main requires that an int be returned.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Hello, world!&#34;</span><span class="p">),</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/zxjxa5aMP">Run this code!</a>
</div>

<p>Some seemingly useful applications of this include:</p>
<ol>
<li>Multiple varable mutation in index-based <code>for</code> loops:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// Comma operator used             ↓ here only!  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">j</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">,</span> <span class="o">--</span><span class="n">j</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;i = &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; j = &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">j</span> <span class="o">&lt;&lt;</span> <span class="sc">&#39;\n&#39;</span><span class="p">;</span>
</span></span></code></pre></div><p><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/zb6fs1sz3">Run this code!</a>
</div>

2. Makeshift lambda expressions (not really):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">a</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> <span class="n">a</span> <span class="o">*=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">a</span> <span class="o">+=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">a</span> <span class="o">%=</span> <span class="mi">8</span><span class="p">,</span> <span class="n">a</span> <span class="o">^=</span> <span class="mi">23</span><span class="p">);</span>
</span></span></code></pre></div><p><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/aa86Tnnf4">Run this code!</a>
</div>

3. Logging in return statements:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">return</span> <span class="nf">LOG_ERROR</span><span class="p">(</span><span class="s">&#34;Division by zero.&#34;</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">nullopt</span><span class="p">;</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/jvjshx8sP">Run this code!</a>
</div>

<p>In our code, we are incidentally making use of that last example, logging before returning <code>!true</code>. If we instead opt to write this out as two separate lines, we get something more conventional and readable:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">[</span><span class="n">argv</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>But we&rsquo;re not done yet! There&rsquo;s another use of the operator within the dereference we have going on. Extracting this out to yet another line, things should be starting to make more sense:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="nb">NULL</span><span class="p">[</span><span class="n">argv</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="o">!</span><span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="implicit-casting">Implicit casting</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/implicit_cast.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/implicit_cast.html</a>
</p></blockquote>
<p>Love it or hate it, C++ is notorious for <strong>implicit type conversion</strong>, so it&rsquo;s pretty much expected that it&rsquo;d turn up somewhere in this code - and sure enough, it&rsquo;s easy to spot.</p>
<p>The function <code>main</code> has a return type of <code>int</code>, but we are attempting to return <code>!true</code>, so it must be that this <code>bool</code> expression is being implicitly converted to type <code>int</code>. In particular, <code>!true == false</code>, and <code>false</code> as an integer is simply <code>0</code>. Therefore, we can write:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="nb">NULL</span><span class="p">[</span><span class="n">argv</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="array-subscript-commutativity">Array subscript commutativity</h2>
<blockquote>
<p><a href="https://learn.microsoft.com/en-us/cpp/cpp/subscript-operator?view=msvc-170"
	
		target="_blank" rel="noopener noreferrer"
	>https://learn.microsoft.com/en-us/cpp/cpp/subscript-operator?view=msvc-170</a>
</p></blockquote>
<p>The subscript operator, <code>[]</code>, is defined such that <code>a[b] == *(a + b)</code>. Because of how C <strong>pointer arithmeic</strong> works (more on that in a bit), this means that <code>a[b] == b[a]</code>, and the expression <code>NULL[argv]</code> is equivalent to <code>argv[NULL]</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="nb">NULL</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="null"><code>NULL</code></h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/c/types/NULL.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/c/types/NULL.html</a>
</p></blockquote>
<p>But what even is <code>NULL</code>? In C, it is typically defined as a null pointer, but this is <a href="https://www.reddit.com/r/C_Programming/comments/1o58wbr/comment/nj7r7o3/"
	
		target="_blank" rel="noopener noreferrer"
	>implementation defined</a>
.</p>
<p>Importantly, it is allowed for <code>NULL</code> to be defined as the constant <code>0</code> or, as off <a href="https://en.cppreference.com/w/c/23.html"
	
		target="_blank" rel="noopener noreferrer"
	>C23</a>
, <code>nullptr</code> in order to remain compatible with C++. To avoid breaking this compatibility, it <em>cannot</em> be <code>(void*)0</code>, nor can it be an expression that evaluates to <code>0</code>, like <code>10 * 2 - 20</code>.</p>
<p>GCC defines <code>NULL</code> as its own magic keyword, <a href="https://gcc.gnu.org/onlinedocs/libstdc&#43;&#43;/manual/support.html"
	
		target="_blank" rel="noopener noreferrer"
	><code>__null</code></a>
, and is supposed to be a null pointer. Therefore, the GCC compiler generates the &ldquo;converting NULL to non-pointer type&rdquo; warning when attempting to index an array with it. As such, we&rsquo;d best just use <code>0</code> to access the first element of an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="pointer-arithmetic">Pointer arithmetic</h2>
<blockquote>
<p><a href="https://www.learncpp.com/cpp-tutorial/pointer-arithmetic-and-subscripting/"
	
		target="_blank" rel="noopener noreferrer"
	>https://www.learncpp.com/cpp-tutorial/pointer-arithmetic-and-subscripting/</a>
</p></blockquote>
<p>As mentioned previously, the subscript operator expands to <strong>pointer arithmetic</strong>, such that <code>a[b] == *(a + b)</code>.</p>
<p>However, consider the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">a</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="mi">4</span><span class="p">);</span>
</span></span></code></pre></div><div class="godbolt-button">
	<a target="_blank" href="https://godbolt.org/z/Pa75aGTr8">Run this code!</a>
</div>

<p>It&rsquo;s important to note that <code>a + 4</code> does not simply mean adding 4 to the address of <code>a</code>. Rather, it is adding <code>4 * sizeof(a[0])</code>, which in this example evaluates  to <code>4 * sizeof(int) == 4 * 4 == 16</code>. Thus, <code>*(a + 4)</code> is equivalent to <code>a[4]</code>, and gives the value <code>4</code> from the array.</p>
<p>Likewise, our code <code>*(argv[0] + 9)</code> is equivalent to <code>argv[0][9]</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">9</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>And since <code>argv</code> is a <code>char**</code> (i.e., an array of <code>char</code> arrays, i.e., an array of <a href="https://en.wikipedia.org/wiki/Null-terminated_string"
	
		target="_blank" rel="noopener noreferrer"
	>null-terminated strings</a>
), <code>argv[0][9]</code> is the 10th character of the 1st string in <code>argv</code>.</p>
<p>At this point, it&rsquo;s useful to actually see what this string is, because Godbolt&rsquo;s Compiler Explorer does in fact feed an argument to the program, and that is &ldquo;./output.s&rdquo;. Do some basic counting, and we can see that the 10th character in this string is indeed <code>'s'</code>. Let&rsquo;s make all of this more clear in our code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">input</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert</span><span class="p">(</span><span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;s&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="octal">Octal</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/integer_literal.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/integer_literal.html</a>
</p></blockquote>
<p>Back in the 1970s, <a href="https://en.wikipedia.org/wiki/Octal"
	
		target="_blank" rel="noopener noreferrer"
	>octal</a>
 (base-8) encoding was all the rage.</p>
<p>Unfortunately, this meant that unlike <a href="https://en.wikipedia.org/wiki/Binary_number"
	
		target="_blank" rel="noopener noreferrer"
	>binary</a>
 literals which are prefixed with <code>0b</code> or <a href="https://en.wikipedia.org/wiki/Hexadecimal"
	
		target="_blank" rel="noopener noreferrer"
	>hexadecimal</a>
 literals which are prefixed with <code>0x</code>, octal literals are only prefixed with <code>0</code> in C (and by extension, C++).</p>
<p>So really, <code>074144</code> in our everyday base-10 is 30820, which we can replace here:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">^=</span> <span class="mi">30820</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">input</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert</span><span class="p">(</span><span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;s&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="xor">XOR</h2>
<blockquote>
<p><a href="https://en.wikipedia.org/wiki/Exclusive_or"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.wikipedia.org/wiki/Exclusive_or</a>
</p></blockquote>
<p><code>^</code> is C&rsquo;s <strong>exclusive or</strong> bitwise operator, and essentially takes the bits of two values and compares their bits in pairs, individually setting the resultant bits to <code>1</code> if the pairs do not match, and <code>0</code> otherwise.</p>
<p>In our code, <code>argc</code> starts as <code>1</code> (because there is one argument given to the program) and then is XOR&rsquo;d with <code>30820</code>. If we compute <code>1 ^ 30820</code>, we get <code>30821</code>, just so happens to give the same result as if we had added them together.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">=</span> <span class="mi">30821</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">input</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert</span><span class="p">(</span><span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;s&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="o">++</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="post-increment-operator">Post-increment operator</h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/operator_incdec.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/operator_incdec.html</a>
</p></blockquote>
<p>Later in our code, we also see that <code>argc</code> is being incremented via the <strong>post-increment operator</strong> (<code>argc++</code>), the operator responsible for <a href="https://en.wikipedia.org/wiki/C%2B%2B#Etymology"
	
		target="_blank" rel="noopener noreferrer"
	>C++ being called what it is today</a>
.</p>
<p>However, although not immediately obvious, this operator doesn&rsquo;t actually <em>do</em> anything in this context. This is because we are passing <code>argc++</code> into the constructor of <code>long long</code>, meaning a new <code>long long</code> is constructed and <code>argc</code> is only incremented <em>after</em> the fact - unlike if <code>++argc</code> was used, which would increment it <em>before</em> <code>argc</code> is accessed.</p>
<p>Therefore, since <code>argc</code> isn&rsquo;t used used after this, the operation serves no purpose and can be removed.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">=</span> <span class="mi">30821</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">input</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert</span><span class="p">(</span><span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;s&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">{</span><span class="n">argc</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="new"><code>new</code></h2>
<blockquote>
<p><a href="https://en.cppreference.com/w/cpp/language/new.html"
	
		target="_blank" rel="noopener noreferrer"
	>https://en.cppreference.com/w/cpp/language/new.html</a>
</p></blockquote>
<p>Now we&rsquo;re very close to deciphering this completely!</p>
<p>It is usually advised to new C++ programmers to avoid using <code>new</code> as much as possible, especially for programmers coming from <a href="https://en.wikipedia.org/wiki/Object-oriented_programming"
	
		target="_blank" rel="noopener noreferrer"
	>OOP</a>
 languages like <a href="https://stackoverflow.com/questions/7019754/what-does-the-new-keyword-actually-do-in-java-and-should-i-avoid-creating-new"
	
		target="_blank" rel="noopener noreferrer"
	>Java</a>
 which use it extensively. This is because it <a href="https://en.wikipedia.org/wiki/C_dynamic_memory_allocation"
	
		target="_blank" rel="noopener noreferrer"
	>allocates dynamic memory</a>
, unlike normal pointers which use automatic memory management. After all, dynamic memory is <a href="https://stackoverflow.com/questions/15857099/what-is-slower-about-dynamic-memory-usage"
	
		target="_blank" rel="noopener noreferrer"
	>computationally expensive</a>
 to work with!</p>
<p>However, a <code>new</code> expression can also serve another, extremely niche purpose: to get the address of some memory without needing to use the <code>&amp;</code> operator, since <code>new</code> returns the address of the memory it allocates. And that&rsquo;s exactly what&rsquo;s happening here!</p>
<p>Therefore, since we would prefer not to use dynamic allocation anyway, let&rsquo;s just use <code>&amp;</code> to get the address of the existing variable <code>argc</code> rather than duplicate its data:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">argc</span> <span class="o">=</span> <span class="mi">30821</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">input</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert</span><span class="p">(</span><span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;s&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">argc</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>You&rsquo;ll also notice that I&rsquo;ve removed the <code>volatile const signed long long</code>, and that&rsquo;s because it is just fluff, as will become evident in our final step&hellip;</p>
<h2 id="string-in-disguise">String in disguise</h2>
<blockquote>
<p><a href="https://medium.com/@ryan_forrester_/c-integer-to-character-conversion-a-comprehensive-guide-ac8bf9e5940a"
	
		target="_blank" rel="noopener noreferrer"
	>https://medium.com/@ryan_forrester_/c-integer-to-character-conversion-a-comprehensive-guide-ac8bf9e5940a</a>
</p></blockquote>
<p>Finally, we are down to the last layer of obfuscation, and this just uses a neat little trick that isn&rsquo;t particularly special to C, but rather a quirk of how computers represent data in general.</p>
<p>First, it is important to understand that the <code>char</code> type is just the mapping of a byte-sized number ranging from 0-255 to what is typically an <a href="https://www.asciitable.com/"
	
		target="_blank" rel="noopener noreferrer"
	>ASCII</a>
 character. Therefore, a typical C string is just a sequence of these characters - an array of <code>char</code> values.</p>
<p>But what if we take a number that is bigger than a byte? Say, <code>30821</code>. Well, assuming we are using <a href="https://en.wikipedia.org/wiki/Endianness"
	
		target="_blank" rel="noopener noreferrer"
	>little endian</a>
, <code>30821</code> as an <code>int</code> is represented in hexadecimal as <code>65 78 00 00</code> (note that each pair of digits is 1 byte). Therefore, an <code>int</code> can also be thought of as an array of bytes - 4 in total if we assume that <code>sizeof(int) == 4</code>.</p>
<p>So what happens if we take this number and treat it as a <code>char</code> array? Well, <code>0x65 == 'e'</code> and <code>0x78 == 'x'</code>, so we get the string <code>&quot;ex&quot;</code>.</p>
<p>However, it&rsquo;s important to note that for a <code>char</code> array to be a valid C string, it must be null-terminated (i.e., ending with <code>0x00</code>). As a result, we are able toget a string of maximum length 3 from a single 32-bit integer. <code>&quot;ex&quot;</code> is only of length 2, so it is indeed able to fit within these constraints, and a larger type like the 64-bit <code>long long</code> is unnecessary.</p>
<p>So, when we cast <code>(char*)&amp;argc</code>, what we&rsquo;re really doing is telling the compiler to process our integer <code>argc</code> as a string instead, and finally it becomes clear why our program outputs &ldquo;sex&rdquo;. Let&rsquo;s remove this conversion and just make the value explicit:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">input</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">assert</span><span class="p">(</span><span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;s&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">input</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;ex&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>And voilà, we have successfully picked apart the original obfuscated code to reveal what it is really doing!</p>
<h2 id="conclusion">Conclusion</h2>
<p>So, it turns out that all this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="o">%:</span><span class="n">import</span> <span class="s">&#34;bits/stdc++.h&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">main</span><span class="p">(</span><span class="k">register</span> <span class="kt">int</span><span class="p">(</span><span class="n">C</span><span class="p">),</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="o">&lt;::&gt;</span><span class="p">)</span> <span class="k">noexcept</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">operator</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wclog</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">C</span> <span class="o">^=</span> <span class="mo">074144</span><span class="p">,</span> <span class="nb">NULL</span><span class="o">&lt;:</span><span class="nl">_</span><span class="p">:</span><span class="o">&gt;</span> <span class="o">+</span> <span class="mi">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">typeof</span><span class="p">(</span><span class="o">*</span><span class="n">_</span><span class="p">))</span><span class="k">new</span> <span class="k">volatile</span> <span class="k">const</span> <span class="kt">signed</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">&lt;%</span><span class="n">C</span><span class="o">++%&gt;</span><span class="p">,</span> <span class="n">not</span> <span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>is really just an obfuscated way of doing this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;sex&#34;</span><span class="p">;</span> <span class="c1">// as in &#34;sextet&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><p>To whoever gave this a read, I hope it was as insightful to you as it was fun for me to put together. But do not be fooled! What I have covered here is but the tip of an iceberg that will lead you far into the depths of Hell if you dare to attempt traversing your way to its bottom.</p>
<p>Perhaps I am exaggerating, but if you consider the fact that the comma operator can be overloaded&hellip; am I really?</p>
<h2 id="revisions">Revisions</h2>
<blockquote>
<p><i>The following is a list of changes I&rsquo;ve made to the original post. Feel free to contact me if you notice any other mistakes or misinformation in my articles!</i></p></blockquote>
<ul>
<li>[2026-03-04] - Previously said that <code>std::cerr</code> is <strong>buffered</strong>, but makes more sense to just say it&rsquo;s <strong>not automatically flushed</strong> compared to <code>std::clog</code>, as both are technically buffered anyway.</li>
<li>[2026-03-04] - Previously said that registers are faster to access than <strong><a href="https://en.wikipedia.org/wiki/Random-access_memory"
	
		target="_blank" rel="noopener noreferrer"
	>RAM</a>
</strong>, which is true, but it&rsquo;s more accurate to say <strong>memory stores</strong>.</li>
<li>[2026-03-05] - Unobfuscated example at the very end used <code>#import</code> instead of the correct <code>#include</code>.</li>
<li>[2026-03-05] - Added an example of Haskell&rsquo;s <code>&gt;&gt;</code> operator in comparison to C&rsquo;s <code>,</code> operator.</li>
<li>[2026-03-05] - Fixed <code>wchar_t</code> example, as was missing proper null terminator.</li>
<li>[2026-03-05] - Added Godbolt links to many of the code examples.</li>
</ul>
]]></content:encoded></item></channel></rss>