<?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: Kris Simon</title>
    <description>The latest articles on DEV Community by Kris Simon (@kris_simon).</description>
    <link>https://dev.to/kris_simon</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3887572%2F36df04ed-62c9-497e-b7eb-c89eb956dced.jpeg</url>
      <title>DEV Community: Kris Simon</title>
      <link>https://dev.to/kris_simon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kris_simon"/>
    <language>en</language>
    <item>
      <title>ARO – A language where business logic reads like documentation</title>
      <dc:creator>Kris Simon</dc:creator>
      <pubDate>Sun, 19 Apr 2026 16:25:10 +0000</pubDate>
      <link>https://dev.to/kris_simon/aro-a-language-where-business-logic-reads-like-documentation-1p8j</link>
      <guid>https://dev.to/kris_simon/aro-a-language-where-business-logic-reads-like-documentation-1p8j</guid>
      <description>&lt;p&gt;&lt;strong&gt;Per AutoModerator's request I hereby confirm that the whole purpose of this project &lt;em&gt;is&lt;/em&gt; to be LLM-generated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've been building &lt;a href="https://arolang.github.io/aro/" rel="noopener noreferrer"&gt;ARO&lt;/a&gt;, a declarative programming language where every statement follows a single grammatical pattern: &lt;code&gt;Action the Result preposition the Object.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The idea is that business features should be readable by anyone — developers, PMs, compliance officers — without translation. Here's a complete REST API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(listUsers: User API) {
    Retrieve the &amp;lt;users&amp;gt; from the &amp;lt;user-repository&amp;gt;.
    Return an &amp;lt;OK: status&amp;gt; with &amp;lt;users&amp;gt;.
}

(createUser: User API) {
    Extract the &amp;lt;data&amp;gt; from the &amp;lt;request: body&amp;gt;.
    Validate the &amp;lt;data&amp;gt; against the &amp;lt;user: schema&amp;gt;.
    Create the &amp;lt;user&amp;gt; with &amp;lt;data&amp;gt;.
    Store the &amp;lt;user&amp;gt; into the &amp;lt;user-repository&amp;gt;.
    Emit a &amp;lt;UserCreated: event&amp;gt; with &amp;lt;user&amp;gt;.
    Return a &amp;lt;Created: status&amp;gt; with &amp;lt;user&amp;gt;.
}

