<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AdriaanLouw</title>
    <description>The latest articles on DEV Community by AdriaanLouw (@adriaanlouw).</description>
    <link>https://dev.to/adriaanlouw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F373701%2Fc5cb3ff7-0309-4c63-9d4c-4aef3d9a10b0.jpeg</url>
      <title>DEV Community: AdriaanLouw</title>
      <link>https://dev.to/adriaanlouw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adriaanlouw"/>
    <language>en</language>
    <item>
      <title>I built a programming language that reads like plain English — and compiles to Go</title>
      <dc:creator>AdriaanLouw</dc:creator>
      <pubDate>Thu, 09 Jul 2026 14:28:41 +0000</pubDate>
      <link>https://dev.to/adriaanlouw/i-built-a-programming-language-that-reads-like-plain-english-and-compiles-to-go-kc0</link>
      <guid>https://dev.to/adriaanlouw/i-built-a-programming-language-that-reads-like-plain-english-and-compiles-to-go-kc0</guid>
      <description>&lt;p&gt;Six weeks ago I had a broken prototype and a bad habit: I build things to 90% and never ship them. &lt;/p&gt;

&lt;p&gt;Today, hotgrin v0.5.4 is live — a programming language that reads like plain English, compiles (via Go) to real native executables, and explains your mistakes kindly in English or Afrikaans.&lt;/p&gt;

&lt;p&gt;This is the story, the honest technical bits, and why I think you might enjoy it — whether you've never written a line of code or you've written a million.&lt;/p&gt;

&lt;p&gt;Impatient? Fair. → &lt;a href="https://hotgrin.github.io/hotgrin/playground/" rel="noopener noreferrer"&gt;Try it&lt;/a&gt; in your browser right now — nothing to install. Or go straight to the &lt;a href="https://github.com/Hotgrin/hotgrin" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; repo.&lt;br&gt;
This is a complete hotgrin program:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;action discount with price, percent
    give back price minus (price times percent divided by 100)
end action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set total to 897
say "Total: R" plus total
say "After 10% off: R" plus discount with total, 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total: R897
After 10% off: R807.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/docs/getting-started.md" rel="noopener noreferrer"&gt;Get started&lt;/a&gt; with hotgrin here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/examples/learn" rel="noopener noreferrer"&gt;Learn&lt;/a&gt; hotgrin in 27 small steps.&lt;/p&gt;

&lt;p&gt;You can even &lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/docs/ai-prompt-pack.md" rel="noopener noreferrer"&gt;use hotgrin in you favourite AI Assistant&lt;/a&gt;, like Claude, ChatGPT, Gemini or Grok.&lt;/p&gt;

&lt;p&gt;No semicolons. No curly braces. &lt;/p&gt;

&lt;p&gt;Read the language reference &lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/docs/language-reference.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And &lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/ROADMAP.md" rel="noopener noreferrer"&gt;here&lt;/a&gt; you'll find hotgrin's roadmap.&lt;/p&gt;

&lt;p&gt;Two things you might not expect:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Names can have spaces. &lt;code&gt;set cart total to 0&lt;/code&gt; — &lt;code&gt;cart total&lt;/code&gt; is one name. A small set of reserved connector words (&lt;code&gt;to&lt;/code&gt;, &lt;code&gt;of&lt;/code&gt;, &lt;code&gt;with&lt;/code&gt;, &lt;code&gt;is&lt;/code&gt;...) bound names, and longest-match lexing sorts out phrases like &lt;code&gt;is greater than&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Maths behaves like school maths. &lt;code&gt;7 divided by 2&lt;/code&gt; is &lt;code&gt;3.5&lt;/code&gt;, because
that's what a person means. Brackets group. &lt;code&gt;plus&lt;/code&gt; joins text or adds
numbers and converts between them for you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing is hidden (the part for the pros)&lt;br&gt;
hotgrin isn't an interpreter with training wheels. It transpiles to Go and&lt;br&gt;
compiles a real binary — &lt;code&gt;hotgrin build --windows hello.hot&lt;/code&gt; hands you a&lt;br&gt;
genuine &lt;code&gt;.exe&lt;/code&gt; to give to anyone. And you can look behind the curtain any&lt;br&gt;
time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hotgrin reveal hello.hot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Types are inferred (whole numbers, decimals, text, truth values, lists,&lt;br&gt;
records), testing is part of the language (&lt;code&gt;test "..."&lt;/code&gt; blocks with&lt;br&gt;
&lt;code&gt;expect ... to be ...&lt;/code&gt;), error handling is honest (&lt;code&gt;give back problem&lt;/code&gt; /&lt;br&gt;
&lt;code&gt;try / if it fails&lt;/code&gt;, and unhandled failures are refused before the program&lt;br&gt;
runs), and there's structured concurrency that compiles to goroutines with&lt;br&gt;
the shared state guarded for you.&lt;br&gt;
And when the language doesn't have something? Open the escape hatch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="k"&gt;go&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"strings"&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;shoutCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"!"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="k"&gt;go&lt;/span&gt;

&lt;span class="n"&gt;say&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="s"&gt;"howzit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything you declare between &lt;code&gt;use go&lt;/code&gt; and &lt;code&gt;end go&lt;/code&gt; becomes a callable action —&lt;br&gt;
&lt;code&gt;shoutCase&lt;/code&gt; reads as &lt;code&gt;shout case&lt;/code&gt;. Return &lt;code&gt;(T, error)&lt;/code&gt; and hotgrin treats it as fallible, forcing callers into &lt;code&gt;try&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The entire Go ecosystem is one block away.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Watcher — my favourite part.&lt;/p&gt;

