<?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: COMMENTERTHE9</title>
    <description>The latest articles on DEV Community by COMMENTERTHE9 (@commenterthe9).</description>
    <link>https://dev.to/commenterthe9</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%2F3823333%2F1af4f546-b6c0-4597-9d66-05fe6c618387.png</url>
      <title>DEV Community: COMMENTERTHE9</title>
      <link>https://dev.to/commenterthe9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/commenterthe9"/>
    <language>en</language>
    <item>
      <title>Cx Dev Log — 2026-03-31</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 02 Apr 2026 00:06:07 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-31-1c8j</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-31-1c8j</guid>
      <description>&lt;p&gt;Nothing shipped today. No compiler changes, no spec updates, no runtime work. The only commits in the last 24 hours were automated documentation: yesterday's blog post on &lt;code&gt;site&lt;/code&gt; and the daily log branch for March 30. The working tree is clean across all branches.&lt;/p&gt;

&lt;p&gt;This is the first fully idle day in a while, so it is worth taking stock of where things actually stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap, day five
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;submain&lt;/code&gt; branch is still 4 commits ahead of &lt;code&gt;main&lt;/code&gt;, unchanged since March 27. Those commits represent real, landed work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wrapping arithmetic enforcement&lt;/li&gt;
&lt;li&gt;Phase 10 while loop lowering&lt;/li&gt;
&lt;li&gt;UTF-8 string encoding decision locked&lt;/li&gt;
&lt;li&gt;Semicolon rule refinement&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All four are meaningful. The while loop lowering is backend progress. The wrapping arithmetic commit tightens numeric semantics. The UTF-8 and semicolon commits are spec-level decisions that close hard blockers and unblock downstream work.&lt;/p&gt;

&lt;p&gt;None of it is on &lt;code&gt;main&lt;/code&gt; yet. The merge has been predicted every day since March 27 and has not happened. The roadmap versions have diverged further: &lt;code&gt;main&lt;/code&gt; is on v4.7, &lt;code&gt;submain&lt;/code&gt; is on v4.6, and there is a v4.8 floating on an unmerged daily-log branch. Each day the gap sits, the &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt; conflict gets slightly worse. It is not a crisis, but it is accumulating friction for no clear reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard blockers holding steady
&lt;/h2&gt;

&lt;p&gt;The test runner and &lt;code&gt;assert&lt;/code&gt; infrastructure have now gone eight consecutive days with no movement. Same for the &lt;code&gt;Result&lt;/code&gt; error model. Both are listed as hard blockers. Both keep getting predicted as "next" and keep not happening.&lt;/p&gt;

&lt;p&gt;To be clear, these are not blocked by technical dependencies. The spec decisions that needed to land first (UTF-8, semicolons) have landed, at least on &lt;code&gt;submain&lt;/code&gt;. The test runner needs implementation work: a way to discover and run test functions, and a basic &lt;code&gt;assert&lt;/code&gt; mechanism. The error model needs a design decision on &lt;code&gt;Result&lt;/code&gt; semantics and then implementation. Neither is waiting on anything except someone sitting down and doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Matrix status
&lt;/h2&gt;

&lt;p&gt;78/78, unchanged. The frontend test matrix has been stable for over a week now. This is good in the sense that nothing is regressing, but it also reflects the lack of new work. New features or parser changes would be expected to temporarily bump or stress the matrix. Flat stability for this long just means nothing is moving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;The same list as yesterday, honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge submain to main.&lt;/strong&gt; The most straightforward action item. Four commits, one known roadmap conflict. Should be a 10-minute task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test runner and assert.&lt;/strong&gt; Hard blocker, eight days deferred. This is the thing that would most change the project's development velocity if it landed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error model.&lt;/strong&gt; Another hard blocker with extended inactivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend work.&lt;/strong&gt; If/else lowering and struct layout are the natural continuation of the backend progress that already landed on &lt;code&gt;submain&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yesterday's predictions all missed. None of them happened. Today had zero language development activity. Whether tomorrow breaks the pattern or extends it will say a lot about the project's current momentum.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-31" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-31&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-25</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 01 Apr 2026 00:05:23 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-25-5cj1</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-25-5cj1</guid>
      <description>&lt;p&gt;Two major threads converged today in the Cx language project, making a significant technical leap forward. The IR backend refactor has finally merged into main, transitioning the Backend trait interface from raw AST to a more robust IR. Simultaneously, over at submain, a newly introduced 301-line module resolver is set to redefine how we handle dependencies, circular imports, and topological sorting.&lt;/p&gt;

&lt;h2&gt;
  
  
  IR is now the backend interface
&lt;/h2&gt;

&lt;p&gt;March 24th saw the successful merge of PR #19, a union of four commits that ushered in Phase 0.5 of our backend architecture changes. The crux? Moving the Backend trait from using &lt;code&gt;&amp;amp;Program&lt;/code&gt; (AST) to &lt;code&gt;&amp;amp;IrModule&lt;/code&gt; (IR). With this one-way door, all backend development now requires IR input, no turning back to the AST-based approach. Cranelift and LLVM backends received immediate updates in response.&lt;/p&gt;

&lt;p&gt;The additional commits introduced vital debugging tools for the IR pipeline. These might not seem groundbreaking, but when you need to diagnose a validation failure, having an automatic IR module dump can save a lot of headaches. There's also a new &lt;code&gt;--backend=validate&lt;/code&gt; mode crafted for running IR lowering and validation sans any codegen backends. For a more granular look, the &lt;code&gt;--debug-trace&lt;/code&gt; flag will now print each IR instruction as it gets emitted during lowering. These utilities make working on the IR pipeline significantly less of a chore, particularly with upcoming complexities like loops and structs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Module resolver on submain
&lt;/h2&gt;

&lt;p&gt;The module resolver emerged as submain’s headline contribution. Clocking in at 301 lines, &lt;code&gt;resolver.rs&lt;/code&gt; constructs dependency graphs, shines with circular import detection, and supports path-based topological sorting. Through &lt;code&gt;ModuleId&lt;/code&gt;, &lt;code&gt;ImportEdge&lt;/code&gt;, &lt;code&gt;ResolvedFile&lt;/code&gt;, and &lt;code&gt;ResolvedProgram&lt;/code&gt;, it ensures a verified process for relative &lt;code&gt;./&lt;/code&gt; paths, and caps recursion depth at 100. Note that &lt;code&gt;std/&lt;/code&gt; imports without a local file aren't supported in v0.1 and will raise clear errors immediately.&lt;/p&gt;

&lt;p&gt;The resolver has now threaded into &lt;code&gt;main.rs&lt;/code&gt;, positioned squarely between parsing and semantic analysis. For single-file programs, you'll notice no difference. But when it comes to multi-file programs, missing imported files prompt clear error messages instead of cryptic failures.&lt;/p&gt;

&lt;p&gt;A third notable addition, the &lt;code&gt;ExportTable&lt;/code&gt; struct arrived in &lt;code&gt;semantic_types.rs&lt;/code&gt;, complete with maps for functions, structs, consts, and enums. This sets the stage for robust cross-file symbol resolution. Public symbols in a resolved module now populate the export table, effectively allowing importing files to reference them using &lt;code&gt;alias.symbol&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tests t65 and t66 on submain intentionally flipped to &lt;code&gt;expected_fail&lt;/code&gt; to reflect the resolver's accuracy. On main, they would erroneously pass due to lack of meaningful import resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design choices worth noting
&lt;/h2&gt;

&lt;p&gt;Building a real dependency graph was a deliberate choice despite the extra effort. It offers more than simple file loading by providing stable module IDs and import edges necessary for dead symbol elimination and circular import detection in the future. Possible &lt;code&gt;../&lt;/code&gt; path traversals are permitted but will be managed better beyond v0.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still in progress
&lt;/h2&gt;

