{"article":{"slug":"we-should-be-able-to-change-our-languages","title":"We Should Be Able to Change Our Languages","subtitle":null,"summary":"Jimmy Miller argues AI-era coding makes language macros newly practical, introduces Sweetener for TypeScript, and asks why we still fear customizable programming languages.","content_type":"essay","language":"en","canonical_url":"http://jimmyhmiller.com/change-our-languages","author":{"name":"Jimmy Miller","url":"http://jimmyhmiller.com","person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Jimmy Miller","url":"http://jimmyhmiller.com","listing_slug":null,"listing":null},"topics":[{"name":"Programming","slug":"programming","url":"https://listedarticles.com/topics/programming"},{"name":"TypeScript","slug":"typescript","url":"https://listedarticles.com/topics/typescript"},{"name":"LLMs","slug":"llms","url":"https://listedarticles.com/topics/llms"},{"name":"Developer Tools","slug":"developer-tools","url":"https://listedarticles.com/topics/developer-tools"},{"name":"Opinion","slug":"opinion","url":"https://listedarticles.com/topics/opinion"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":535,"reading_minutes":2,"published_at":"2026-09-01T12:00:00.000Z","added_at":"2026-09-27T09:12:57.878Z","updated_at":"2026-09-27T09:12:57.878Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/we-should-be-able-to-change-our-languages","markdown_url":"https://listedarticles.com/articles/we-should-be-able-to-change-our-languages.md","example":false,"citation":"Jimmy Miller, Jimmy Miller. \"We Should Be Able to Change Our Languages.\" 1 Sept 2026. http://jimmyhmiller.com/change-our-languages (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"http://jimmyhmiller.com/change-our-languages"},"body_markdown":"# We Should Be Able to Change Our Languages\n\n**Author:** Jimmy Miller  \n**Published:** September 2026  \n**Source:** [jimmyhmiller.com](http://jimmyhmiller.com/change-our-languages)\n\nProgramming languages are fixed artifacts. Defined by committee or that one really smart person. They are sacred artifacts whose contours are fixed for good reasons. The idea of changing your programming language, of customizing it for your own needs, is a drastic measure that should never be done. Or at least that's how people act. In a world where software is becoming increasingly flexible, moldable, editable, our programming languages resist this change.\n\nInstead, we build incredibly complicated build systems. We create complex conventions that give us the semantics we wished our languages had. We reuse existing language constructs and give them different meanings. We form committees to advocate for changes to our languages, bike-shedding endlessly, because the idea of just letting each individual codebase make its own decisions offends our sensibilities.\n\n## Why We Resist\n\nThe ability for people to define their language to be the way they want is not new. It isn't difficult. But there has been a large backlash against it for decades. People avoid languages that offer this functionality. Even in languages that have it, some teams choose to completely ban it.\n\nRaymond Chen's 2005 blog post *A rant against flow control macros* puts the common argument well: when you create a flow-control macro, you're modifying the language — and people expect `.cpp` files to be C++, not a strange dialect.\n\nRichard P. Gabriel echoed a related concern: macros encourage people who are not good at language design to do something equivalent to language design, with effects that are too powerful.\n\n## Do These Reasons Hold Up Anymore?\n\n### It Has Never Been Easier to Understand Code\n\nToday, you aren't reliant on finding a local expert. You can use an LLM to help you gain understanding in the ways that fit how you learn — custom visualizations, demos, and increasingly specific questions.\n\n### Understanding Each Bit of Code is Less Important Than It's Ever Been\n\nThings have been changing drastically. If you can make code faster and better, even at the cost of readability to you, but the AI can work with it perfectly fine, why wouldn't you?\n\n## Sweetener, Macros for TypeScript\n\nAI makes it trivial to write macros. AI makes it trivial to understand complex macros. Debugging code has become easier. And AI-written code might benefit greatly from macros. Jimmy resurrects the SweetJs idea for TypeScript as **Sweetener**.\n\n### Custom operators (pipe)\n\n```\nimport { (|>) } from \"./macros.sts\" for syntax;\n\nexport const total = [1, 2, 3]\n|> map((n) => n * 2)\n|> reduce((sum, n) => sum + n, 0);\n```\n\n### Algebraic datatypes\n\n```\ndata Tree<T> = Leaf() | Node(left: Tree<T>, value: T, right: Tree<T>);\n```\n\n### Control flow in TSX\n\n```\nexport const list = (items: readonly Item[]) => (\n  <ul>\n    {each (items as item, index)}\n      <li key={item.id}>{index}: {item.name}</li>\n    {end}\n  </ul>\n);\n```\n\n## Why Care About Macros If I'm Not Reading the Code\n\nMacros encode larger patterns and automatically make sure AIs follow them — helping tame inconsistency as codebases grow.\n\n## Macros are not Enough\n\nWe have spent countless engineering hours building tooling, parsers, linters, type checkers, build tools, all because our languages don't give us the ability to do what we need. That's no longer the case. It is time that changed.\n","body_html":"<h1 id=\"we-should-be-able-to-change-our-languages\">We Should Be Able to Change Our Languages</h1>\n<p><strong>Author:</strong> Jimmy Miller<br />\n<strong>Published:</strong> September 2026<br />\n<strong>Source:</strong> <a href=\"http://jimmyhmiller.com/change-our-languages\" rel=\"nofollow ugc noopener\">jimmyhmiller.com</a></p>\n<p>Programming languages are fixed artifacts. Defined by committee or that one really smart person. They are sacred artifacts whose contours are fixed for good reasons. The idea of changing your programming language, of customizing it for your own needs, is a drastic measure that should never be done. Or at least that&#39;s how people act. In a world where software is becoming increasingly flexible, moldable, editable, our programming languages resist this change.</p>\n<p>Instead, we build incredibly complicated build systems. We create complex conventions that give us the semantics we wished our languages had. We reuse existing language constructs and give them different meanings. We form committees to advocate for changes to our languages, bike-shedding endlessly, because the idea of just letting each individual codebase make its own decisions offends our sensibilities.</p>\n<h2 id=\"why-we-resist\">Why We Resist</h2>\n<p>The ability for people to define their language to be the way they want is not new. It isn&#39;t difficult. But there has been a large backlash against it for decades. People avoid languages that offer this functionality. Even in languages that have it, some teams choose to completely ban it.</p>\n<p>Raymond Chen&#39;s 2005 blog post <em>A rant against flow control macros</em> puts the common argument well: when you create a flow-control macro, you&#39;re modifying the language — and people expect <code>.cpp</code> files to be C++, not a strange dialect.</p>\n<p>Richard P. Gabriel echoed a related concern: macros encourage people who are not good at language design to do something equivalent to language design, with effects that are too powerful.</p>\n<h2 id=\"do-these-reasons-hold-up-anymore\">Do These Reasons Hold Up Anymore?</h2>\n<h3 id=\"it-has-never-been-easier-to-understand-code\">It Has Never Been Easier to Understand Code</h3>\n<p>Today, you aren&#39;t reliant on finding a local expert. You can use an LLM to help you gain understanding in the ways that fit how you learn — custom visualizations, demos, and increasingly specific questions.</p>\n<h3 id=\"understanding-each-bit-of-code-is-less-important-than-it-s-ever-\">Understanding Each Bit of Code is Less Important Than It&#39;s Ever Been</h3>\n<p>Things have been changing drastically. If you can make code faster and better, even at the cost of readability to you, but the AI can work with it perfectly fine, why wouldn&#39;t you?</p>\n<h2 id=\"sweetener-macros-for-typescript\">Sweetener, Macros for TypeScript</h2>\n<p>AI makes it trivial to write macros. AI makes it trivial to understand complex macros. Debugging code has become easier. And AI-written code might benefit greatly from macros. Jimmy resurrects the SweetJs idea for TypeScript as <strong>Sweetener</strong>.</p>\n<h3 id=\"custom-operators-pipe\">Custom operators (pipe)</h3>\n<pre><code>import { (|&gt;) } from &quot;./macros.sts&quot; for syntax;\n\nexport const total = [1, 2, 3]\n|&gt; map((n) =&gt; n * 2)\n|&gt; reduce((sum, n) =&gt; sum + n, 0);</code></pre>\n<h3 id=\"algebraic-datatypes\">Algebraic datatypes</h3>\n<pre><code>data Tree&lt;T&gt; = Leaf() | Node(left: Tree&lt;T&gt;, value: T, right: Tree&lt;T&gt;);</code></pre>\n<h3 id=\"control-flow-in-tsx\">Control flow in TSX</h3>\n<pre><code>export const list = (items: readonly Item[]) =&gt; (\n  &lt;ul&gt;\n    {each (items as item, index)}\n      &lt;li key={item.id}&gt;{index}: {item.name}&lt;/li&gt;\n    {end}\n  &lt;/ul&gt;\n);</code></pre>\n<h2 id=\"why-care-about-macros-if-i-m-not-reading-the-code\">Why Care About Macros If I&#39;m Not Reading the Code</h2>\n<p>Macros encode larger patterns and automatically make sure AIs follow them — helping tame inconsistency as codebases grow.</p>\n<h2 id=\"macros-are-not-enough\">Macros are not Enough</h2>\n<p>We have spent countless engineering hours building tooling, parsers, linters, type checkers, build tools, all because our languages don&#39;t give us the ability to do what we need. That&#39;s no longer the case. It is time that changed.</p>","headings":[{"level":1,"text":"We Should Be Able to Change Our Languages","id":"we-should-be-able-to-change-our-languages"},{"level":2,"text":"Why We Resist","id":"why-we-resist"},{"level":2,"text":"Do These Reasons Hold Up Anymore?","id":"do-these-reasons-hold-up-anymore"},{"level":3,"text":"It Has Never Been Easier to Understand Code","id":"it-has-never-been-easier-to-understand-code"},{"level":3,"text":"Understanding Each Bit of Code is Less Important Than It's Ever Been","id":"understanding-each-bit-of-code-is-less-important-than-it-s-ever-"},{"level":2,"text":"Sweetener, Macros for TypeScript","id":"sweetener-macros-for-typescript"},{"level":3,"text":"Custom operators (pipe)","id":"custom-operators-pipe"},{"level":3,"text":"Algebraic datatypes","id":"algebraic-datatypes"},{"level":3,"text":"Control flow in TSX","id":"control-flow-in-tsx"},{"level":2,"text":"Why Care About Macros If I'm Not Reading the Code","id":"why-care-about-macros-if-i-m-not-reading-the-code"},{"level":2,"text":"Macros are not Enough","id":"macros-are-not-enough"}]}}