<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Vahan&#x27;s Blog</title>
    <subtitle>A blog about learning, health, improvement, technology, programming, languages, ergonomic keyboards, retrogaming, strength training, life hacks and more.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.vahan.dev/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.vahan.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-01T00:00:00+00:00</updated>
    <id>https://blog.vahan.dev/atom.xml</id>
    <entry xml:lang="en">
        <title>A better keyboard layout</title>
        <published>2026-07-01T00:00:00+00:00</published>
        <updated>2026-07-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.vahan.dev/better-keyboard/"/>
        <id>https://blog.vahan.dev/better-keyboard/</id>
        
        <content type="html" xml:base="https://blog.vahan.dev/better-keyboard/">&lt;p&gt;Two years ago, as I was touch-typing on my keyboard at my day job, I realized that I often made mistakes when I switched rows.
My fingers would end up between two keys instead of landing on one specific key.&lt;&#x2F;p&gt;
&lt;p&gt;For example, if I pressed &lt;code&gt;H&lt;&#x2F;code&gt; with my right index finger and then tried to press &lt;code&gt;U&lt;&#x2F;code&gt;, I would often press &lt;code&gt;Y&lt;&#x2F;code&gt; instead or press both &lt;code&gt;Y&lt;&#x2F;code&gt; and &lt;code&gt;U&lt;&#x2F;code&gt; at the same time.&lt;&#x2F;p&gt;
 &lt;img src=&quot;default-layout-with-legends.png&quot; class=&quot;ci&quot; alt=&quot;default-layout-with-legends&quot; width=&quot;830&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;h2 id=&quot;stagger&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stagger&quot; aria-label=&quot;Anchor link for: stagger&quot;&gt;Stagger&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The main reason why this happens is that the top row is staggered asymmetrically by 0.25 keys to the left with respect to the home row while the bottom row is staggered by 0.5 keys.&lt;&#x2F;p&gt;
 &lt;img src=&quot;default-layout-with-stagger-highlight.png&quot; class=&quot;ci&quot; alt=&quot;default-layout-with-stagger-highlight&quot; width=&quot;830&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;It means that your fingers have to move horizontally by either 0.25 or 0.5 keys when switching rows.
This requires a lot of training to be able to do accurately and consistently while touch-typing.&lt;&#x2F;p&gt;
&lt;p&gt;A marginally better alternative would be to make the row stagger symmetrical.
Horizontal movements when switching rows would then consistently be 0.5 keys.&lt;&#x2F;p&gt;
 &lt;img src=&quot;symmetrical-row-staggered-layout.png&quot; class=&quot;ci&quot; alt=&quot;symmetrical-row-staggered-layout&quot; width=&quot;830&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;Unfortunately, this doesn&#x27;t completely solve my accuracy problem.
According to the standard touch-typing rules, I&#x27;m supposed to hit the &lt;code&gt;T&lt;&#x2F;code&gt;, &lt;code&gt;G&lt;&#x2F;code&gt;, &lt;code&gt;B&lt;&#x2F;code&gt; keys with my left hand and the &lt;code&gt;Y&lt;&#x2F;code&gt;, &lt;code&gt;H&lt;&#x2F;code&gt;, &lt;code&gt;N&lt;&#x2F;code&gt; keys with my right hand.
It means that both of my hands should move along a top-left to bottom-right axis when switching rows.
This goes against what is easy and natural for muscle memory.&lt;&#x2F;p&gt;
 &lt;img src=&quot;symmetrical-row-staggered-layout-with-axes.png&quot; class=&quot;ci&quot; alt=&quot;symmetrical-row-staggered-layout-with-axes&quot; width=&quot;830&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;It would be much more intuitive if our hands moved along mirrored axes:&lt;&#x2F;p&gt;
 &lt;img src=&quot;mirrored-row-staggered-layout-with-axes.png&quot; class=&quot;ci&quot; alt=&quot;mirrored-row-staggered-layout-with-axes&quot; width=&quot;857&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;However, it is still uncomfortable and hard to move our hands and fingers horizontally.
It is more natural to move fingers vertically.&lt;&#x2F;p&gt;
&lt;p&gt;Thus, we can do even better if we almost completely eliminate horizontal movement.
The naive approach would be the following:&lt;&#x2F;p&gt;
 &lt;img src=&quot;compact-ortholinear-layout.png&quot; class=&quot;ci&quot; alt=&quot;compact-ortholinear-layout&quot; width=&quot;722&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;This ortholinear keyboard layout still has 2 obvious flaws.&lt;&#x2F;p&gt;