&lt;p&gt;Everything implemented today resides in submain, pending a merge request to integrate onto the main branch. The ExportTable is present, yet it doesn't populate during analysis. Up next is populating the export table with symbols from the topologically ordered files, making these symbols available to files through alias mapping.&lt;/p&gt;

&lt;p&gt;Tests t65 and t66 are yet to tackle real-world, multi-file test programs. Creating these programs, like stubs for &lt;code&gt;player.cx&lt;/code&gt; and &lt;code&gt;std/math&lt;/code&gt;, would help validate the full resolver-to-execution flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The next big milestone? Bringing submain’s resolver and ExportTable onto the main branch. Prioritizing the integration of ExportTable into semantic analysis is vital for fully functional multi-file support. On the IR frontier, turning our attention to loop and struct lowering is crucial now that the debugging tools are in place and the backend expects &lt;code&gt;&amp;amp;IrModule&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The good news? The test suite stands firm with 72 out of 72 tests green, signaling no regressions from today’s work.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-25" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-25&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-30</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 31 Mar 2026 00:16:43 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-30-4k1f</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-30-4k1f</guid>
      <description>&lt;p&gt;Two spec-level decisions have landed on &lt;code&gt;submain&lt;/code&gt; today. The UTF-8 string encoding model for Cx is locked, and the semicolon rule has been defined with more precision. Neither commit introduces a new feature, but they remove blockers by clarifying design decisions. The current progress holds at 78/78 in the matrix.&lt;/p&gt;

&lt;h2&gt;
  
  
  UTF-8, locked everywhere
&lt;/h2&gt;

&lt;p&gt;The debate over string encoding is concluded: Cx is strictly UTF-8. Here’s what that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All source files must be in UTF-8.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;str&lt;/code&gt; values must be valid UTF-8 at runtime, or they trigger an error.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;char&lt;/code&gt; refers to a Unicode scalar value.&lt;/li&gt;
&lt;li&gt;Binary data? That's for byte buffers, not &lt;code&gt;str&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This decision is now documented in Section 25 of &lt;code&gt;docs/cx_syntax.md&lt;/code&gt; and checked off as a completed hard blocker on the roadmap. No changes to runtime or compiler code here—this is a purely spec decision. Yet, it's significant because it paves the way for critical stdlib and filesystem work. Without a locked string encoding model, defining file I/O or string manipulation functions was impossible.&lt;/p&gt;

&lt;p&gt;The decision deliberately mirrors Rust's approach—no room for Latin-1 fallback, no WTF-8, and no byte strings pretending to be &lt;code&gt;str&lt;/code&gt;. For a systems language that aims for predictable string behavior, this choice makes sense. The design space is now firmly closed on this front.&lt;/p&gt;

&lt;h2&gt;
  
  
  Semicolon rule refinement
&lt;/h2&gt;

&lt;p&gt;The semicolon policy got stricter yet remains unresolved. A single parser edit at &lt;code&gt;src/frontend/parser.rs:377&lt;/code&gt; now permits declaration semicolons to be optional using &lt;code&gt;.then_ignore(semi.clone().or_not())&lt;/code&gt;, but expression statements still need them.&lt;/p&gt;

&lt;p&gt;The logic isn't complicated: since the parser lacks newline awareness, it sees &lt;code&gt;x + 1&lt;/code&gt; in an expression statement context as ambiguous. Is it a complete statement or part of something larger? To avoid ambiguity, semicolons are required for expressions—without rewriting the parser.&lt;/p&gt;

&lt;p&gt;The roadmap now includes an updated Known Gaps entry that shifts from a vague note on inconsistent behavior to a specific outline of the workable and non-workable bits. The goals for fully optional semicolon syntax are officially postponed beyond version 0.1, pending a newline-aware parser redesign.&lt;/p&gt;

&lt;p&gt;This transparency about design and implementation shortfalls doesn't mask the situation. The commit essentially lays bare where the project stands and why it isn't quite there yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec-tightening phase
&lt;/h2&gt;

&lt;p&gt;Today's contributions lean heavily on documentation rather than code. The UTF-8 commit involves no code changes, and the semicolon tweak is a single line paired with documentation updates. This indicates that the project is in a spec-tightening phase—locking choices, documenting limits, and finalizing design questions instead of cranking out new features.&lt;/p&gt;

&lt;p&gt;It's a sensible focus. The frontend matrix remains stable at 78/78. Backend operations, like scalar layout, have previously been solidified through ABI work. Upcoming challenges like the test runner and error model benefit from a settled spec foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap
&lt;/h2&gt;

&lt;p&gt;These updates are on &lt;code&gt;submain&lt;/code&gt;, which is now four commits ahead of &lt;code&gt;main&lt;/code&gt;. Other recent commits address arithmetic wrapping and while loop lowering initiated earlier. None of these have merged into the main branch yet. The roadmap has diverged (version 4.7 on main versus 4.6 on &lt;code&gt;submain&lt;/code&gt;), hinting at merge conflicts ahead in &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This marks the fourth day in a row where a predicted submain-to-main merge hasn't happened. While it's not blocking anything critical now, the unresolved state only risks complicating future merges.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;Clearly, the merge is the immediate priority. Beyond that, ongoing hard blockers like the test runner and &lt;code&gt;Result&lt;/code&gt; error model have lingered without progress, tailing a week of predicted advancement without payoff. On the backend, if/else lowering and struct layout present logical targets for upcoming work. We'll soon see whether the project remains in spec-tightening mode or shifts back into full implementation. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-30" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-30&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-26</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 30 Mar 2026 00:13:51 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-26-n8j</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-26-n8j</guid>
      <description>&lt;p&gt;Multi-file imports actually work now. Yesterday, the parser could read the &lt;code&gt;#![imports]&lt;/code&gt; syntax, but nothing happened at runtime. Today, 10 commits on &lt;code&gt;submain&lt;/code&gt; have built a complete pipeline: file resolution, dependency graphing, semantic merging across file boundaries, and runtime dispatch. The first multi-file Cx program runs end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The import pipeline
&lt;/h2&gt;

&lt;p&gt;Three critical commits form the core of this work. We have module alias resolution now wired into &lt;code&gt;analyze_method_call&lt;/code&gt; in &lt;code&gt;semantic.rs&lt;/code&gt;, making method calls on imported module aliases resolve correctly through the module's export table. A new function, &lt;code&gt;analyze_resolved_program&lt;/code&gt;, now exists in &lt;code&gt;semantic.rs&lt;/code&gt;. This function takes a &lt;code&gt;ResolvedProgram&lt;/code&gt; from the resolver and performs unified semantic analysis across all files in topological order. Importantly, &lt;code&gt;main.rs&lt;/code&gt; has been updated to use &lt;code&gt;analyze_resolved_program&lt;/code&gt;. The pipeline now looks like this: parse, resolve imports, topo-sort, semantic merge, runtime dispatch.&lt;/p&gt;

&lt;p&gt;In the resolver module (&lt;code&gt;src/frontend/resolver.rs&lt;/code&gt;, 301 lines), the graph infrastructure covers &lt;code&gt;ModuleId&lt;/code&gt;, &lt;code&gt;ResolvedFile&lt;/code&gt;, &lt;code&gt;ResolvedProgram&lt;/code&gt;, &lt;code&gt;ImportEdge&lt;/code&gt;, circular import detection, and topological sorting. Although this infrastructure came from earlier submain commits, it ties cohesively into today's semantic and runtime developments.&lt;/p&gt;