&lt;p&gt;Every program is checked before it runs by something I call the Watcher.&lt;br&gt;
It has one iron rule: it only speaks when it can prove something is wrong.&lt;br&gt;
No false alarms, no style nagging. And it explains like a patient friend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error  line 2: there is no value called 'totall' here —
       is it a typo, or did you forget to set it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer Afrikaans? Add &lt;code&gt;--af&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fout   reël 2: daar is geen waarde genaamd 'totall' hier nie —
       is dit 'n tikfout, of het jy vergeet om dit te stel?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As far as I know, hotgrin is the only programming language with first-class Afrikaans error messages. The mechanism is general — isiZulu and isiXhosa are on the roadmap, and native speakers are very welcome.&lt;/p&gt;

&lt;p&gt;You will never see a raw Go compiler error. That's a promise built into the design: if the Watcher is happy, the generated Go compiles.&lt;/p&gt;

&lt;p&gt;v0.5's headline: units of measure:&lt;br&gt;
This was the dream feature in my original spec, and it shipped this week:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set weight to 129 kg
say weight                    # 129 kg
say weight in g               # 129000 g

set walk to 2 km plus 500 m
say "Walk: " plus walk        # Walk: 2.5 km

if 90 min is greater than 1 h
    say "That is more than an hour"
end if
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measurements print themselves, convert with &lt;code&gt;in&lt;/code&gt;, and combine across units of the same dimension. And if you add kilograms to metres?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error  line 3: cannot combine kg and m — one measures mass, the other length
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caught kindly, before anything runs.&lt;/p&gt;

&lt;p&gt;What else is in the box?&lt;br&gt;
&lt;code&gt;ask "What is your name?" into name&lt;/code&gt; — interactive programs&lt;/p&gt;

&lt;p&gt;Files: &lt;code&gt;use "std/data"&lt;/code&gt; → &lt;code&gt;read file&lt;/code&gt; / &lt;code&gt;write file&lt;/code&gt; (fallible, so the&lt;br&gt;
language makes you handle the failure)&lt;/p&gt;

&lt;p&gt;The web: &lt;code&gt;use "std/web"&lt;/code&gt; → &lt;code&gt;fetch text&lt;/code&gt; a URL, &lt;code&gt;json value&lt;/code&gt; to pull a&lt;br&gt;
field out by dotted path&lt;/p&gt;

&lt;p&gt;Libraries: local files, or straight from GitHub —&lt;br&gt;
&lt;code&gt;use tools from "github.com/user/repo"&lt;/code&gt; (fetched with git, cached, &lt;code&gt;@tag&lt;/code&gt;&lt;br&gt;
pinning supported)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/docs/cookbook.md" rel="noopener noreferrer"&gt;A cookbook of 21 recipes&lt;/a&gt; — every single one is machine-verified to run exactly as printed&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hotgrin/hotgrin/blob/main/examples/projects/invoice-maker" rel="noopener noreferrer"&gt;A complete worked project&lt;/a&gt; —&lt;br&gt;
a loan calculator with real amortization maths and tests.&lt;/p&gt;

&lt;p&gt;Why I built it:&lt;br&gt;
I'm Adriaan, from Johannesburg. hotgrin started with a frustration: the&lt;br&gt;
first hour of programming shouldn't be about semicolons — but the tools that fix that are usually toys, and nobody wants to learn a toy.&lt;/p&gt;

&lt;p&gt;So the rule became: read like English, compile like Go, and never have a&lt;br&gt;
ceiling. The language you learn on Saturday should be one you could ship&lt;br&gt;
with on Monday. &lt;/p&gt;

&lt;p&gt;And because learning lands deepest in your own language, the Watcher speaks two of ours.&lt;/p&gt;

&lt;p&gt;The other honest confession: I have a long history of building to phase 90&lt;br&gt;
and never shipping. This project broke that pattern — v0.1.0 to v0.5.0, each release tagged, tested (88 tests across 8 packages, CI on every commit), and released with binaries for Windows, Linux, and macOS built automatically.&lt;/p&gt;

&lt;p&gt;It's honestly alpha.&lt;br&gt;
Version 0.5.4, rough edges, small standard library, and a public&lt;br&gt;
roadmap that gets reordered by real use — three of v0.3's features came directly from pain I hit writing the cookbook. &lt;/p&gt;

&lt;p&gt;Next up: an interpreter mode (no Go install at all), and more Watcher rules.&lt;/p&gt;

&lt;p&gt;Try it in the next 60 seconds. Zero install: the browser playground —&lt;br&gt;
type English on the left, watch real Go appear on the right, flip the&lt;br&gt;
Watcher to Afrikaans for fun.&lt;/p&gt;

&lt;p&gt;Have Go? &lt;code&gt;go install github.com/hotgrin/hotgrin/cmd/hotgrin@latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hotgrin/hotgrin/archive/refs/heads/main.zip" rel="noopener noreferrer"&gt;Prefer a download&lt;/a&gt;? Prebuilt binaries for Windows, Linux, and macOS.&lt;/p&gt;

&lt;p&gt;Then make a file called &lt;code&gt;hello.hot&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;say "Hello, world"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hotgrin run hello.hot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo is here → &lt;a href="https://github.com/Hotgrin/hotgrin" rel="noopener noreferrer"&gt;github.com/Hotgrin/hotgrin&lt;/a&gt; —&lt;br&gt;
&lt;strong&gt;please, a star helps more than you'd think at this stage&lt;/strong&gt;, and an issue &lt;strong&gt;telling me what confused you helps even more&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;That's literally how the roadmap gets written.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gaan maak iets. Go make something. 😁
&lt;/h2&gt;

&lt;p&gt;hotgrin is MIT-licensed and built in the open. If you teach programming, or you know someone who's always wanted to start — I'd especially love to hear from you.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>go</category>
    </item>
  </channel>
</rss>