&lt;p&gt;The first issue is that it forces your hands to be parallel which puts strain on your wrists.&lt;&#x2F;p&gt;
&lt;p&gt;The second issue is that it doesn&#x27;t take into account that fingers all have different lengths.&lt;&#x2F;p&gt;
&lt;p&gt;The solution is to split our keyboard into 2 parts, rotate them to match the most comfortable angle for our wrists and introduce columnar stagger.&lt;&#x2F;p&gt;
&lt;p&gt;The Atreus keyboard layout is such an example:&lt;&#x2F;p&gt;
 &lt;img src=&quot;atreus-layout.png&quot; class=&quot;ci&quot; alt=&quot;atreus-layout&quot; width=&quot;705&quot; height=&quot;312&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;We&#x27;ll keep the ortholinear layout for the rest of this article as it is easier to modify.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;layers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#layers&quot; aria-label=&quot;Anchor link for: layers&quot;&gt;Layers&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we&#x27;ve explored the subject of stagger extensively, let&#x27;s talk about the second biggest ergonomy killer: hand movement.&lt;&#x2F;p&gt;
&lt;p&gt;Doesn&#x27;t reaching for the numpad or even the &lt;code&gt;Escape&lt;&#x2F;code&gt; key feel exhausting?&lt;&#x2F;p&gt;
&lt;p&gt;What if we had another key like &lt;code&gt;Shift&lt;&#x2F;code&gt; that gave you access to another layer of keys?&lt;&#x2F;p&gt;
&lt;p&gt;We can split our space bar into multiple thumb keys and use one of them as a layer key:&lt;&#x2F;p&gt;
 &lt;img src=&quot;layered-ortholinear-layout.png&quot; class=&quot;ci&quot; alt=&quot;layered-ortholinear-layout&quot; width=&quot;668&quot; height=&quot;290&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;This layout provides multiple benefits:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It provides one-handed access to the numpad with our left hand while we use the mouse with our right hand.&lt;&#x2F;li&gt;
&lt;li&gt;It provides access to the navigation keys without moving our right hand.&lt;&#x2F;li&gt;
&lt;li&gt;It removes the far right column of the keyboard which reduces the strain on our right hand.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It might be hard to keep our layer key down while accessing the bottom row one-handed.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s lower our thumb keys to make it easier:&lt;&#x2F;p&gt;
 &lt;img src=&quot;thumb-keys-layout.png&quot; class=&quot;ci&quot; alt=&quot;thumb-keys-layout&quot; width=&quot;668&quot; height=&quot;395&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;The number row is redundant with our numpad&#x2F;navigation layer but we don&#x27;t have enough space to put all of our symbols on the same layer.
We could make our left layer key and our right layer key toggle different layers.&lt;&#x2F;p&gt;
 &lt;img src=&quot;sym-layer-layout.png&quot; class=&quot;ci&quot; alt=&quot;sym-layer-layout&quot; width=&quot;668&quot; height=&quot;342&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;The benefits of this layout are the following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;No need to stretch our hands to reach the number row for symbols.&lt;&#x2F;li&gt;
&lt;li&gt;Our pinkies are provided some relief by eliminating the outer columns.&lt;&#x2F;li&gt;
&lt;li&gt;No need to alternate between the left and right &lt;code&gt;Shift&lt;&#x2F;code&gt; keys when typing consecutive uppercase letters.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We still have to twist our fingers in uncomfortable ways to use common shortcuts such as &lt;code&gt;Ctrl-z&lt;&#x2F;code&gt;, &lt;code&gt;Ctrl-x&lt;&#x2F;code&gt;, &lt;code&gt;Ctrl-c&lt;&#x2F;code&gt; and &lt;code&gt;Ctrl-v&lt;&#x2F;code&gt; one-handed.
A solution for this would be to turn our &lt;code&gt;Nav&lt;&#x2F;code&gt; layer key into a tap-hold key.
When we press a key while we hold &lt;code&gt;Nav&lt;&#x2F;code&gt; down, we would get a key from our navigation&#x2F;numpad layer.
But if we just tap &lt;code&gt;Nav&lt;&#x2F;code&gt; and then press a key, the next key we would get would be from our shortcut layer.&lt;&#x2F;p&gt;
&lt;p&gt;Our shortcut layer could look something like the following:&lt;&#x2F;p&gt;
 &lt;img src=&quot;shortcut-layer-layout.png&quot; class=&quot;ci&quot; alt=&quot;shortcut-layer-layout&quot; width=&quot;668&quot; height=&quot;342&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;Ideally, we shouldn&#x27;t have to stretch our hands at all to reach for our modifier keys (&lt;code&gt;Ctrl&lt;&#x2F;code&gt;, &lt;code&gt;Win&lt;&#x2F;code&gt; and &lt;code&gt;Alt&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;home-row-mods&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#home-row-mods&quot; aria-label=&quot;Anchor link for: home-row-mods&quot;&gt;Home Row Mods&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is where home row mods come into play.