&lt;p&gt;Testing with &lt;code&gt;t74_import_basic.cx&lt;/code&gt; proves the concept by importing &lt;code&gt;t74_import_basic_lib.cx&lt;/code&gt; and successfully calling &lt;code&gt;math.add(10, 20)&lt;/code&gt; and &lt;code&gt;math.multiply(3, 4)&lt;/code&gt; across the file boundary. This is the first multi-file program compiling and running in Cx. We're also testing &lt;code&gt;pub&lt;/code&gt; enforcement. The test &lt;code&gt;t64_import_pub_only&lt;/code&gt; specifically checks that only &lt;code&gt;pub&lt;/code&gt;-marked functions have visibility across import boundaries — the resolver is enforcing visibility rules effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit pass and cleanup
&lt;/h2&gt;

&lt;p&gt;Post-pipeline deployment, an audit caught five semantic and runtime bugs in &lt;code&gt;parser.rs&lt;/code&gt;, &lt;code&gt;semantic.rs&lt;/code&gt;, and &lt;code&gt;runtime.rs&lt;/code&gt;. Corrections involved small fixes (+22/-11 lines) addressing correctness-related issues.&lt;/p&gt;

&lt;p&gt;We also removed dead code from the old interpreter path across 8 files. Functions like &lt;code&gt;Print&lt;/code&gt; and &lt;code&gt;PrintInline&lt;/code&gt;, along with a few others like &lt;code&gt;Range&lt;/code&gt;, &lt;code&gt;Placeholder&lt;/code&gt;, and &lt;code&gt;wait_for_step&lt;/code&gt;, were stripped from &lt;code&gt;ast.rs&lt;/code&gt;, &lt;code&gt;diagnostics.rs&lt;/code&gt;, &lt;code&gt;parser.rs&lt;/code&gt;, &lt;code&gt;semantic.rs&lt;/code&gt;, &lt;code&gt;semantic_types.rs&lt;/code&gt;, &lt;code&gt;lower.rs&lt;/code&gt;, &lt;code&gt;main.rs&lt;/code&gt;, and &lt;code&gt;runtime.rs&lt;/code&gt;. These were leftovers from an earlier phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test infrastructure improvements
&lt;/h2&gt;

&lt;p&gt;Improvements to our test infrastructure include enhancements to the matrix runner (&lt;code&gt;run_matrix.sh&lt;/code&gt;) for output verification. Now, tests with a &lt;code&gt;.expected_output&lt;/code&gt; sidecar file compare actual results with expected outputs, reporting &lt;code&gt;PASS (output verified)&lt;/code&gt; or &lt;code&gt;FAIL (output mismatch)&lt;/code&gt; instead of just exit codes. Two sidecar files shipped with this change (t75 and t76).&lt;/p&gt;

&lt;p&gt;Six new tests have been added to submain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;t64_import_pub_only&lt;/code&gt; — Testing pub visibility enforcement.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t74_import_basic&lt;/code&gt; — An end-to-end test for two-file imports.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t75_string_interpolation&lt;/code&gt; — validates &lt;code&gt;{varname}&lt;/code&gt; expansion in print statements.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t76_block_comments&lt;/code&gt; — testing block comment syntax.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, our submain matrix sees perfect results — 78/78 tests passing, compared to 72/72 on the main branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation sync
&lt;/h2&gt;

&lt;p&gt;Our documentation has caught up with the current state of the language, with six files updated: &lt;code&gt;ROADMAP_v3.1.md&lt;/code&gt;, &lt;code&gt;cx_backend_roadmap_v3_1.md&lt;/code&gt;, &lt;code&gt;backlog_notes.md&lt;/code&gt;, &lt;code&gt;cx_flags.md&lt;/code&gt;, &lt;code&gt;cx_syntax.md&lt;/code&gt;, and &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt;. The syntax reference saw the most changes (+158 lines) as it reflects everything we've built since its last update.&lt;/p&gt;

&lt;p&gt;The submain roadmap (v4.5) is now marking significant progress milestones like struct field type checking and method call return type resolution as complete. There's a version misalignment between main (v4.6) and submain (v4.5) that we'll address when reconciling these branches.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap
&lt;/h2&gt;

&lt;p&gt;While all of these changes are branch-contained, submain is currently 13 commits ahead of main. We haven't merged them in the past 24 hours. The multi-file import pipeline is blocking 0.1 right now, and it's ready on the branch. We've added 6 tests, fixed bugs, cut dead code, and synced docs, but all this waits in limbo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Merging to main is overdue. Holding 13 commits of working, tested code introduces greater risk with each passing day. Moving forward, we need to improve the test framework and assertions (&lt;code&gt;#[test]&lt;/code&gt;, &lt;code&gt;assert(cond)&lt;/code&gt;, &lt;code&gt;assert_eq(a, b)&lt;/code&gt;, &lt;code&gt;cx test&lt;/code&gt;). The error model (&lt;code&gt;Result&lt;/code&gt;) still blocks 0.1 and needs progress. Backend IR work, specifically loops and structures in the lowering pipeline, has been deferred multiple times for front-end fixes.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-26" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-26&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-27</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 29 Mar 2026 00:21:22 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-27-2kn3</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-27-2kn3</guid>
      <description>&lt;p&gt;Scalar layout definitions and ABI design—sounds routine, right? Except this time, our Cx language backend takes a significant leap forward. The Phase 8 Round 1 commit introduces the first formal ABI groundwork focusing on scalar layout and ABI documentation, assigning a solid design-first methodology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalar Layout and the ABI Document
&lt;/h2&gt;

&lt;p&gt;The latest commit lands on &lt;code&gt;submain&lt;/code&gt;, adding 134 lines across two files, most notably &lt;code&gt;docs/backend/cx_abi_v0.1.md&lt;/code&gt;. This document is where the scalar layout for Cx's integer types (t8, t16, t32, t64, t128), f64, and bool is locked. Details like size, alignment, representation, and how they map to Cranelift types are stipulated.&lt;/p&gt;

&lt;p&gt;The alignment model follows natural alignment principles, meaning each type aligns according to its size. For example, t8 aligns to 1, t16 to 2, and t32 to 4. This choice simplifies the design for x86-64 and mirrors what typical C compilers produce. Right now, there are no packed or special alignment modes.&lt;/p&gt;

&lt;p&gt;There's one crucial thing: i128 is emulated using two i64 values instead of having native support, as it would in LLVM. Not a hurdle for correctness but a known performance consideration.&lt;/p&gt;

&lt;p&gt;On the coding side, we see new &lt;code&gt;size_bytes()&lt;/code&gt; and &lt;code&gt;align_bytes()&lt;/code&gt; methods added to &lt;code&gt;IrType&lt;/code&gt; in &lt;code&gt;src/ir/types.rs&lt;/code&gt;. Seven unit tests, each focusing on different scalar types, now ensure that sizes and alignments are correctly handled. These are strictly Rust-level tests—not touching the main testing matrix, which sits impeccably at 72/72.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design-First Mentality
&lt;/h2&gt;

&lt;p&gt;This phase marks a shift to documenting before implementing—a design-first mantra. The ABI document locks some scalar layout decisions with accompanying tests, marking them as LOCKED, whereas OPEN marks those awaiting further exploration.&lt;/p&gt;

&lt;p&gt;Among the interesting OPEN topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TBool Representation&lt;/strong&gt; involves complexities with its three-state value (true/false/unknown) handling across function calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;String Layout in JIT Mode&lt;/strong&gt; and &lt;strong&gt;Struct Layout&lt;/strong&gt; require alignment and padding rules that need drafting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Array and Enum Layout&lt;/strong&gt; are potential upcoming challenges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy Parameter Convention&lt;/strong&gt; remains undecided for call handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach sets a clear path and helps prevent technical debt accruing from hasty, undocumented choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Submain Gap
&lt;/h2&gt;