(Send Welcome Email: UserCreated Handler) {
    Extract the &amp;lt;user&amp;gt; from the &amp;lt;event: user&amp;gt;.
    Send the &amp;lt;welcome-email&amp;gt; to the &amp;lt;user: email&amp;gt;.
    Return an &amp;lt;OK: status&amp;gt; for the &amp;lt;notification&amp;gt;.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not pseudocode. It compiles and runs.&lt;/p&gt;

&lt;p&gt;HTTP routes come from an &lt;code&gt;openapi.yaml&lt;/code&gt; contract — the feature set name matches the &lt;code&gt;operationId&lt;/code&gt;. No routing DSL, no decorators. No OpenAPI file, no server. The event handler at the bottom fires automatically whenever a &lt;code&gt;UserCreated&lt;/code&gt; event is emitted. You don't call it — you just add it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it interesting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You only write the happy path.&lt;/strong&gt; There are no try/catch blocks, no null checks, no error codes. When &lt;code&gt;Retrieve the &amp;lt;user&amp;gt; from the &amp;lt;user-repository&amp;gt; where id = &amp;lt;id&amp;gt;&lt;/code&gt; fails, the error message IS that statement. The code literally becomes its own error message. Sounds crazy, works surprisingly well for internal tools and prototyping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contract-first APIs.&lt;/strong&gt; Your OpenAPI spec is the single source of truth for routing. Drop it next to your &lt;code&gt;.aro&lt;/code&gt; files and the server starts. This forces you to design your API before implementing it, which is usually what you want.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event-driven architecture is built in.&lt;/strong&gt; &lt;code&gt;Emit&lt;/code&gt; an event, and any feature set whose business activity matches &lt;code&gt;EventName Handler&lt;/code&gt; picks it up. Adding a new side-effect to user creation is just adding a new feature set file — you never touch existing code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plugins in any language.&lt;/strong&gt; Write extensions in Swift, Rust, C, or Python. They all compile to a shared C ABI. Works in both interpreter mode (&lt;code&gt;aro run&lt;/code&gt;) and compiled binaries (&lt;code&gt;aro build&lt;/code&gt;). For example &lt;a href="https://github.com/arolang/Lowbar" rel="noopener noreferrer"&gt;Lowbar&lt;/a&gt; (wip).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native compilation.&lt;/strong&gt; &lt;code&gt;aro build ./MyApp&lt;/code&gt; produces a standalone binary through LLVM. No runtime needed on the target machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-platform.&lt;/strong&gt; macOS, Linux, and (someday) Windows. Built-in HTTP server, file system operations with directory watching, and TCP sockets — no external dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;100+ working examples&lt;/strong&gt; covering HTTP APIs, file watchers, sockets, data pipelines, state machines, WebSocket chat, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest weaknesses
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Not production-ready.&lt;/strong&gt; The error philosophy that makes the language elegant also makes it insecure. You can't catch specific errors or implement fallback logic. Great for prototypes, internal tools, build systems and learning — not for your payment system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The grammar is restrictive by design.&lt;/strong&gt; Everything must be &lt;code&gt;Action Result Preposition Object&lt;/code&gt;. Sometimes that makes things verbose or awkward. You won't replace Python with this. The constraint is the feature, but it's also the limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No real type system yet.&lt;/strong&gt; Type checking is in progress. For now it's dynamically typed at runtime, which means some errors that should be caught at compile time aren't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tooling is minimal.&lt;/strong&gt; No step-debugger, yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small community.&lt;/strong&gt; There's no ecosystem of libraries, no Stack Overflow answers, no tutorials beyond the docs, the books and the examples in the org-repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it exists
&lt;/h2&gt;

&lt;p&gt;I'll be honest: I wanted to see what happens when you let AI help you tackle a domain you're not fully confident in — language design, parsers, compiler theory. The AI doesn't stop you from doing daft things, but the process taught me more about lexers, ASTs, and code generation than I ever expected. It also gave me a deeper knowledge about agentic coding and training a local model. It started as a learning experiment and grew into something with native compilation, multi-language plugins, and a coherent &lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-Construction-Studies.pdf" rel="noopener noreferrer"&gt;design philosophy&lt;/a&gt;. Sometimes the best education comes from poking at something you probably shouldn't, with tools that don't know any better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Books
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-Essential-Primer.pdf" rel="noopener noreferrer"&gt;Essential Primer&lt;/a&gt;
A concise introduction to ARO for developers who want to get up to speed quickly&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-Language-Guide.pdf" rel="noopener noreferrer"&gt;The Language Guide&lt;/a&gt;
Comprehensive guide to ARO: from mental model to native compilation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-By-Example.pdf" rel="noopener noreferrer"&gt;ARO By Example&lt;/a&gt;
Build a real web scraper from scratch: project setup through Docker deployment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-Plugin-Guide.pdf" rel="noopener noreferrer"&gt;The Plugin Guide&lt;/a&gt;
Write plugins in Swift, Rust, C, C++, or Python: architecture, manifests, testing, and publishing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-Construction-Studies.pdf" rel="noopener noreferrer"&gt;Construction Studies&lt;/a&gt;
Deep dive into the compiler internals: lexer, parser, AST, semantic analysis, and LLVM codegen&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it, break it, tell me what's wrong
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap arolang/aro &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install &lt;/span&gt;aro
aro run ./Examples/HelloWorld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Binaries for macOS and Linux are on the &lt;a href="https://arolang.github.io/aro/download.html" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;. Requires Swift 6.2 if building from source.&lt;/p&gt;

&lt;p&gt;I'm actively developing this and would love feedback — especially the kind that comes as GitHub issues. Found a confusing error message? Missing a built-in action? Think the scoping rules are wrong? Something that just doesn't make sense? That's exactly what I want to hear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://arolang.github.io/aro/" rel="noopener noreferrer"&gt;https://arolang.github.io/aro/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open an issue:&lt;/strong&gt; &lt;a href="https://github.com/arolang/aro/issues" rel="noopener noreferrer"&gt;https://github.com/arolang/aro/issues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/arolang/aro" rel="noopener noreferrer"&gt;https://github.com/arolang/aro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docs &amp;amp; Language Guide (PDF):&lt;/strong&gt; &lt;a href="https://github.com/arolang/aro/releases/latest/download/ARO-Language-Guide.pdf" rel="noopener noreferrer"&gt;https://github.com/arolang/aro/releases/latest/download/ARO-Language-Guide.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mastodon&lt;/strong&gt;: @&lt;a href="mailto:aro@uitsmijter.io"&gt;aro@uitsmijter.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