You can put modifier keys on your home row using tap-hold keys.
For example the &lt;code&gt;S&lt;&#x2F;code&gt; and &lt;code&gt;L&lt;&#x2F;code&gt; keys could double as the &lt;code&gt;Ctrl&lt;&#x2F;code&gt; key when held instead of tapped.&lt;&#x2F;p&gt;
&lt;p&gt;The main drawback of this approach is that you can accidentaly trigger shortcuts while typing.
Fortunately, a member of the ergonomic keyboard community has mostly solved this problem.
You can read more about it here: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;urob&#x2F;zmk-config#timeless-homerow-mods&quot;&gt;Urob&#x27;s Timeless Home Row Mods&lt;&#x2F;a&gt;.
You can probably decrease false positives further by moving your mod keys to the bottom row.&lt;&#x2F;p&gt;
&lt;p&gt;Our keyboard now looks like the following without dedicated mod keys:&lt;&#x2F;p&gt;
 &lt;img src=&quot;no-mod-key-layout.png&quot; class=&quot;ci&quot; alt=&quot;no-mod-key-layout&quot; width=&quot;668&quot; height=&quot;316&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;h2 id=&quot;combos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#combos&quot; aria-label=&quot;Anchor link for: combos&quot;&gt;Combos&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There are some keys that come in handy no matter what layer you are on and you often want them accessible even while holding your mouse.
For me, it&#x27;s mainly &lt;code&gt;Backspace&lt;&#x2F;code&gt; but I also like having &lt;code&gt;Enter&lt;&#x2F;code&gt;, &lt;code&gt;Escape&lt;&#x2F;code&gt; and &lt;code&gt;Delete&lt;&#x2F;code&gt; on all of my layers.&lt;&#x2F;p&gt;
&lt;p&gt;How can we make this happen even though our layers are mostly full on the left half of our keyboard?&lt;&#x2F;p&gt;
&lt;p&gt;The solution is to set up key combinations.
By pressing two keys at the same time, we can produce the signal of a different key.&lt;&#x2F;p&gt;
&lt;p&gt;For example, when I press &lt;code&gt;W&lt;&#x2F;code&gt; and &lt;code&gt;S&lt;&#x2F;code&gt; at the same time, my keyboard could produce the signal for &lt;code&gt;Backspace&lt;&#x2F;code&gt; instead.&lt;&#x2F;p&gt;
&lt;p&gt;Here are a few we could use for our keyboard:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Combo&lt;&#x2F;th&gt;&lt;th&gt;Result&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Q&lt;&#x2F;code&gt; + &lt;code&gt;A&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Enter&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;W&lt;&#x2F;code&gt; + &lt;code&gt;S&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Backspace&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;E&lt;&#x2F;code&gt; + &lt;code&gt;D&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Escape&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;R&lt;&#x2F;code&gt; + &lt;code&gt;F&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Delete&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;These vertical combos only work with keycaps that are large or flat enough to prevent large gaps between adjacent keys.
But you can come up with any kind of combination that suits your situation better.&lt;&#x2F;p&gt;
&lt;p&gt;This frees up some keys on the navigation layer:&lt;&#x2F;p&gt;
 &lt;img src=&quot;vertical-combos-layout.png&quot; class=&quot;ci&quot; alt=&quot;vertical-combos-layout&quot; width=&quot;614&quot; height=&quot;306&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;I took the liberty of adding a &lt;code&gt;Shift+Tab&lt;&#x2F;code&gt; (&lt;code&gt;Bktb&lt;&#x2F;code&gt;) macro to the navigation layer for the sake of symmetry and practicality.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;keymap&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#keymap&quot; aria-label=&quot;Anchor link for: keymap&quot;&gt;Keymap&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Our current layout has almost completely eliminated lateral movements for our fingers.