&lt;p&gt;Despite putting substantial work into &lt;code&gt;submain&lt;/code&gt;, the main branch hasn't seen these fruits yet. Now stacking up to thirteen commits including the multi-file import pipeline—critical for the 0.1 release—plus bug fixes and additional tests, submain is becoming the storehouse of progress. The import pipeline is particularly vital and ready but sits awaiting integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;With the scalar layout solidified, the focus shifts toward more nuanced decisions like struct layout and TBool representation, mostly because these elements already have a presence in the frontend. However, the need to merge submain to main grows pressing, especially with pending tasks like the test runner and assert infrastructure still blocking essentials for the 0.1 release. Similarly, the error model (Result) is crucial yet stalled.&lt;/p&gt;

&lt;p&gt;Steps from here involve wrapping up the backend tasks and addressing these blockers, possibly setting the stage for the next major release.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-27" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-27&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-24</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 26 Mar 2026 00:12:06 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-24-1k25</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-24-1k25</guid>
      <description>&lt;p&gt;The macro system and &lt;code&gt;#![imports]&lt;/code&gt; syntax just landed, paving the way for more complex multi-file programs and new attribute-driven function features in Cx. The recent commit (&lt;code&gt;cda45f7&lt;/code&gt;) merged as PR #17, introduced these key changes, complete with nine new matrix tests (t65-t73) all passing. This marks a big step, as the total matrix tests jumped from 63 to 72.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;p&gt;Key changes affected 8 source files and brought in 9 additional test files. In total, 22 files changed, with +210 and -13 lines. Here's the breakdown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lexer changes.&lt;/strong&gt; Introduced two new tokens: &lt;code&gt;MacroInnerOpen&lt;/code&gt; (&lt;code&gt;#![&lt;/code&gt;) and &lt;code&gt;MacroOuterOpen&lt;/code&gt; (&lt;code&gt;#[&lt;/code&gt;). The existing &lt;code&gt;PunctBracketClose&lt;/code&gt; token now serves as the closing delimiter for both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import block parsing.&lt;/strong&gt; A new &lt;code&gt;ImportDecl&lt;/code&gt; AST node with alias, path, and position arrives alongside a &lt;code&gt;Stmt::ImportBlock&lt;/code&gt; variant. This allows the parser to handle the &lt;code&gt;#![imports]&lt;/code&gt; block properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#![imports]
math: use "std/math"
player: use "./player"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;import_decl&lt;/code&gt; and &lt;code&gt;import_block&lt;/code&gt; combinators now parse these alias-colon-use-path structures within the block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import semantic validation.&lt;/strong&gt; The system now catches duplicate aliases and enforces path restrictions, allowing only &lt;code&gt;./&lt;/code&gt; (relative) and &lt;code&gt;std/&lt;/code&gt; (stdlib) paths. This is strictly syntax validation for now; actual file loading and resolution aren't implemented yet. Syntax first, resolution next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outer macro parsing.&lt;/strong&gt; Added &lt;code&gt;CxMacro&lt;/code&gt; enum to the AST with six variants. Each outer macro, whether simple &lt;code&gt;#[name]&lt;/code&gt; or &lt;code&gt;#[name(args)]&lt;/code&gt;, is parsed by the &lt;code&gt;single_outer_macro&lt;/code&gt; combinator. A new &lt;code&gt;macros: Vec&lt;/code&gt; field now sits under &lt;code&gt;Stmt::FuncDef&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outer macro semantic validation.&lt;/strong&gt; Enforcement rules in place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No return types for &lt;code&gt;#[test]&lt;/code&gt; functions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[reactive]&lt;/code&gt; and &lt;code&gt;#[cfg]&lt;/code&gt; produce locked "reserved, post-v0.1" errors.&lt;/li&gt;
&lt;li&gt;Unknown macro names are immediately rejected.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[test]&lt;/code&gt;, &lt;code&gt;#[inline]&lt;/code&gt;, and &lt;code&gt;#[deprecated]&lt;/code&gt; tags are allowed on functions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Matrix tests.&lt;/strong&gt; Comprehensive testing covers all macro and import behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;t65: Basic imports parsing in block&lt;/li&gt;
&lt;li&gt;t66: Standard library paths imported with &lt;code&gt;std/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;t67: &lt;code&gt;#[test]&lt;/code&gt; attribute in functional context&lt;/li&gt;
&lt;li&gt;t68: Using &lt;code&gt;#[deprecated]&lt;/code&gt; attribute&lt;/li&gt;
&lt;li&gt;t69-t73: Various rejection and validation scenarios (expected fail tests)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Design decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Import syntax, not resolution.&lt;/strong&gt; &lt;code&gt;#![imports]&lt;/code&gt; parsing and validation exist, catching any mishaps, like duplicate aliases or invalid paths. But without file loading, multi-file programs can't yet run. Validation leads, resolution follows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured outer macros.&lt;/strong&gt; Only six outer macro types exist. No extension yet in Cx 0.1, with &lt;code&gt;#[reactive]&lt;/code&gt; and &lt;code&gt;#[cfg]&lt;/code&gt; specifically reserved for later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test capabilities are building up.&lt;/strong&gt; Parsing and validation happen for &lt;code&gt;#[test]&lt;/code&gt;, but no runner operates yet. Likewise, &lt;code&gt;std/&lt;/code&gt; paths parse, but resolution lags. These elements are inching toward a full Cx test system, piece by piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap movement
&lt;/h2&gt;

&lt;p&gt;Must Ship tasks now check off &lt;code&gt;#![import]&lt;/code&gt; block parsing. Macro and Import syntax's sprint status recently turned Done. Syntax implementation is complete, pushing module resolution into Active, though heavier work on file operations and detection remains.&lt;/p&gt;

&lt;p&gt;We face two tough blockers: effective multi-file import functionality and fully functioning test runner development. The syntax aspect is rolling, but multi-file execution isn't yet seamless.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Tackling module resolution tops the list. Ensuring &lt;code&gt;use "./player"&lt;/code&gt; brings actual player.cx file content to the importer is essential, involving public symbol resolution and accessibility. &lt;/p&gt;

&lt;p&gt;The processes around the test runner and &lt;code&gt;assert&lt;/code&gt; support are very close on the heels. Parsing of &lt;code&gt;#[test]&lt;/code&gt; is there, and implementing &lt;code&gt;assert(cond)&lt;/code&gt; and &lt;code&gt;assert_eq(a, b)&lt;/code&gt; next, alongside &lt;code&gt;cx test&lt;/code&gt;, would clear this blocker.&lt;/p&gt;

&lt;p&gt;Generic structs Phase 3 and backend IR Phase 6 remain queued behind macros and imports work, ready to move once the immediate priorities settle.&lt;/p&gt;

&lt;p&gt;Nine new tests now mean 72/72 pass, from a previous 63/63. Zero backward steps.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-24" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-24&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-23</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 25 Mar 2026 00:10:23 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-23-584e</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-23-584e</guid>
      <description>&lt;p&gt;The big story today is that Cx has revamped its entire IO structure. Gone are the days of &lt;code&gt;print&lt;/code&gt;, &lt;code&gt;printn&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, and &lt;code&gt;input&lt;/code&gt; being treated as special cases in the lexer and parser. Now, these are unified under function syntax, marking a significant shift along with the completion of Phase 1 and 2 of generic structs, introduction of string interpolation, and stdin built-ins. This update, encapsulated in PR #15, closed four critical blockers for the 0.1 release, pushing forward with a test matrix now showing 63 green tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Print Promoted to Function
&lt;/h2&gt;

&lt;p&gt;This was the major structural change everyone is talking about. &lt;code&gt;KeywordPrint&lt;/code&gt; and &lt;code&gt;KeywordPrintInline&lt;/code&gt; have been removed from the lexer's vocabulary. We’ve deleted 47 lines of combinator spaghetti from the parser that were handling print statements. Now, &lt;code&gt;print&lt;/code&gt; and &lt;code&gt;printn&lt;/code&gt; are parsed as &lt;code&gt;Expr::Call&lt;/code&gt;, making them akin to any other function call. &lt;code&gt;printn&lt;/code&gt; has been duly registered as a built-in within &lt;code&gt;call_semantic_func&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;While the transition was largely smooth, we had to tweak the &lt;code&gt;call_arg&lt;/code&gt; parser to better handle nested calls and method calls when they appeared as arguments. So, 47 parser lines out, 11 runtime lines in. This transformation unexpectedly resolved a longstanding issue with the t42 TypeParam-vs-Struct ambiguity, a clash existing since generics v2. It turned out that &lt;code&gt;print&lt;/code&gt; as a keyword was creating parsing conflicts that no longer exist with it being a standard function call. As a result, we removed the &lt;code&gt;expected_fail&lt;/code&gt; marker on t42.&lt;/p&gt;

&lt;h2&gt;
  
  
  String Interpolation and Stdin Built-ins
&lt;/h2&gt;

&lt;p&gt;String interpolation is finally here. By utilizing the &lt;code&gt;expand_interpolation&lt;/code&gt; method in the runtime, placeholders like &lt;code&gt;{varname}&lt;/code&gt; within string literals are expanded when printing. Importantly, variables not recognized within these placeholders simply pass through unchanged, providing a predictable output especially during the initial development phases.&lt;/p&gt;

&lt;p&gt;We’ve also introduced built-in functions for standard input operations. &lt;code&gt;read(var)&lt;/code&gt; reads a line from stdin directly into a variable, and &lt;code&gt;input("prompt", var)&lt;/code&gt; first prints a prompt before reading. This keeps the consistency with our redesigned IO surface, confirmed by test t60 covering basic read operations using this interpolation syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generic Structs Phase 1 and 2
&lt;/h2&gt;

&lt;p&gt;Phase 1 ushered in &lt;code&gt;type_params&lt;/code&gt; for &lt;code&gt;Stmt::StructDef&lt;/code&gt; and &lt;code&gt;SemanticStmt::StructDef&lt;/code&gt;. Our parser can now handle syntax like &lt;code&gt;struct Foo { field: T }&lt;/code&gt;, allowing the analyzer to correctly resolve type parameters. During field analysis, &lt;code&gt;current_type_params&lt;/code&gt; are set, while a &lt;code&gt;struct_type_params&lt;/code&gt; registry tracks them methodically. Tests t61 and t62 validated basic generic struct definitions and instantiation using &lt;code&gt;f64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With Phase 2, &lt;code&gt;AstValue::StructInstance&lt;/code&gt; now supports &lt;code&gt;Vec&lt;/code&gt; type arguments. Consequently, the parser now understands &lt;code&gt;Pair&amp;lt;t32&amp;gt; { ... }&lt;/code&gt; instantiations, and we updated all &lt;code&gt;StructInstance&lt;/code&gt; match sites to accommodate this expanded form with three fields. Test t63 thoroughly tested explicit type argument instantiation.&lt;/p&gt;

&lt;p&gt;However, some gaps remain, specifically type arguments in variable type annotations (&lt;code&gt;p: Pair&amp;lt;t32&amp;gt;&lt;/code&gt;) and enforcement of generic field type checking, both marked for follow-up despite their current lack of implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dead Code Cleanup
&lt;/h2&gt;

&lt;p&gt;Goodbye to unnecessary code. We’ve stripped out the enum group runtime infrastructure, including &lt;code&gt;EnumRuntimeInfo&lt;/code&gt;, the &lt;code&gt;enums&lt;/code&gt; field on &lt;code&gt;RunTime&lt;/code&gt;, and &lt;code&gt;super_group_handler_index&lt;/code&gt;. These components were purely write-only and no longer had a purpose as &lt;code&gt;SemanticWhenPattern&lt;/code&gt; now supports all when-group matching needs. This cleanup freed 37 lines from runtime.rs and 8 from main.rs. It follows closely on the heels of our recent 790-line AST interpreter removal, further reducing the codebase and emphasizing the newfound dominance of the semantic path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Up next, we're eyeing Phase 3 of generic structs: tackling type arguments in variable declarations and enforcing checks on generic fields. Multi-file imports remain a tough nut to crack for 0.1, with syntax locked in but functionality yet to be implemented. Although backend IR tasks like loop and struct lowering were scheduled, they did not land; however, the IO unification has cleared a prerequisite hurdle for backend work involving calling conventions.&lt;/p&gt;

&lt;p&gt;Our test runner and assertions (&lt;code&gt;assert(cond)&lt;/code&gt;, &lt;code&gt;assert_eq(a, b)&lt;/code&gt;, test blocks) are open blockers that demand attention, although no progress has been made there yet.&lt;/p&gt;

&lt;p&gt;As it stands, the test matrix is solid at 63/63 with no regressions. We'll keep pushing forward.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-23" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-23&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-22</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 23 Mar 2026 02:42:22 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-22-neb</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-22-neb</guid>
      <description>&lt;p&gt;The Cx project just had its most significant update yet, pushing over 25 non-merge commits onto submain. Let's break down what's been accomplished: the closing of four major blockers, the removal of the old AST interpreter, substantial backend IR progress reaching Stage 3, and the expansion of our test suite to ensure stability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four hard blockers knocked out
&lt;/h2&gt;

&lt;p&gt;Getting these blockers cleared has been pivotal. First up, the &lt;strong&gt;f64 type keyword&lt;/strong&gt; (commit 7c1768d) has traversed the entire pipeline, from lexer to runtime, confirmed by test t55. This paves the way for the numeric functionalities in our 0.1 release. &lt;/p&gt;

&lt;p&gt;Next, &lt;strong&gt;const declarations&lt;/strong&gt; (a7ece34) arrived with literal-only initializers. We've also imposed a restriction against reassignment, covered by tests t56 and t57. Along for the ride is the &lt;code&gt;pub&lt;/code&gt; keyword, marking a step forward for export visibility.&lt;/p&gt;

&lt;p&gt;The new &lt;strong&gt;value-producing when&lt;/strong&gt; (d24b462) means &lt;code&gt;when&lt;/code&gt; blocks are now usable as expressions—a major flexibility gain shown effective in test t59.&lt;/p&gt;

&lt;p&gt;Lastly, &lt;strong&gt;when block-body arms&lt;/strong&gt; (e0f989e) have moved from a gap to a verified feature (test t58 backs this up). Each feature is live and tested with no regressions in sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saying goodbye to the old AST interpreter
&lt;/h2&gt;

&lt;p&gt;The burden of maintaining a synced parallel execution path via the old AST interpreter is now lifted. The execution path (&lt;code&gt;eval_expr&lt;/code&gt; ~314 lines, &lt;code&gt;run_stmt&lt;/code&gt; ~462 lines) was axed in commit cdffec7. This means about 790 lines of dead code were removed from runtime.rs. Additional cleanups followed, with dead code like &lt;code&gt;FuncDef&lt;/code&gt; and friends getting the boot, making the codebase leaner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full-speed-ahead code quality
&lt;/h2&gt;

&lt;p&gt;This sprint was more than a cleanup; it was refinement. Function bodies shifted to &lt;code&gt;Arc&lt;/code&gt; storage (0c0cb8a) to eliminate unnecessary clone overhead. Reducing redundancy, &lt;code&gt;semantic_type_to_ast&lt;/code&gt; was streamlined with a proper &lt;code&gt;From for Type&lt;/code&gt; implementation. &lt;/p&gt;