Unfortunately, we still have to move our index fingers to the &lt;code&gt;T&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;G&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;B&lt;&#x2F;code&gt; and &lt;code&gt;Y&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;H&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;N&lt;&#x2F;code&gt; inner columns.
We can improve the situation by changing our keymap and placing rarely used keys there instead.&lt;&#x2F;p&gt;
&lt;p&gt;Keymaps are a very complex topic and how optimal they are depends largely on what you are going to type.
For example, a keymap optimized for typing english prose might not be that good for typing spanish prose.&lt;&#x2F;p&gt;
&lt;p&gt;Inner column usage is only one of the stats that make a keymap more ergonomic.
Modern keymaps are designed using the help of an analyzer program.
The keymap designer feeds a large corpus of text (for example all of wikipedia) to the program.
The program then computes all the stats of a given keymap with respect to the provided corpus.
The designer then decides if the keymap is good enough depending on how much weight he gives to each of the stats.
&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;cyanophage.github.io&#x2F;&quot;&gt;Here&lt;&#x2F;a&gt;&#x27;s a website where you can find a bunch of keymaps with their stats.&lt;&#x2F;p&gt;
&lt;p&gt;Some keymap designers choose to relax some conventional constraints to open up additional optimization opportunities.
The most common trade-off is to put a letter on a thumb key (typically &lt;code&gt;E&lt;&#x2F;code&gt;, &lt;code&gt;R&lt;&#x2F;code&gt; or &lt;code&gt;T&lt;&#x2F;code&gt;).
Another one is to put some rarely used letters on a different layer.&lt;&#x2F;p&gt;
&lt;p&gt;One such person is the creator of the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sites.google.com&#x2F;alanreiser.com&#x2F;handsdown&#x2F;home&quot;&gt;&lt;em&gt;Hands Down&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; keymaps.&lt;&#x2F;p&gt;
&lt;p&gt;We can adapt his &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sites.google.com&#x2F;alanreiser.com&#x2F;handsdown&#x2F;home&#x2F;hands-down-neu#h.julmingx5jxo&quot;&gt;Vibranium v&lt;&#x2F;a&gt; variation for our example keyboard:&lt;&#x2F;p&gt;
 &lt;img src=&quot;adapted-vibranium-layout.png&quot; class=&quot;ci&quot; alt=&quot;adapted-vibranium-layout&quot; width=&quot;614&quot; height=&quot;306&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;To make this work we also needed to make a few changes to our thumb keys:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Our layer keys are now both on the left side.&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;code&gt;Nav&lt;&#x2F;code&gt; key is a tap-hold key that produces &lt;code&gt;R&lt;&#x2F;code&gt; when tapped and gives access to our numpad&#x2F;navigation layer when held.&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;code&gt;Sym&lt;&#x2F;code&gt; key is a tap-hold key that gives access to our shortcut layer when tapped and to our symbol layer when held.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Some of you might be wondering where we should put our f-keys.
A simple solution would be to put them on the right side of our shortcut layer:&lt;&#x2F;p&gt;
 &lt;img src=&quot;f-layer-layout.png&quot; class=&quot;ci&quot; alt=&quot;f-layer-layout&quot; width=&quot;614&quot; height=&quot;306&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;h2 id=&quot;making-the-keyboard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#making-the-keyboard&quot; aria-label=&quot;Anchor link for: making-the-keyboard&quot;&gt;Making the keyboard&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we have designed our perfect keyboard layout, we probably want to hold it in our hands and use it.
I hope I can write an entire DIY tutorial for this keyboard in the future.
In the meantime, you can check out &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;flatfootfox.com&#x2F;ergogen-introduction&#x2F;&quot;&gt;this&lt;&#x2F;a&gt; tutorial.&lt;&#x2F;p&gt;
&lt;p&gt;The easiest solution is to buy a similar keyboard though.
The &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;davidphilipbarr&#x2F;sweep&quot;&gt;&lt;em&gt;Ferris Sweep&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;, the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;foostan&#x2F;crkbd&quot;&gt;&lt;em&gt;Corne&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; and the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;GEIGEIGEIST&#x2F;TOTEM&quot;&gt;&lt;em&gt;Totem&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; are examples of small ergonomic keyboards you can buy off the shelf.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m currently using a layout similar to the one we discussed on a Corne keyboard.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Two years ago, as I was frustrated by my subpar typing experience, I went down the rabbit hole of ergonomic split keyboards and optimized keymaps.
It has now been more than a year that I&#x27;ve switched to the layout I described in this article as my daily driver.
I can definitely say that my typing experience is much more enjoyable and completely painless now.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>On the subject of pointer syntax</title>
        <published>2026-03-29T00:00:00+00:00</published>
        <updated>2026-04-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.vahan.dev/on-the-subject-of-pointer-syntax/"/>
        <id>https://blog.vahan.dev/on-the-subject-of-pointer-syntax/</id>
        
        <content type="html" xml:base="https://blog.vahan.dev/on-the-subject-of-pointer-syntax/">&lt;p&gt;The C programming language was initially designed by Dennis Ritchie and one of his key design principles was that declaration syntax should mimic expression syntax&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-c-history-1&quot;&gt;&lt;a href=&quot;#fn-c-history&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Declarations
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;char&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;p&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Expressions
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;p&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The declaration &lt;code&gt;char *p;&lt;&#x2F;code&gt; means that the expression &lt;code&gt;*p&lt;&#x2F;code&gt; will be of type &lt;code&gt;char&lt;&#x2F;code&gt;.&lt;br &#x2F;&gt;
The declaration &lt;code&gt;int f();&lt;&#x2F;code&gt; means that the expression &lt;code&gt;f()&lt;&#x2F;code&gt; will be of type &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This principle also applies to declarations that have multiple declarators:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; x &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;p &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;x&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;p&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the program above, the declaration &lt;code&gt;int *p = &amp;amp;x, f();&lt;&#x2F;code&gt; means that both &lt;code&gt;*p&lt;&#x2F;code&gt; and &lt;code&gt;f()&lt;&#x2F;code&gt; will be expressions of type &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;However, we can see that this principle is not an absolute rule:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;  &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;add&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;  &lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;add&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;add&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;  &lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; a &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;+&lt;&#x2F;span&gt; b&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the example above, the declaration &lt;code&gt;int add(int, int);&lt;&#x2F;code&gt; does not mean that &lt;code&gt;add(int, int)&lt;&#x2F;code&gt; will be an expression of type &lt;code&gt;int&lt;&#x2F;code&gt;.
It is not considered a well-formed expression to begin with.&lt;&#x2F;p&gt;
&lt;p&gt;The way to think about it is that &lt;code&gt;add(X1, X2)&lt;&#x2F;code&gt; (&lt;code&gt;X1&lt;&#x2F;code&gt; and &lt;code&gt;X2&lt;&#x2F;code&gt; being expressions of type &lt;code&gt;int&lt;&#x2F;code&gt;) is an expression of type &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Array declaration syntax is an even worse offender:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; a&lt;span class=&quot;z-meta z-brackets z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-c&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-c&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;4&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here, applying the &quot;declaration syntax mimics expression syntax&quot; is not only wrong but could also be harmful.&lt;br &#x2F;&gt;
The expression &lt;code&gt;a[5]&lt;&#x2F;code&gt; would cause an out-of-bounds access error.&lt;&#x2F;p&gt;
&lt;p&gt;Nonetheless, understanding the spirit of this design principle can help us decipher more complex declarations:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-variable z-function z-c&quot;&gt;foo&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;double&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;char&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;long&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Declarations in C should be read inside-out starting with the name of the declared entity (&lt;code&gt;foo&lt;&#x2F;code&gt; in this example).&lt;br &#x2F;&gt;
Prefix operators (such as &lt;code&gt;*&lt;&#x2F;code&gt;) have lower precedence compared to postfix operators (such as the function call operator&lt;code&gt;()&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Knowing this fact allows us to establish that &lt;code&gt;foo&lt;&#x2F;code&gt; is a function which has a parameter of type &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;We know that it returns a pointer since the value returned by &lt;code&gt;foo&lt;&#x2F;code&gt; can be dereferenced (&lt;code&gt;*foo(int a)&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;We know that the returned pointer points to a function that has a parameter of type &lt;code&gt;double&lt;&#x2F;code&gt; and a parameter of type &lt;code&gt;char *&lt;&#x2F;code&gt; (&lt;code&gt;(*foo(int a))(double, char *)&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;That function returns a pointer (&lt;code&gt;*(*foo(int a))(double, char *)&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;That pointer points to a function that has a parameter of type &lt;code&gt;long&lt;&#x2F;code&gt; and returns a value of type &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;It is obviously not obvious at a glance that &lt;code&gt;foo&lt;&#x2F;code&gt; is a function which returns a pointer to a function which returns a pointer to a function which returns a value of type &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In fact, declarations can become so hard to read that the maintainer of the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fish-shell&#x2F;fish-shell&quot;&gt;Fish&lt;&#x2F;a&gt; shell created a &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;cdecl.org&#x2F;&quot;&gt;website&lt;&#x2F;a&gt; that deciphers C declarations for you.&lt;&#x2F;p&gt;
&lt;p&gt;Even though declarations in C are notoriously hard to read and write, expressions can also be tricky due to their many nested parentheses.&lt;&#x2F;p&gt;
&lt;p&gt;My goal here is not to write a C language tutorial or explain in depth all the implications of this principle but to discuss language design.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-postfix-indirection-operator&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-postfix-indirection-operator&quot; aria-label=&quot;Anchor link for: a-postfix-indirection-operator&quot;&gt;A postfix indirection operator&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.nokia.com&#x2F;bell-labs&#x2F;about&#x2F;dennis-m-ritchie&#x2F;chist.html&quot;&gt;The Development of the C Language&lt;&#x2F;a&gt;, Dennis Ritchie mentions that declarations and expressions involving pointers would be more readable if the indirection operator was a postfix operator.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s imagine for a moment that &lt;code&gt;!&lt;&#x2F;code&gt; is the postfix indirection operator.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; x &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; p&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;x&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; p&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The declaration of &lt;code&gt;foo&lt;&#x2F;code&gt; would now look like the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;foo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-c&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;double&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;char&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;long&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It can almost be read from left to right. We just have to go back at the beginning to read the type specifier (&lt;code&gt;int&lt;&#x2F;code&gt;).&lt;br &#x2F;&gt;
It is clearer that &lt;code&gt;foo&lt;&#x2F;code&gt; is a function that takes an &lt;code&gt;int&lt;&#x2F;code&gt; and returns a pointer to a function that takes a &lt;code&gt;double&lt;&#x2F;code&gt; and a &lt;code&gt;char !&lt;&#x2F;code&gt; and returns a pointer to a function that takes a &lt;code&gt;long&lt;&#x2F;code&gt; and returns an &lt;code&gt;int&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Ideally, the type specifier should go at the end but we would need a keyword to introduce declarations:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;let p &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;x&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;let a &lt;span class=&quot;z-meta z-brackets z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-c&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-c&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-c&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-c&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-c&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-c&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;let &lt;span class=&quot;z-meta z-function z-c&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-c&quot;&gt;foo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-c&quot;&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;a &lt;span class=&quot;z-variable z-parameter z-c&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;double&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-c&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-c&quot;&gt;long&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-c&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A postfix indirection operator also removes the need for the arrow operator &lt;code&gt;-&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Without arrow operator
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-c&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt;pointer&lt;span class=&quot;z-punctuation z-section z-group z-end z-c&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-c&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-member z-c&quot;&gt;property&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Arrow operator
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; pointer&lt;span class=&quot;z-punctuation z-accessor z-c&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;property&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-c&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-c&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Postfix indirection operator combined with the &amp;#39;.&amp;#39; operator
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-c&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-return z-c&quot;&gt;return&lt;&#x2F;span&gt; pointer&lt;span class=&quot;z-keyword z-operator z-arithmetic z-c&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-c&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-member z-c&quot;&gt;property&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Another issue that the prefix &lt;code&gt;*&lt;&#x2F;code&gt; operator causes occurs during parsing&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-lexer-hack-1&quot;&gt;&lt;a href=&quot;#fn-lexer-hack&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.
Consider the following code snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c z-code&quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;&lt;span class=&quot;z-source z-c&quot;&gt;a &lt;span class=&quot;z-keyword z-operator z-c&quot;&gt;*&lt;&#x2F;span&gt; b&lt;span class=&quot;z-punctuation z-terminator z-c&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is ambiguous during parsing whether &lt;code&gt;a * b;&lt;&#x2F;code&gt; is an expression statement or a declaration of a variable named &lt;code&gt;b&lt;&#x2F;code&gt; of type &quot;pointer to &lt;code&gt;a&lt;&#x2F;code&gt;&quot;.
This ambiguity complicates and slows down tools such as formatters, linters and syntax highlighters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;other-languages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#other-languages&quot; aria-label=&quot;Anchor link for: other-languages&quot;&gt;Other languages&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There are many other languages which have pointers and it&#x27;s interesting to see how familiarity and popularity shape programming language design more than anything else.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pascal&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pascal&quot; aria-label=&quot;Anchor link for: pascal&quot;&gt;Pascal&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Pascal and C emerged around the same period but Pascal used &lt;code&gt;^&lt;&#x2F;code&gt; as a postfix indirection operator from the very beginning.&lt;&#x2F;p&gt;
&lt;p&gt;The syntax to access fields of a record then becomes trivial: &lt;code&gt;p^.field&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ada&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ada&quot; aria-label=&quot;Anchor link for: ada&quot;&gt;Ada&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Ada emerged a few years later than C and Pascal.
It has &quot;access types&quot;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-access-types-1&quot;&gt;&lt;a href=&quot;#fn-access-types&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; which are roughly equivalent to pointers.
Ada uses &lt;code&gt;.all&lt;&#x2F;code&gt; as a postfix indirection operator.
It also has an implicit dereferencing feature to access fields of a record which means it is possible to write &lt;code&gt;Ptr.Field&lt;&#x2F;code&gt; instead of &lt;code&gt;Ptr.all.Field&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;rust&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#rust&quot; aria-label=&quot;Anchor link for: rust&quot;&gt;Rust&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Rust uses &lt;code&gt;*&lt;&#x2F;code&gt; as a prefix indirection operator just like C and has implicit dereferencing just like Ada.
Rust also has implicit borrowing when calling methods.&lt;&#x2F;p&gt;
&lt;p&gt;Declaration syntax is not tied to expression syntax so declarations stay readable.&lt;&#x2F;p&gt;
&lt;p&gt;Despite its implicit borrowing&#x2F;dereferencing features and its &lt;code&gt;.deref()&lt;&#x2F;code&gt; method, there are still discussions about adding postfix borrowing and dereferencing operators&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-rust-postfix-1&quot;&gt;&lt;a href=&quot;#fn-rust-postfix&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;go&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#go&quot; aria-label=&quot;Anchor link for: go&quot;&gt;Go&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Go also uses the same operators as C and has implicit dereferencing.
It changes the syntax of declarations to make them readable.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zig&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zig&quot; aria-label=&quot;Anchor link for: zig&quot;&gt;Zig&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Zig uses &lt;code&gt;.*&lt;&#x2F;code&gt; as a postfix indirection operator.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;odin&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#odin&quot; aria-label=&quot;Anchor link for: odin&quot;&gt;Odin&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Odin uses the same operator as Pascal.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hare&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hare&quot; aria-label=&quot;Anchor link for: hare&quot;&gt;Hare&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Hare is similar to Go and Rust in this regard.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;c3&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#c3&quot; aria-label=&quot;Anchor link for: c3&quot;&gt;C3&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;C3 uses the same operators as C.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;v&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#v&quot; aria-label=&quot;Anchor link for: v&quot;&gt;V&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;V uses the same operators as C.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Some would argue that language designers should completely avoid unary operators&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-unary-operators-1&quot;&gt;&lt;a href=&quot;#fn-unary-operators&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.
Others would argue that all unary operators should have the same fixity.
My stance is not that extreme.&lt;&#x2F;p&gt;
&lt;p&gt;However, Pascal appeared in the 1970s and Dennis Ritchie mentioned in 1993 that a postfix indirection operator would be better.
I find it unfortunate that the language designers of Go, Rust, Hare, C3, and V made the mistake of disregarding this insight.&lt;&#x2F;p&gt;
&lt;p&gt;When designing a new language (especially a spiritual successor to C) which breaks source retrocompatibility, avoiding simple improvements like making a prefix operator postfix because of familiarity&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-familiarity-1&quot;&gt;&lt;a href=&quot;#fn-familiarity&quot;&gt;6&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; is bad design.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-c-history&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.nokia.com&#x2F;bell-labs&#x2F;about&#x2F;dennis-m-ritchie&#x2F;chist.html&quot;&gt;The Development of the C Language&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-c-history-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-lexer-hack&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Lexer_hack&quot;&gt;Lexer Hack&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-lexer-hack-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-access-types&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;learn.adacore.com&#x2F;courses&#x2F;intro-to-ada&#x2F;chapters&#x2F;access_types.html&quot;&gt;Access Types&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-access-types-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-rust-postfix&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rust-lang.zulipchat.com&#x2F;#narrow&#x2F;channel&#x2F;318377-t-lang.2Froadmap-2024&#x2F;topic&#x2F;.60.2Eas_ref.28.29.60.20operator.2C.20reserving.20a.20symbol.3F&#x2F;near&#x2F;477598060&quot;&gt;Postfix borrow&#x2F;deref&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-rust-postfix-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-unary-operators&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;soc.me&#x2F;languages&#x2F;unary-operators-are-unnecessary&quot;&gt;Unary Operators are Unnecessary&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-unary-operators-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-familiarity&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;soc.me&#x2F;languages&#x2F;familiarity&quot;&gt;Familiarity&lt;&#x2F;a&gt; &lt;a href=&quot;#fr-familiarity-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Creating this blog using Zola, Abridge and Netlify</title>
        <published>2025-11-04T00:00:00+00:00</published>
        <updated>2025-11-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.vahan.dev/zola-abridge-netlify-blog-setup/"/>
        <id>https://blog.vahan.dev/zola-abridge-netlify-blog-setup/</id>
        
        <content type="html" xml:base="https://blog.vahan.dev/zola-abridge-netlify-blog-setup/">&lt;p&gt;I have been thinking about setting up a blog for a long time and that time has finally come.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tech-stack&quot; aria-label=&quot;Anchor link for: tech-stack&quot;&gt;Tech Stack&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This blog relies mainly on &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; which is a static site generator written in Rust and Abridge which probably is the most advanced theme for Zola.
This stack makes the website particularly fast to build, load and offers great SEO out of the box.&lt;&#x2F;p&gt;
&lt;p&gt;For hosting, I use Netlify for free which allows building this website directly from a private Git repository.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#setup&quot; aria-label=&quot;Anchor link for: setup&quot;&gt;Setup&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The first step was to &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;getting-started&#x2F;installation&#x2F;&quot;&gt;install&lt;&#x2F;a&gt; Zola on my system. I could then start setting up my blog and &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;abridge.pages.dev&#x2F;overview-abridge&#x2F;&quot;&gt;Abridge&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh z-code&quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Create Zola website&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;yes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;zola&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; init mysite&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; mysite&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Turn it into a git repository and add Abridge as a submodule&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; init&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; submodule add https:&#x2F;&#x2F;github.com&#x2F;jieiku&#x2F;abridge.git themes&#x2F;abridge&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; submodule update&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;init&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;recursive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; submodule update&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;remote&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;merge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Copy essential files for Abridge to my website&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;.gitignore .gitignore&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;config.toml config.toml&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;content&#x2F;_index.md content&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;r&lt;&#x2F;span&gt; themes&#x2F;abridge&#x2F;COPY-TO-ROOT-SASS&#x2F;&lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt; sass&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;netlify.toml netlify.toml&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;package_abridge.js package_abridge.js&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rsync&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;package.json package.json&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I then went to the &lt;code&gt;config.toml&lt;&#x2F;code&gt; file and uncommented the following line.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; class=&quot;language-toml z-code&quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-toml&quot;&gt;#&lt;&#x2F;span&gt;theme = &amp;quot;abridge&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;making-it-my-own&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#making-it-my-own&quot; aria-label=&quot;Anchor link for: making-it-my-own&quot;&gt;Making it my own&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In my &lt;code&gt;config.toml&lt;&#x2F;code&gt;, I changed a few things such as the &lt;code&gt;base_url&lt;&#x2F;code&gt;, &lt;code&gt;title&lt;&#x2F;code&gt;, &lt;code&gt;description&lt;&#x2F;code&gt;, &lt;code&gt;author&lt;&#x2F;code&gt; and &lt;code&gt;keywords&lt;&#x2F;code&gt; keys.
I also commented out the &lt;code&gt;textlogo&lt;&#x2F;code&gt; so that the name of my blog would appear instead of the Abridge logo.&lt;&#x2F;p&gt;
&lt;p&gt;I then added a &lt;code&gt;favicon-32x32.png&lt;&#x2F;code&gt; file to the &lt;code&gt;static&lt;&#x2F;code&gt; folder and commented out all the other icons in &lt;code&gt;config.toml&lt;&#x2F;code&gt;. It doesn&#x27;t look great but at least it&#x27;s mine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pwa&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pwa&quot; aria-label=&quot;Anchor link for: pwa&quot;&gt;PWA&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I could then easily turn my website into a progressive web app thanks to Abridge. This allows users to install my website as if it was a native application.&lt;&#x2F;p&gt;
&lt;p&gt;I copied the necessary &lt;code&gt;manifest.json&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh z-code&quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;cp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; themes&#x2F;abridge&#x2F;static&#x2F;manifest.json static&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I then modified it with the name of my blog and added my icon files.&lt;&#x2F;p&gt;
&lt;p&gt;And finally, I ran the abridge script to generate the minified manifest file.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh z-code&quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; run abridge&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;netlify&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#netlify&quot; aria-label=&quot;Anchor link for: netlify&quot;&gt;Netlify&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The last thing I had to do before publishing was modify the &lt;code&gt;netlify.toml&lt;&#x2F;code&gt; file to adapt it to my url.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Building a performant static blog with advanced features is pretty easy nowadays.
And I hope I will be publishing many articles on this blog.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