&lt;p&gt;We merged &lt;code&gt;print_value&lt;/code&gt; and &lt;code&gt;print_value_inline&lt;/code&gt; into one &lt;code&gt;value_to_string&lt;/code&gt; function (878029a).&lt;/p&gt;

&lt;p&gt;Two macros, &lt;code&gt;unsupported!&lt;/code&gt; and &lt;code&gt;unsupported_type!&lt;/code&gt; (5819185, 14c63e5), optimized 35 match arms. Similarly, &lt;code&gt;sem_err!&lt;/code&gt; (f8e021d) decreased 51 &lt;code&gt;SemanticError&lt;/code&gt; constructions to concise one-liners.&lt;/p&gt;

&lt;p&gt;Another noteworthy addition is &lt;code&gt;SemanticType::Void&lt;/code&gt; (642a327), enabling void function calls to type-check correctly through semantics and IR.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend IR: Elevating function call logic
&lt;/h2&gt;

&lt;p&gt;Backend advancements are noteworthy. &lt;strong&gt;Phase 6 Stage 2b&lt;/strong&gt; (a6d7701) introduced direct function call lowering, complete with validation mechanisms in ir/lower.rs. Moving swiftly to &lt;strong&gt;Phase 6 Stage 3&lt;/strong&gt; (ee2c357), cross-function call validation is now solid, resolving callees and verifying function signatures comprehensively.&lt;/p&gt;

&lt;p&gt;An IR pretty printer is queued up in &lt;code&gt;src/ir/printer.rs&lt;/code&gt;, offering a textual representation for debugging—a critical tool for developers that's already in development and under testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating the progress
&lt;/h2&gt;

&lt;p&gt;PRs #9 through #14 have aligned main with submain as of 642a327, setting the stage for the next pushes. Yet, there are three commits still residing locally: two related to Phase 6's different stages and one involving documentation cleanup.&lt;/p&gt;

&lt;p&gt;The test matrix renumbering (d8cf3ef) closed duplicate issues and filled gaps. We also tidied up with ample housekeeping: stale files, leftover branches, gitignore contradictions, and unused worktrees were removed, tuning the project for more efficient progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's on the horizon
&lt;/h2&gt;

&lt;p&gt;Top priority remains the IR printer—it's the key piece yet to be committed, essential for stable backend debugging. As the phase nears an end, the on-deck IR lowering objectives include loops, when blocks, and structs. Beyond these, the roadmap targets multi-file imports, the fleshed-out error model, transitioning print to a function, and solidifying UTF-8. Of those, multi-file imports loom largest for completion before the 0.1 release.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-22" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-22&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-19</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Fri, 20 Mar 2026 02:42:52 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-19-49pp</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-19-49pp</guid>
      <description>&lt;p&gt;Semantic Interference Complete: Cx Runtime Hits Major Milestone&lt;/p&gt;

&lt;p&gt;The verification matrix now shows a perfect 47/47, indicating that every test passes with the runtime executing fully through &lt;code&gt;SemanticProgram&lt;/code&gt;. This marks the end of raw AST interpretation for all supported constructs. Semantic interpreter Phase 2 just landed with two significant commits on &lt;code&gt;submain&lt;/code&gt;, marking a major milestone on the path to version 0.1. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Landed
&lt;/h2&gt;

&lt;p&gt;Two pivotal commits took the verification matrix from incomplete to flawless. &lt;/p&gt;

&lt;p&gt;The first major commit (369a2e9) involved 693 net insertions across 9 files, fundamentally altering the runtime. The execution now primarily uses &lt;code&gt;run_semantic_stmt&lt;/code&gt; and &lt;code&gt;eval_semantic_expr&lt;/code&gt; in &lt;code&gt;runtime.rs&lt;/code&gt;, which process &lt;code&gt;SemanticStmt&lt;/code&gt; and &lt;code&gt;SemanticExpr&lt;/code&gt; instead of raw AST nodes. We've introduced a &lt;code&gt;semantic_funcs&lt;/code&gt; registry that holds &lt;code&gt;SemanticFunction&lt;/code&gt; objects for correct dispatch. Handle operations like &lt;code&gt;HandleNew&lt;/code&gt;, &lt;code&gt;HandleVal&lt;/code&gt;, and &lt;code&gt;HandleDrop&lt;/code&gt; have realized true arena semantics. Method calls, struct instantiation, enum matching, and all forms of control flow are now processed through the semantic pathway. &lt;/p&gt;

&lt;p&gt;On the analyzer side, &lt;code&gt;semantic.rs&lt;/code&gt; gained awareness of generic parameters and solved the age-old ambiguity between &lt;code&gt;TypeParam&lt;/code&gt; and &lt;code&gt;Struct&lt;/code&gt; for bare identifiers—always parsing them as &lt;code&gt;Type::Struct&lt;/code&gt; and resolving to &lt;code&gt;TypeParam&lt;/code&gt; in generic contexts. The jumble around duplicate &lt;code&gt;StructDef&lt;/code&gt; handling was sorted this time, and new IR nodes (&lt;code&gt;IfElse&lt;/code&gt;, &lt;code&gt;WhileIn&lt;/code&gt;, &lt;code&gt;SemanticWhileInChain&lt;/code&gt;) were established as essential semantic types. &lt;/p&gt;

&lt;p&gt;Additionally, &lt;code&gt;main.rs&lt;/code&gt; was revamped so &lt;code&gt;run_with_interpreter&lt;/code&gt; could take &lt;code&gt;SemanticProgram&lt;/code&gt; directly. There’s a new pre-pass that registers structs, functions, and impl blocks from semantic IR, bridging function registration between semantic and legacy registries amid ongoing migration.&lt;/p&gt;

&lt;p&gt;That commit shot the matrix up to 44/47. Three complex failures lingered in deeper stubs. &lt;/p&gt;

&lt;p&gt;The second commit (c730bd7) was smaller but packed a punch with 69 net insertions over 4 files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduced recursive array element coercion in &lt;code&gt;types_compatible&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TypedAssign&lt;/code&gt; finally uses &lt;code&gt;current_type_params&lt;/code&gt;, ensuring generic variable declarations resolve correctly.&lt;/li&gt;
&lt;li&gt;A new function, &lt;code&gt;substitute_type_params&lt;/code&gt;, resolves generic return types at the call site—making sure &lt;code&gt;fnc identity(x: T): T&lt;/code&gt; called with an &lt;code&gt;i64&lt;/code&gt; returns &lt;code&gt;SemanticType::I64&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SemanticType::Array(usize, Box)&lt;/code&gt; now exists, giving array types a complete path—declaration, assignment, function return, and type compatibility.&lt;/li&gt;
&lt;li&gt;Handle operations in the runtime were upgraded from stubs to live implementations with stale detection through &lt;code&gt;RuntimeError::StaleHandle&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A parsing order fix positioned &lt;code&gt;handle_drop&lt;/code&gt; and &lt;code&gt;handle_val&lt;/code&gt; before &lt;code&gt;method_call&lt;/code&gt;, addressing a precedence issue where handle syntax was mistakenly consumed as method calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Arrays as First-Class Citizens.&lt;/strong&gt; Previously, arrays were basically a wild card with &lt;code&gt;SemanticType::Unknown&lt;/code&gt;, raising havoc with type checking. With the new &lt;code&gt;Array&lt;/code&gt; type, they flow through the semantic process transparently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generic Return Type Substitution.&lt;/strong&gt; This happens at call sites, not definitions, preventing broken downstream type checks when dealing with generic function results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Handle Operations.&lt;/strong&gt; The runtime now effectively manages handles with actual arena operations, closing the gap between IR and runtime behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parser Ordering and Handle Syntax.&lt;/strong&gt; Initially, the parser was greedily munching handle syntax as method calls. The fix addressed the priority to handle this correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current State
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;submain&lt;/code&gt; branch remains unmerged with &lt;code&gt;main&lt;/code&gt;. It's two commits ahead, along with previous work from structure sprints, operators, generics v1, and semantic parity Phase 1. The merge looms larger and more hazardous the longer it's delayed, with 1578 insertions and 1959 deletions across 35 files to consider.&lt;/p&gt;

&lt;p&gt;While the old AST interpretation code persists, it's no longer in use and its removal is the final check under the Semantic/Interpreter Parity on the frontend roadmap. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Immediate tasks are clear-cut. Merging &lt;code&gt;submain&lt;/code&gt; into &lt;code&gt;main&lt;/code&gt; will enable CI to run against our true language state. Once the dormant AST interpreter path is axed, semantic parity will be officially closed. Following this, the path to 0.1 is wide open: multi-file imports, generics v2 finalization, and backend Phase 6 (focusing on function call lowering) can advance on a stable semantic ground. The backend work, in particular, stands to gain tremendously from a firm semantic layer, allowing confident consumption of the semantic IR.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-19" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-19&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-18</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 19 Mar 2026 02:42:49 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-18-3hbg</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-18-3hbg</guid>
      <description>&lt;p&gt;The biggest piece of work happening right now in Cx is Semantic Parity Phase 2: migrating the interpreter from raw AST execution to running off &lt;code&gt;SemanticProgram&lt;/code&gt;. No commits landed today, but there are 782 lines of uncommitted changes across 9 files in the wonderful-saha worktree. The interpreter migration is being written. Here is where things stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The semantic interpreter exists
&lt;/h2&gt;

&lt;p&gt;The core of the work is in &lt;code&gt;src/runtime/runtime.rs&lt;/code&gt;, where a full semantic IR interpreter has been written. New methods -- &lt;code&gt;eval_semantic_expr&lt;/code&gt;, &lt;code&gt;run_semantic_stmt&lt;/code&gt;, and &lt;code&gt;call_semantic_func&lt;/code&gt; -- implement expression evaluation and statement execution against &lt;code&gt;SemanticExpr&lt;/code&gt; and &lt;code&gt;SemanticStmt&lt;/code&gt; types instead of raw AST nodes.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;RunTime&lt;/code&gt; struct now has a &lt;code&gt;semantic_funcs&lt;/code&gt; registry (&lt;code&gt;HashMap&lt;/code&gt;) alongside the existing function registry. This is a dual-registry setup, and that is deliberate.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;src/main.rs&lt;/code&gt;, &lt;code&gt;run_with_interpreter&lt;/code&gt; now accepts &lt;code&gt;SemanticProgram&lt;/code&gt; instead of &lt;code&gt;Program&lt;/code&gt;. The pre-pass that registers structs, functions, and impl blocks has been rewritten to work with &lt;code&gt;SemanticStmt&lt;/code&gt; variants. Function registration bridges both the semantic and legacy registries so the old copy/bleedback fallback behavior still works during the transition.&lt;/p&gt;

&lt;p&gt;This is not a clean swap. It is a staged migration. Both the old AST function registry and the new semantic function registry run at the same time. The old paths remain as fallback, which means the 45-test matrix does not have to pass through the new interpreter all at once. Work can land incrementally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Control flow gets first-class IR nodes
&lt;/h2&gt;

&lt;p&gt;As part of this migration, &lt;code&gt;IfElse&lt;/code&gt; and &lt;code&gt;WhileIn&lt;/code&gt; have been promoted to first-class nodes in both the AST and the semantic IR.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;src/frontend/ast.rs&lt;/code&gt;, new statement variants for &lt;code&gt;IfElse&lt;/code&gt; and &lt;code&gt;WhileIn&lt;/code&gt; were added along with a &lt;code&gt;WhileInChain&lt;/code&gt; struct for cursor iteration chains. The corresponding &lt;code&gt;SemanticStmt::IfElse&lt;/code&gt;, &lt;code&gt;SemanticStmt::WhileIn&lt;/code&gt;, and &lt;code&gt;SemanticWhileInChain&lt;/code&gt; variants were added in &lt;code&gt;src/frontend/semantic_types.rs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Previously these control flow constructs were handled through more general paths. Giving them dedicated variants in both layers makes the semantic IR complete for control flow. That is a prerequisite for the interpreter to run entirely off the semantic IR without falling back to AST interpretation for certain constructs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Groundwork for generics in the semantic layer
&lt;/h2&gt;

&lt;p&gt;A smaller but notable change: the analyzer's &lt;code&gt;semantic_type_from_decl&lt;/code&gt; now takes a generic params slice, and &lt;code&gt;analyze_function&lt;/code&gt; gains a type parameters argument. Duplicate &lt;code&gt;StructDef&lt;/code&gt; handling was removed. This is not the generics work itself, but it prepares the analyzer for generics-aware semantic analysis. It came along naturally while reworking the semantic layer for the interpreter migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branch state
&lt;/h2&gt;

&lt;p&gt;Submain still has not been merged into main. This was flagged yesterday and remains the case. Main is still missing structs, operators, and Semantic Parity Phase 1 from the March 17 work. The wonderful-saha worktree branches from submain, so until submain merges, none of this Phase 2 work can reach main either.&lt;/p&gt;

&lt;p&gt;The branch situation is straightforward but it needs to be resolved. Two feature branches are stacked (submain, then wonderful-saha on top of it) and main is behind both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;The immediate path forward has two threads:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Finish the semantic interpreter migration in wonderful-saha. The interpreter is largely written, but the bridge between old and new runtime paths still needs work. Once the full test matrix passes through &lt;code&gt;SemanticProgram&lt;/code&gt;, the raw AST interpretation path can be removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge submain into main. This unblocks everything downstream. Until it happens, the real development state of the language lives on feature branches rather than main.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the backend side, Phase 6 (function call lowering) is next on the roadmap. No work started on it today, but it can proceed in parallel once the branch state is cleaned up.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-18" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-18&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log - 2026-03-17</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 18 Mar 2026 02:43:23 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-17-2ajl</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-17-2ajl</guid>
      <description>&lt;p&gt;Bringing control flow to a compiler and shipping a more feature-complete frontend branch in one day changes the landscape for the Cx language project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend Phase 5: Control Flow Takes Shape
&lt;/h2&gt;

&lt;p&gt;We nailed the largest lump commit in backend history on &lt;code&gt;codex/backend-ir-from-main&lt;/code&gt;. If you looked under the hood, you'd see 2,559 insertions across three files. Most notable are the 1,656 new lines within &lt;code&gt;lower.rs&lt;/code&gt; and the creation of &lt;code&gt;validate.rs&lt;/code&gt; with 1,052 lines.&lt;/p&gt;

&lt;p&gt;Prior to this, IR was pretty much linear—a straight shot from start to finish. Now we’ve integrated true control flow graphs. This means we've got conditional branches, explicit blocks for then/else/merge, and chaining for else-if clauses. Critical here is how SSA (Static Single Assignment) environments are split and merged, ditching phi nodes in favor of block parameters especially for merge points. This shift wasn't new—it harks back to decisions made in Phase 1, but today marked its real-world test and validation. It's cleaner, lighter on bookkeeping, and passed through branching logic without a hitch.&lt;/p&gt;

&lt;p&gt;We’ve also dealt with dead branches elegantly, ensured branch-specific temporaries work seamlessly, and the validator is up to scratch for multi-block functions and a synthetic main routine.&lt;/p&gt;

&lt;p&gt;Let's not overlook the validator overhaul itself. This beast of a file includes over a thousand lines of checks, making sure nothing slips through unnoticed. Mismatching IR or malformed structures are caught immediately—a necessity as we expand capabilities without trialing features in the wild before they're tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submain: A Frontend on the Brink of Change
&lt;/h2&gt;

&lt;p&gt;Over in the &lt;code&gt;submain&lt;/code&gt; branch, three distinct commits moved the needle further than ever, elevating &lt;code&gt;submain&lt;/code&gt; above the main for now.&lt;/p&gt;

&lt;p&gt;Starting with structs, the first two development phases landed in one go, stepping through 19 files across the pipeline. Struct definitions, instancing, reading/writing fields—it's all there. Add in method dispatch via impl blocks, including mutations propagated back to callers, and you're looking at robust support for compound assignments like &lt;code&gt;p.health -= amount&lt;/code&gt;, facilitated by a new &lt;code&gt;AssignTarget&lt;/code&gt; enum helping differentiate variable versus field targets. Three verification matrix tests ensure these changes don't break anything: &lt;code&gt;impl_basic&lt;/code&gt;, &lt;code&gt;impl_return&lt;/code&gt;, and &lt;code&gt;compound_assign_dot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A smaller change, but significant, added &lt;code&gt;!=&lt;/code&gt; and unary &lt;code&gt;!&lt;/code&gt; operators while also tidying up process exit codes to properly signal errors. Negative testing got a boost with &lt;code&gt;.expected_fail&lt;/code&gt; markers, and &lt;code&gt;run_matrix.sh&lt;/code&gt; entered as the definitive test runner.&lt;/p&gt;

&lt;p&gt;Last up, we tackled Semantic Parity Phase 1. This translates frontend structures into the semantic layers fully, covering constructs from &lt;code&gt;StructDef&lt;/code&gt; to &lt;code&gt;MethodCall&lt;/code&gt;. Important note—while some paths still rely on the raw AST, this phase preps everything for the full semantic shift later.&lt;/p&gt;

&lt;p&gt;Every change passed the verification matrix with greens across all tests—nothing broke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Submain&lt;/code&gt; is standing as the proving ground for frontend consolidation. It’s about gestating feature changes together and deploying them as coherent units. Today’s push exemplified this as structs, semantic improvements, and operator handling merged into &lt;code&gt;submain&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Incremental semantic parity is the name of the game. We pinpoint types and analysis, leaving the interpreter with the raw AST for now, but eventually, that dependency will dissolve post-parity verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;The endgame is merging these branches, both carrying critical updates. &lt;code&gt;Submain&lt;/code&gt;’s structural and semantic parity features need to meet &lt;code&gt;main&lt;/code&gt;, clearing the way for further semantic work. But there’s backend momentum too, heading into Phase 6 which involves function call lowering, allowing these lowered functions to communicate fully—arguments, validations, the works. Keep an eye on Semantic Parity Phase 2, as it transitions from the raw AST to a &lt;code&gt;SemanticProgram&lt;/code&gt; for interpretation. These advancements will run parallel until convergence in &lt;code&gt;main&lt;/code&gt;, pushing Cx to new heights.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-17" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-17&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-16</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 17 Mar 2026 02:43:37 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-16-3kc9</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-16-3kc9</guid>
      <description>&lt;p&gt;Generics v1 has officially shipped. This isn't a halfway parser prototype; it's full-stack coverage straight from parsing, through semantic analysis, to runtime, with three verification tests. Plus, GitHub Actions CI went live—built and debugged in just four commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generics v1
&lt;/h2&gt;

&lt;p&gt;Our implementation tangled with six files: &lt;code&gt;ast.rs&lt;/code&gt;, &lt;code&gt;parser.rs&lt;/code&gt;, &lt;code&gt;semantic.rs&lt;/code&gt;, &lt;code&gt;semantic_types.rs&lt;/code&gt;, &lt;code&gt;lower.rs&lt;/code&gt;, and &lt;code&gt;runtime.rs&lt;/code&gt;. We introduced &lt;code&gt;Type::TypeParam&lt;/code&gt; at the AST level and &lt;code&gt;SemanticType::TypeParam&lt;/code&gt; in the semantic layer, integrated &lt;code&gt;type_params&lt;/code&gt; in &lt;code&gt;FuncDef&lt;/code&gt;, &lt;code&gt;SemanticFunction&lt;/code&gt;, &lt;code&gt;FunctionInfo&lt;/code&gt;, handled `&lt;code&gt;parsing, and ensured type consistency at call sites. The&lt;/code&gt;types_compatible&lt;code&gt;function now transparently handles&lt;/code&gt;TypeParam`.&lt;/p&gt;

&lt;p&gt;Testing isn't a hand-wavy success story. We ran three specific tests: t37 for basic generic function calls, t38 for generic array returns using &lt;code&gt;[N]T&lt;/code&gt;, and t39 for scenarios with multiple arguments sharing a type parameter. This was all achieved with just 88 insertions—mindfully compact, while ensuring full compiler layer interaction. We intentionally scoped to single type parameters: no struct dependencies or bounds. This keeps v1 lean, laying the groundwork for v2 (multi-parameter support) and v3 (bounds) without refactoring core principles.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI from zero to green
&lt;/h2&gt;

&lt;p&gt;Our GitHub Actions CI came online with commit 1514c16, designed to run a 113-line workflow managing frontend and backend verification, including a stale-base gate. The &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; rolled out alongside, laying out four branch rules for collaborators, whether human or automated.&lt;/p&gt;

&lt;p&gt;We hit two bugs right off. First, an unintentional Windows &lt;code&gt;target-dir&lt;/code&gt; in &lt;code&gt;.cargo/config.toml&lt;/code&gt; inserted a &lt;code&gt;C:\Users\Gabri\cx-build&lt;/code&gt; path separator error on Ubuntu runners. That was cleaned up quickly. Secondly, merge commits to main tripped the branch protection guard, failing CI until we exempted these from the branch name check.&lt;/p&gt;

&lt;p&gt;These hiccups revealed a key point: development primarily happens on Windows, but CI runs on Ubuntu. Platform-specific path issues like our &lt;code&gt;target-dir&lt;/code&gt; snafu are precisely why cross-platform CI exists. Detecting these on day one is a win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation and infrastructure
&lt;/h2&gt;

&lt;p&gt;A busted &lt;code&gt;memory_safety.md&lt;/code&gt; link was culled from the README. The roadmap pushed to v3.1, mapping out the arrival of generics v1, CI status, next steps for structs, and generics v2's graduation to active development.&lt;/p&gt;

&lt;p&gt;Meanwhile, on the site branch, we started testing an automated blog post notification setup via Telegram. Though not quite production-ready, the foundational work is underway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend IR: stashed, not abandoned
&lt;/h2&gt;

&lt;p&gt;Right before generics and CI merged into main, we stashed backend IR development. An &lt;code&gt;ir/validate.rs&lt;/code&gt; module and associated imports were part of this pause, intended to streamline merging stable features. Function lowering is progressing; next in line is working if/else constructs into the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Naturally, generics v2 takes precedence. Multi-type-parameter support (&lt;code&gt;fnc swap(a: A, b: B)&lt;/code&gt;) is already noted as active. Thanks to the v1 groundwork, the parser extension needed here is minimal.&lt;/p&gt;

&lt;p&gt;Another live effort is in our backend IR stream. We'll pick back up on the validation module where progress left off. These projects work on distinct compiler layers, so they can operate simultaneously.&lt;/p&gt;

&lt;p&gt;Now with CI, regression is not an optional diagnosis—it's actively policed. This adjustment in our workflow marks a genuine shift to proactive error detection before main integration.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-03-16" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-16&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
