<?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.us-east-2.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-07-24</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sat, 25 Jul 2026 00:13:28 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-24-3j42</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-24-3j42</guid>
      <description>&lt;p&gt;v0.3.2 is out. The gene/phen sprint that started six slices ago is done, merged to main via PR #352, and tagged. Submain and main sit at the same commit for the first time since this work began. The verification matrix went from 321 to 380 fixtures, all passing.&lt;/p&gt;

&lt;p&gt;The headline feature is operator overloading through an embedded prelude, which is the final architectural piece of the trait system. But the release is really the sum of all six slices: gene declarations, phen implementations, generic bounds, method dispatch, struct-return ABI fixes, and now operator contracts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The embedded prelude
&lt;/h2&gt;

&lt;p&gt;The capstone commit (&lt;code&gt;e38024e&lt;/code&gt;, 526 insertions across 24 files) introduced &lt;code&gt;src/prelude.cx&lt;/code&gt;, a 52-line Cx source file that defines eight operator gene contracts: &lt;code&gt;Add&lt;/code&gt;, &lt;code&gt;Sub&lt;/code&gt;, &lt;code&gt;Mul&lt;/code&gt;, &lt;code&gt;Div&lt;/code&gt;, &lt;code&gt;Mod&lt;/code&gt;, &lt;code&gt;Neg&lt;/code&gt;, &lt;code&gt;Eq&lt;/code&gt;, and &lt;code&gt;Ord&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This file is compiled into &lt;code&gt;cx.exe&lt;/code&gt; via &lt;code&gt;include_str!&lt;/code&gt; and injected as the first source unit of every program, before the root file and all imports. It goes through the ordinary lexer-parser-semantic pipeline. There is no filesystem probing, no fallback path, no special syntax. The embedded text is the only runtime path.&lt;/p&gt;

&lt;p&gt;This was a deliberate architectural decision (decision 6 from the gene/phen design doc). The prelude is the permanent home for operator contracts, not a stopgap while something else gets built. There is no hardcoded operator-overloading syntax and no parallel system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operator-gene dispatch
&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;try_operator_gene_dispatch()&lt;/code&gt; method in &lt;code&gt;semantic.rs&lt;/code&gt; (~240 insertions) handles all binary operators (&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;) and unary &lt;code&gt;-&lt;/code&gt;. When the left operand is a user struct that has a phen for the corresponding gene, the operator gets rewritten to the same &lt;code&gt;MethodCall&lt;/code&gt; node that a hand-written &lt;code&gt;a.add(b)&lt;/code&gt; call would produce. This reuses the dispatch machinery from slices 3 and 5 with no new mechanism added.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;!=&lt;/code&gt; is derived as the logical NOT of &lt;code&gt;eq()&lt;/code&gt;, matching the Eq gene contract. Types that don't have a matching phen fall through to the existing built-in numeric paths unchanged.&lt;/p&gt;

&lt;p&gt;There is one interim restriction: operator dispatch requires a named variable as the left operand. Expression receivers like &lt;code&gt;(v1 + v2) + v3&lt;/code&gt; produce a clean error rather than silently misbehaving. This is a known gap, not a design position. It lifts when method receivers become expressions, which is scoped for 0.3.3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prelude injection and collision detection
&lt;/h2&gt;

&lt;p&gt;The resolver now injects the prelude as module ID 0, before all other source units. Gene duplicate detection gained source-location tracking, so if a user redeclares a prelude gene, they get an error that names &lt;code&gt;&amp;lt;prelude&amp;gt;:LINE&lt;/code&gt; using the same collision machinery every other declaration kind already uses.&lt;/p&gt;

&lt;p&gt;Eight new test fixtures cover the operator dispatch and prelude injection: arithmetic dispatch on user structs, unary neg and equality via genes, all four ordering operators, the expression-receiver restriction error, rejection when a struct lacks an &lt;code&gt;Add&lt;/code&gt; phen, prelude behavior with multi-file imports, and collision between user-defined and prelude genes. Four existing duplicate-detection fixtures were updated for the new source-location diagnostics.&lt;/p&gt;

&lt;h2&gt;
  
  
  The merge and the release
&lt;/h2&gt;

&lt;p&gt;The full merge through PR #352 brought the entire gene/phen sprint into main: 133 files changed, 3301 insertions, 120 deletions. That covers all six slices of gene/phen implementation, the struct-return ABI fix, scope-variable hardening, and audit fixtures.&lt;/p&gt;

&lt;p&gt;The roadmap was reconciled in a separate commit (&lt;code&gt;71b5af4&lt;/code&gt;). The version sequence now reflects what actually shipped: 0.3.1 included pattern matching, and 0.3.2 contains gene/phen, operator overloading, generic bounds, the struct-return fix, and audit hardening. README status was updated to 0.3.2 with current verification figures: 245 unit tests, 420 with JIT, 380 fixtures, 319 JIT PASS / 61 SKIP / 0 PARITY_FAIL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bootstrap intrinsics
&lt;/h2&gt;

&lt;p&gt;One detail worth noting: the built-in numeric paths in semantic analysis (addition, subtraction, comparison for primitives) now explicitly conform to the prelude gene contracts and are marked as bootstrap intrinsics. They are designed for removal. The known gap is that primitives do not yet satisfy &lt;code&gt;T: Add&lt;/code&gt;-style generic bounds, since bound checks consult the phen registry and intrinsics are not registry entries. That will matter when generic functions lower through the JIT.&lt;/p&gt;

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

&lt;p&gt;0.3.3 is scoped with three items:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Expression receivers&lt;/strong&gt; for method and operator dispatch. This is the most visible gap in the freshly shipped system, and it unlocks chained operator expressions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Array-return lowering&lt;/strong&gt;, the same dangling-frame ABI shape as the struct-return bug that was fixed in this sprint. The slot convention needs array-layout awareness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generic-function lowering&lt;/strong&gt; through the JIT. Generic functions with type bounds are semantically complete but not yet lowered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is also a pending README content audit. The feature sections still describe 0.2.0-era capability and need a documentation pass covering gene/phen, Handle, pattern matching, and operator overloading.&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-07-24" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-24&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-07-21</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 22 Jul 2026 00:12:06 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-21-16oj</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-21-16oj</guid>
      <description>&lt;p&gt;Two substantial slices of gene/phen trait implementation just landed on &lt;code&gt;submain&lt;/code&gt;. This shifts the needle significantly—contract checking and the capability for phen methods to actually get called at runtime are in the door. Previously, we only had the basic declarations and coherence working but now methods can type-check, &lt;code&gt;Self&lt;/code&gt; can resolve per receiver, and calls execute. The &lt;code&gt;submain&lt;/code&gt; branch now sits 15 commits ahead of &lt;code&gt;main&lt;/code&gt;, holding the matrix at 321/0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contract Checking and &lt;code&gt;Self&lt;/code&gt; Resolution (Slice 2)
&lt;/h2&gt;

&lt;p&gt;Let's zero in on commit &lt;code&gt;fcd3193&lt;/code&gt;, which makes waves with 594 insertions across 23 files. The big takeaway is Pass 0 contract conformance. The &lt;code&gt;collect_gene_phen_registry()&lt;/code&gt; function now actively validates every phen against its gene. Consider everything from arity to positional parameter types (post-&lt;code&gt;Self&lt;/code&gt; substitution), return types, and even checks for both missing and extra methods. If there's a mismatch, it doesn’t just shout—each one is a precise diagnostic identifying gene, method, position, and expected-vs-actual types. It's pinpoint troubleshooting.&lt;/p&gt;

&lt;p&gt;The decision to resolve &lt;code&gt;Self&lt;/code&gt; at the concrete level before analysis was deliberate. &lt;code&gt;Self&lt;/code&gt; in phen signatures and bodies changes to the actual receiver type within the AST thanks to &lt;code&gt;substitute_self_type()&lt;/code&gt;. This function even navigates through intricate structures like &lt;code&gt;Array&lt;/code&gt;, &lt;code&gt;Handle&lt;/code&gt;, and &lt;code&gt;Result&lt;/code&gt; wrappers. There was an alternative: treating &lt;code&gt;Self&lt;/code&gt; as a floating type parameter. But honestly, it doesn't cut it because &lt;code&gt;types_compatible&lt;/code&gt; would unify any type param with anything. Sticking to the design docs, our path—&lt;code&gt;Self&lt;/code&gt; is concrete, not a floating parametric. &lt;/p&gt;

&lt;p&gt;How about ownership? It's strict. There's no room for unauthorized methods beyond the gene's contract. And we're talking multiple enforcement points: from Pass 0 checks to the &lt;code&gt;phen_methods&lt;/code&gt; field on &lt;code&gt;Analyzer&lt;/code&gt; triggered during per-file analysis, down to cross-gene-method name collisions caught by Pass 0. Every path specified is locked down, as envisioned by the design docs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PhenDef&lt;/code&gt;’s semantic representation beefed up. &lt;code&gt;SemanticStmt::PhenDef&lt;/code&gt; now contains &lt;code&gt;Vec&lt;/code&gt; and &lt;code&gt;Vec&amp;gt;&lt;/code&gt; instead of just plain method names. Methods undergo scrutiny in temporary scopes just like their impl-block cousins. Testing isn’t left out. We've packed ten new negative test fixtures plus a positive one to exercise every rejection path—think contract arity mismatches, missing and mismatched methods, and more. The positive test? &lt;code&gt;t_gene_phen_contract_ok&lt;/code&gt; checks two phens of a single gene with &lt;code&gt;Self&lt;/code&gt; in all type positions, acting as a 'leak' canary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phen Method Calls at Runtime (Slice 3)
&lt;/h2&gt;

&lt;p&gt;Switch to commit &lt;code&gt;cbb095e&lt;/code&gt;. This is the one where phen methods get street-legal, callable status. The insight here: phen methods log into &lt;code&gt;semantic_impls&lt;/code&gt; keyed on &lt;code&gt;(type_name, method_name)&lt;/code&gt; with receiver bindings—the same data architecture impl-block methods leverage. Therefore, &lt;code&gt;call_semantic_method&lt;/code&gt; dispatches phen calls without any tweaks, reaffirming the design doc where phen methods function as full-fledged implementations identical to an impl block's.&lt;/p&gt;

&lt;p&gt;Surprisingly, forward-reference support hitchhiked into the build. The pre-registration pass in &lt;code&gt;run_with_interpreter_setup()&lt;/code&gt; slots in phen methods right alongside impl methods, seamlessly supporting forward-call breakouts. Picture it—textual call sites preceding phen declarations still dispatch accurately.&lt;/p&gt;

&lt;p&gt;Six new test fixtures? You bet. We cover the gamut from basic construct-call-use-return pathways to multi-type dispatch and forward references. We didn’t overlook parity for phen versus impl methods in mutation scenarios, or &lt;code&gt;Self&lt;/code&gt; typed params and returns in execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Decisions Confirmed
&lt;/h2&gt;

&lt;p&gt;These slices pivot around the established design doc rather than veering off in new directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Self&lt;/code&gt; being concrete, not parametric, echoes decision 3. The &lt;code&gt;t_gene_phen_self_leak_reject&lt;/code&gt; fixture underscores this—annotating an Enemy literal as &lt;code&gt;Self&lt;/code&gt; in a Player phen remains a type error.&lt;/li&gt;
&lt;li&gt;Dispatch mechanics tightly reuse the impl-block pathways, not distinguished at runtime, needs no parallel path.&lt;/li&gt;
&lt;li&gt;Tightly enforced method ownership—as per decision 5—across all facets, rigorously tested.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Slice 2 carries a 'rebuild' hint in its commit note, indicating previous rewrites now shelved in favor of the cleaner final version.&lt;/p&gt;

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

&lt;p&gt;Half of our six slices are ready and on submain. We're locked in with declarations, coherence, contract checking, &lt;code&gt;Self&lt;/code&gt; resolution, core ownership rules, and interpreter dispatch. On deck are IR lowering for gene/phen constructs (vital for JIT backend handling), operator overloading, and the rollout of generics v3 type bounds, all part of the 0.3.4 roadmap.&lt;/p&gt;

&lt;p&gt;Sure, &lt;code&gt;submain&lt;/code&gt; is running 15 commits ahead of &lt;code&gt;main&lt;/code&gt;, and the merge holds off while the 0.3.4 sprint drums on. Eventually, though, we need to consider the inherent risks of a ballooning batch size. Plus, issue #3 (explicit return paired with trailing expressions) remains open and is currently untouched with attention shifted toward the gene/phen sprint.&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-07-21" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-21&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-07-18</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 19 Jul 2026 00:11:59 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-18-1fj3</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-18-1fj3</guid>
      <description>&lt;p&gt;Cx Dev Log — 2026-07-18: A Moment of Pause Before the Next Push&lt;/p&gt;

&lt;p&gt;The Cx codebase has taken a breather. It's been quiet for five days, a rarity in the fast-paced world of solo-developed languages. Main is stable at commit &lt;code&gt;3430e4e&lt;/code&gt;, marked by the last 0.3.1 release tag from July 9. Submain's clocked at &lt;code&gt;3b7b7f8&lt;/code&gt; with the freshly finalized gene/phen design as of July 14. Even the automated matrix stands firm: 321 tests passing, zero failing. But quiet isn't inactivity—it's anticipation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Project Sits
&lt;/h2&gt;

&lt;p&gt;The significant chunk of work that wrapped on July 14 was hefty: the gene/phen design's v1.1 spec. It doesn't just wrap dispatch strategies; we're talking about cleaner Ord mappings, robust Self resolutions, and handling phen lookups with cross-module coherence. Those are down in a 13-commit series on submain, the product of a thorough hammering out of all six outstanding design questions. But it wasn't just theoretical.&lt;/p&gt;

&lt;p&gt;These commits include necessary parser and semantic adjustments, say, coming out of our recent audit. Scoping issues are in check, width-range enforcement leveled up, and we've put any unnecessary comparison errors on Bool/Enum to bed. There's a crucial runtime patch too—no more enum &lt;code&gt;==&lt;/code&gt;/&lt;code&gt;!=&lt;/code&gt; crashes blowing up the interpreter. We've also streamlined CI through direct &lt;code&gt;run_matrix.sh&lt;/code&gt; runs.&lt;/p&gt;

&lt;p&gt;These advances sit 13 steps ahead of main without a single technical barricade to rushing them into action. This delay in merging? It's purely deliberate, not dictated by troublesome conflicts or failing tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Queued Once Work Resumes
&lt;/h2&gt;

&lt;p&gt;So, what's cooking when the fingers start flying across keyboards again? Here's what's lined up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Merge submain to main.&lt;/strong&gt; We've got 13 commits begging for integration. Expect this to be painless, almost ceremonial, since main's been untouched.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;0.3.4: Gene/Phen Implementation.&lt;/strong&gt; The design spec isn’t a riddle wrapped in an enigma—it's a clear blueprint. It's got everything: pass ordering, canonical key formats, robust collision detection, diagnostic frameworks, and essential test fixtures. The specs make the engineering path obvious and actionable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Known Issue #3.&lt;/strong&gt; It’s another loose end: explicit return with trailing expressions, tangled in the same territory where #2 was resolved. It's still up for grabs.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  On Pauses
&lt;/h2&gt;

&lt;p&gt;A five-day hiatus post-design isn’t unusual, especially for a language crafted solo. Ensuring the architecture's rock-solid—dispatch mechanics, coherence rules, semantics—takes its toll. Patterns being matched in 0.3.2 landed but haven’t seen a tagged release. We’ve got routine release housekeeping next to the real implementation grind.&lt;/p&gt;

&lt;p&gt;Call it the calm before the storm. The project isn't at sea without a sail—the framework's in place, and the green-lit test matrix primes us for action. It's just about recharging before the next coding sprint.&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-07-18" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-18&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-07-11</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 12 Jul 2026 02:42:51 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-11-1jn7</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-11-1jn7</guid>
      <description>&lt;p&gt;A parser with no changes to its lowering layer fixed a JIT failure. Sounds improbable? That's what we tackled recently in Cx development. Throughout our session, four issues were closed in two subsystems, focusing on correctness and stability, on the submain branch. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Trailing-Builtin Parser Fix
&lt;/h2&gt;

&lt;p&gt;Consider a &lt;code&gt;print(x)&lt;/code&gt; as the final line of a function without a trailing semicolon. Previously, this line would be promoted to a &lt;code&gt;ret_expr&lt;/code&gt; by our parser's &lt;code&gt;func_body&lt;/code&gt; combinator — resulting in semantic artifacts that disrupted the lowering system. This oversight led to an unsettling "unresolved semantic artifact reached lowering" error.&lt;/p&gt;

&lt;p&gt;The solution was a simple yet effective new predicate, &lt;code&gt;is_statement_level_builtin_call()&lt;/code&gt;, in &lt;code&gt;src/frontend/parser.rs&lt;/code&gt;. It specifically recognizes trailing calls like &lt;code&gt;print&lt;/code&gt;, &lt;code&gt;println&lt;/code&gt;, &lt;code&gt;printn&lt;/code&gt;, &lt;code&gt;assert&lt;/code&gt;, and &lt;code&gt;assert_eq&lt;/code&gt;, and ensures they're treated as standard statements rather than being prematurely promoted. This fix bypasses unnecessary promotions and channels the calls through the existing &lt;code&gt;lower_stmt&lt;/code&gt; dispatcher. Interestingly, this was purely a parser misclassification error, not a failure of the lowering layer.&lt;/p&gt;

&lt;p&gt;Here's what changed: 5 JIT-SKIP fixtures are now back in action: &lt;code&gt;t29_forward_decl&lt;/code&gt;, &lt;code&gt;t31_strref_forward_combined&lt;/code&gt;, &lt;code&gt;t67_macro_outer_test&lt;/code&gt;, &lt;code&gt;t68_macro_outer_deprecated&lt;/code&gt;, and &lt;code&gt;t_array_elem_arg_in_range&lt;/code&gt;. Initially, the prediction was 8, but two fixtures were disqualified earlier in macro processing, and &lt;code&gt;t50_nested_func_no_leak&lt;/code&gt; remains on hold. JIT parity advanced from 261/60/0 to 267/55/0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope Boundaries for Control-Flow Bodies
&lt;/h2&gt;

&lt;p&gt;Variables declared within &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt;, &lt;code&gt;else-if&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;loop&lt;/code&gt;, and &lt;code&gt;while-in&lt;/code&gt; bodies were unintentionally bleeding out into the surrounding scope. This problem boiled down to missing &lt;code&gt;push_scope()&lt;/code&gt; and &lt;code&gt;pop_scope()&lt;/code&gt; calls in &lt;code&gt;src/frontend/semantic.rs&lt;/code&gt;. By adding these, we ensured proper scope boundaries.&lt;/p&gt;

&lt;p&gt;Four new test fixtures (&lt;code&gt;t179_if_scope&lt;/code&gt;, &lt;code&gt;t180_while_scope&lt;/code&gt;, &lt;code&gt;t181_loop_scope&lt;/code&gt;, &lt;code&gt;t182_whilein_scope&lt;/code&gt;) now check that names declared within those bodies aren't accessible outside of them. Previously, incorrect programs could silently pass by misusing variables beyond their intended scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Width-Range Enforcement at Missed Sites
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;check_semantic_num_fits()&lt;/code&gt;, our system ensures numeric values are within target type ranges. However, three assignment contexts were slipping through without these checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Variable reassignment (e.g., &lt;code&gt;x = 300&lt;/code&gt; where &lt;code&gt;x: u8&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Array-index assignment (e.g., &lt;code&gt;arr[0] = 300&lt;/code&gt; where &lt;code&gt;arr: [u8; 4]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Method-call arguments (e.g., &lt;code&gt;obj.method(300)&lt;/code&gt; expecting a &lt;code&gt;u8&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We addressed each of these scenarios. Six new test fixtures now verify both in-range and out-of-range values across these contexts. It's all about defensive correctness — repairs that should've been in the type system from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Direction
&lt;/h2&gt;

&lt;p&gt;We've consciously shifted focus from the challenging tasks ahead (like known-issues #5 I128 ABI sizing and #4 per-enum tag-to-name tables) toward more tractable correctness fixes. The semantic audit findings and parser adjustments made were straightforward but necessary. This involved four commits, 11 new test fixtures, and the closure of two known issues and two audit findings.&lt;/p&gt;

&lt;p&gt;Currently, everything remains on the submain, with main topping at v0.3.1.&lt;/p&gt;

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

&lt;p&gt;Submain leads the main by four commits, all with clean fixture runs, setting the stage for a potential merge to main and possibly v0.3.2 in the future. Known-issue #3 (explicit return + trailing expression) becomes the natural follow-up, sitting right within the modified parser framework. Major items, like the I128 ABI and enum tag-to-name tables, will stay on the backburner for now, while we concentrate on feasible victories.&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-07-11" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-11&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-07-10</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sat, 11 Jul 2026 01:14:03 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-10-2ch3</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-10-2ch3</guid>
      <description>&lt;p&gt;The v0.3.1 release is finally here, capping off a series of daily logs predicting its arrival. The integration on July 9 brought us more than what was initially scoped, folding in Handle core, pattern matching enhancements, an f64 comparison fix, and a new known-issues tracker. It's been a significant addition, pushing our test matrix from 292 to 321.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Handle core (D2.5a/b/c).&lt;/strong&gt; We've introduced the &lt;code&gt;Handle&lt;/code&gt; construct, adding read/val and drop functionality for scalar payloads. This uses a packed i64 representation—slot and generation fields, anchored by a host-side registry. Empirical tests confirm no aliasing on double-drop and generational safety. Nine new test fixtures ensure coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern matching first slices.&lt;/strong&gt; Originally destined for 0.3.2, enhancements like &lt;code&gt;as v&lt;/code&gt; named bindings and guard clauses in &lt;code&gt;when&lt;/code&gt; enum arms have arrived early. Guard clauses repurpose existing mechanics, avoiding new control-flow constructs. The additions were well-received, with twenty new fixtures targeting positive behavior and leak rejection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interpreter f64 comparison fix.&lt;/strong&gt; This fix addressed missing &lt;code&gt;Value::Float&lt;/code&gt; match arms for comparison operators like &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt; in &lt;code&gt;src/runtime/ops.rs&lt;/code&gt;. Interestingly, the JIT got it right from the start, reversing an often-seen pattern where the interpreter leads. Five new fixtures ensure correctness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Known-issues tracker.&lt;/strong&gt; We've established a tracker in &lt;code&gt;docs/known_issues.md&lt;/code&gt;, cataloging ongoing divergences between the interpreter and JIT. The f64 issue is resolved, but others like bare builtin in trailing positions and print issues remain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The I128 host-boundary finding
&lt;/h2&gt;

&lt;p&gt;The standout technical takeaway? A failed fix on our JIT system. Trying to pass a raw &lt;code&gt;i128&lt;/code&gt; by value proved unsuccessful—it segfaulted. This boundary scenario, untested before, requires a pass-by-pointer strategy instead. This insight, although not immediately operational, is crucial for any wide scalar work moving forward.&lt;/p&gt;

&lt;p&gt;Attempting to resolve the &lt;code&gt;print(enum)&lt;/code&gt; issue revealed another layer of complexity. It involves setting up tag-to-name tables rather than simple dispatch-arm fixes. This pivot in approach, while unplanned, is necessary for the print parity objective.&lt;/p&gt;

&lt;h2&gt;
  
  
  State of the project
&lt;/h2&gt;

&lt;p&gt;Following the merge, both submain and main branches are aligned, leaving our working tree clean. 321 tests now pass without failure—a testimony to the release's impact, bolstered by 29 new fixtures.&lt;/p&gt;

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

&lt;p&gt;Addressing the I128 host-boundary ABI snag is next up, with a sizing pass pinned as our most pressing task. The subsequent task involves implementing the tag-to-name string tables for full JIT print parity. Issues around expression handling (#2 and #3) remain unsized and open, awaiting attention.&lt;/p&gt;

&lt;p&gt;For the feature roadmap, the gene and phen design pass is queued for release 0.3.2. However, the timeline is uncertain as multiple pull requests linger, awaiting review.&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-07-10" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-10&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-07-09</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Fri, 10 Jul 2026 00:21:18 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-09-51n8</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-09-51n8</guid>
      <description>&lt;p&gt;No developer commits landed on any branch today. That marks five days in a row. Despite this lull, the matrix remains at 292/0, keeping the working tree clean and submain nine commits ahead of main. These aren't trivial changes waiting in the wings—they're foundational adjustments covering critical components like Handle core, pattern matching, and float comparison fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's waiting on submain
&lt;/h2&gt;

&lt;p&gt;Let's dive into what's been brewing on submain since the last merge. There are three feature scopes waiting to be seen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalar Handle core (D2.5a/b/c)&lt;/strong&gt; made some significant strides by introducing construct, read, and drop with proven generational safety via Cranelift. This isn’t just a bunch of lines in code—it's a packed-i64 representation complete with slot and generation fields, a host-side registry, and an out-parameter validity checking pattern. Six test fixtures back up these additions, supporting functionality and correctness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern matching first slices&lt;/strong&gt; took an ambitious step by incorporating &lt;code&gt;as v&lt;/code&gt; named binding on enum arms and guard clauses on &lt;code&gt;when&lt;/code&gt; arms. This might not sound flashy, but it's a crucial move towards making pattern matching useful for real control flow—not merely for type discrimination anymore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interpreter float comparison fix&lt;/strong&gt; addressed four missing &lt;code&gt;Value::Float&lt;/code&gt; match arms for relational operators. It’s a straightforward correction, but an essential one, especially for anyone relying on numerical evaluations in the interpreter path. Without it, mathematical consistency would be the first to go out the window.&lt;/p&gt;

&lt;p&gt;Alongside these language updates, submain also carries a roadmap reconciliation to fix stale version sequences—ranging from 0.3.1 through to 1.0+—alongside a new known-issues tracker found at &lt;code&gt;docs/known_issues.md&lt;/code&gt;. This catalogues five interpreter/JIT divergences. Yet, all of this remains invisible to those on main.&lt;/p&gt;

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

&lt;p&gt;Merging submain to main has been the forecasted step every day since July 4th. But it hasn't happened. Missing the mark five times on the same forecast is concern-worthy.&lt;/p&gt;

&lt;p&gt;From an outsider’s perspective, the repository state appears healthy: passing tests, a clean working tree, and finished code on submain. There's no technical debt or failing tests barricading this merge. The real barrier might be review cadence, a confidence threshold, or something unrelated to the repo entirely.&lt;/p&gt;

&lt;p&gt;Adding to the backlog, five daily log pull requests (#328 through #332) remain unmerged. Essential roadmap updates, particularly the major restructuring from the July 5th log, haven't reached main. The main-branch roadmap lags behind in its May 18th state, almost two months stale compared to submain’s last update on July 4th. The gap closes once submain merges or any daily log PR lands, but without action, neither clears.&lt;/p&gt;

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

&lt;p&gt;Carrying predictions forward feels less certain as each day passes:&lt;/p&gt;

&lt;p&gt;The submain merge remains the most impactful step we could take. Nine commits, three feature scopes, roadmap reconciliation, and a known-issues tracker—all poised to deliver significant updates once merged. Known issue #5 (I128 printing) is primed and waiting—needing just one match arm plus one host callback for completion. Plus, at least one daily log PR could independently help update the main roadmap without relying on the full submain integration.&lt;/p&gt;

&lt;p&gt;The repeated inactivity isn't inherently alarming. Software development seldom moves in a straight line, and holding patterns are par for the course. However, the gap between submain's accomplishments and main's current state widens with each passing day. Merging grows more complex as the branches diverge further.&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-07-09" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-09&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-07-04</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 05 Jul 2026 02:43:00 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-04-2462</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-04-2462</guid>
      <description>&lt;p&gt;Handles in Cx have taken a big step forward with two key commits now on submain. The Handle type has finally become a real machine value processed through Cranelift, marking a major milestone for Phase 8 Round 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The packed-i64 Representation
&lt;/h2&gt;

&lt;p&gt;In Cx, a Handle is straightforward: a packed single i64 represented by &lt;code&gt;slot | (gen &amp;lt;&amp;lt; 32)&lt;/code&gt;. Both &lt;code&gt;slot&lt;/code&gt; and &lt;code&gt;gen&lt;/code&gt; are unsigned u32s and we use a u64 reinterpretation to avoid any sign-extension issues. Specifically, &lt;code&gt;lower_type(SemanticType::Handle(_))&lt;/code&gt; outputs an &lt;code&gt;IrType::I64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Handling these machine values required placing runtime state in a &lt;code&gt;HandleRegistry&amp;lt;i64&amp;gt;&lt;/code&gt; behind a &lt;code&gt;OnceLock&amp;gt;&lt;/code&gt; static in &lt;code&gt;host_boundary.rs&lt;/code&gt;. This setup is a workaround for Cranelift limitations. The constraint? &lt;code&gt;jit_builder.symbol()&lt;/code&gt; relies on raw function pointers, not state-capturing closures. Safety here comes from &lt;code&gt;run_jit_subprocess&lt;/code&gt; which isolates states by using fresh OS processes for each fixture, preventing cross-test state carryover.&lt;/p&gt;

&lt;p&gt;A helper, &lt;code&gt;widen_handle_payload_to_i64&lt;/code&gt;, converts inner expressions' lowered types to i64 but only for &lt;code&gt;{I8, I16, I32, I64, Bool}&lt;/code&gt; types. Notably excluded are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ptr&lt;/strong&gt;: We'd face the &lt;code&gt;Handle&amp;lt;str&amp;gt;&lt;/code&gt; issue, where a raw scalar or a string descriptor pointer could confuse operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F64&lt;/strong&gt;: This would lead to silent truncation, not suitable for types requiring round-trip fidelity. Consideration here is crucial, reflecting intentional design rather than future work placeholders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Handle.val and the Out-parameter Approach
&lt;/h2&gt;

&lt;p&gt;Reading the value (commit D2.5b) posed more challenges than expected. Our initial "uniform-i64" hypothesis didn't hold water due to strict type equality required downstream. Instead, HandleVal's semantic design uses I128, not i64, so handling it involves widening the i64 payload via sign-extending Cast to output a legitimate &lt;code&gt;IrType::I128&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For validity checks, an out-parameter is used instead of sentinels, given that the slot+gen packed space leaves no room for reserved bit patterns without conflicts. &lt;code&gt;_cx_handle_val(handle: i64, out_valid: *mut i8) -&amp;gt; i64_&lt;/code&gt; performs the out-parameter check and defaults to &lt;code&gt;IrTerminator::Trap&lt;/code&gt; if invalid. The reuse of the Alloca/Store/Load pattern, similar to Results, adapts well, though a single-byte slot suffices here.&lt;/p&gt;

&lt;p&gt;Though the Trap path is hardwired, we can't yet test invalid handles through current Cx code; since there’s neither HandleDrop nor uninitialized reads. The real testing awaits D2.5c alongside generational reuse that will naturally generate stale handles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handle+Array Composition Success
&lt;/h2&gt;

&lt;p&gt;A third commit by early July 3rd confirmed the correctness of Handle+array composition. An earlier syntax error audit, using &lt;code&gt;arr[i]&lt;/code&gt; instead of the correct &lt;code&gt;arr:[i]&lt;/code&gt;, had been resolved. Now, Handles in array literals process and return expected results. Notably, the &lt;code&gt;t_handle_array_no_drop&lt;/code&gt; fixture confirms this improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Matrix Progress
&lt;/h2&gt;

&lt;p&gt;The matrix on submain now stands at 297/0 after rising from 292. Parity scores are 237 PASS / 60 SKIP / 0 PARITY_FAIL across this set. Recent commits introduced several new fixtures, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;t_handle_construct_cross_fn&lt;/code&gt; (from D2.5a, provisional)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t_handle_val_positive&lt;/code&gt; (standard round-trip case)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t_handle_val_negative&lt;/code&gt; (tests for sign-extension)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t_handle_val_bool&lt;/code&gt; (validates discrimination)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently, all updates remain within submain, with main unchanged.&lt;/p&gt;

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

&lt;p&gt;Up next is the HandleDrop (D2.5c), set to handle generational reuse and empirically prove the stale-handle Trap path. An integration point approaches with submain now four commits ahead of v0.3.0 and a merge to main beckons. Still in the wings are DotAccess updates in compound forms, alongside uncommitted tutorial rewrites—280 lines ready to fit into the broader narrative.&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-07-04" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-04&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-28</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 29 Jun 2026 00:10:00 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-28-48oe</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-28-48oe</guid>
      <description>&lt;p&gt;Labeled break/continue is now live across the entire Cx language stack. From the lexer to the JIT, two commits streamlined the implementation into a complete vertical slice. No parts left out, no corners cut—everything just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lexer seam
&lt;/h2&gt;

&lt;p&gt;If you're handling character literals and labels in the same codebase, you'll know what a pain this can be. We opted for a Rust-like syntax: &lt;code&gt;'ident&lt;/code&gt; for labels, with no closing quote. The label regex sits right after &lt;code&gt;LiteralChar&lt;/code&gt; in the logos enum. Thanks to longest-match, &lt;code&gt;'x'&lt;/code&gt; becomes a char literal, while &lt;code&gt;'outer&lt;/code&gt; is parsed as a label. Escape sequences? They can't match labels because they have a backslash, making &lt;code&gt;'x'&lt;/code&gt; always look cleaner in code. A test fixture (&lt;code&gt;t_char_literal_guard&lt;/code&gt;) ensures this order and regex integrity hold. Change the lexer rules, and it'll catch any mistakes immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two-commit split
&lt;/h2&gt;

&lt;p&gt;We didn't cram this into a single mega-commit. No, we split it into two. Commit &lt;code&gt;f94c6a5&lt;/code&gt; laid down the frontend groundwork—adding the &lt;code&gt;Label&lt;/code&gt; token, allowing loops and breaks to carry optional labels, and rejecting any misuse with semantic checks. The interpreter and JIT, however, initially took a back seat, guarding themselves against mislabeled jumps.&lt;/p&gt;

&lt;p&gt;Then came commit &lt;code&gt;0f56f1e&lt;/code&gt;, which wiped out these guards and enabled real execution on backends. Now all parses and semantic checks play nicely without rogue labeled breaks sneaking into the wrong loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interpreter changes
&lt;/h2&gt;

&lt;p&gt;The interpreter now handles &lt;code&gt;BreakSignal&lt;/code&gt; and &lt;code&gt;ContinueSignal&lt;/code&gt; carrying labels. Loops catch these signals when the label is either absent (defaulting to the innermost loop) or matches their own. The difference from before? Zero unlabelled break/continue behavior change while facilitating outward jumps.&lt;/p&gt;

&lt;h2&gt;
  
  
  JIT changes
&lt;/h2&gt;

&lt;p&gt;The JIT saw more extensive adjustments, gaining a label field within &lt;code&gt;LoopContext&lt;/code&gt;. Push and pop that context on a stack, trace it through lowering calls, and you've got labeled jumps pinpointed. The unlabeled jumps? They get the same treatment as before by taking the top of the stack. Existing codegen remains untouched, minus this stack expansion for labeled functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test fixtures
&lt;/h2&gt;

&lt;p&gt;To solidify all this, we introduced four new test fixtures. Semantic rejections? Covered. Breaking and continuing to outer loops? Nailed. This test suite now boasts stability: 292 pass, 0 fail. &lt;/p&gt;

&lt;h2&gt;
  
  
  Other changes
&lt;/h2&gt;

&lt;p&gt;We've also logged a packed-i128 representation and updated the &lt;code&gt;?&lt;/code&gt; operator details on the site branch (&lt;code&gt;07bef03&lt;/code&gt;).&lt;/p&gt;

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

&lt;p&gt;Labeled breaks dug into the core of &lt;code&gt;semantic.rs&lt;/code&gt; and &lt;code&gt;lower.rs&lt;/code&gt;, setting the stage for optimizing &lt;code&gt;when&lt;/code&gt; block lowering. Projects like DotAccess in compound forms and dynamic strings are still in queue, waiting for their time in the spotlight. But, the submain branch grows restless, 26 commits ahead and aging since its last merge—no regressions, just merge delays.&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-06-28" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-28&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-27</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 28 Jun 2026 02:42:44 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-27-1lgc</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-27-1lgc</guid>
      <description>&lt;p&gt;Result just crossed a major compiler boundary in Cx, marking a significant step forward in our error handling journey. Two key commits have successfully integrated the packed-i128 representation and introduced the ? (Try) operator within the JIT pathway. Let's explore how these changes shape the overall architecture and what they mean for developers working with Cx.&lt;/p&gt;

&lt;h2&gt;
  
  
  The packed-i128 representation
&lt;/h2&gt;

&lt;p&gt;Storing &lt;code&gt;Result&lt;/code&gt; as a packed i128 turned out to be an interesting technical challenge. We split the i128 into a tag and a payload, with the high 64 bits reserved for the tag (Ok = 0, Err = 1) and the low for the payload. The goal was to maintain clear separation without arithmetic packing, which would risk sign-extension messing up the tag when handling negative payloads. Instead, we opted for a memory round-trip approach: allocate, store, and then load both parts into a single i128. This method is mechanically heavier but it confidently preserves data integrity—an essential choice.&lt;/p&gt;

&lt;p&gt;One key safeguard is a canary fixture named &lt;code&gt;t_result_ok_negative.cx&lt;/code&gt;, ensuring negative payloads don't corrupt the tag. Any future attempt to optimize this away would trigger the test.&lt;/p&gt;

&lt;p&gt;On the Cranelift front, we had to tweak the settings a bit with &lt;code&gt;enable_llvm_abi_extensions&lt;/code&gt; in &lt;code&gt;host_boundary.rs&lt;/code&gt; to handle i128 arguments correctly. It’s a small but critical adjustment to maintain byte-for-byte output consistency between JIT and interpreter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ? operator
&lt;/h2&gt;

&lt;p&gt;Bringing the &lt;code&gt;expr?&lt;/code&gt; operator into the picture with D2.4b required an ingenious unpacking process. Here, the packed i128 unpacks using &lt;code&gt;result_unpack&lt;/code&gt;, allowing us to branch on the tag. For an Ok tag, execution proceeds by narrowing the payload back into its original form. For an Err, we return the entire i128 early, preserving error data consistency to the caller.&lt;/p&gt;

&lt;p&gt;Importantly, Cx's semantic analyzer ensures &lt;code&gt;?&lt;/code&gt; is context-appropriate—enforcing its use only within Result-returning functions. This preemptive check simplifies the lowering and avoids unnecessary runtime consistency checks.&lt;/p&gt;

&lt;p&gt;It's worth noting that the Result usage is bounded by T's ability to fit within a single i64 word. While this decision limits nested Results, it keeps us honest about representation constraints and prevents unknown behavior, clearly marking where further work lies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example suite rewrite
&lt;/h2&gt;

&lt;p&gt;Apart from the core changes, the &lt;code&gt;examples/&lt;/code&gt; directory got a fresh, comprehensive rewrite. The examples now include more intuitive code patterns, richer demonstrations, and polished documentation. The &lt;code&gt;error_handling.cx&lt;/code&gt; example stands out, showcasing the Result and &lt;code&gt;?&lt;/code&gt; operator now viable due to these backend improvements. These changes, though uncommitted, prepare the ground for developers to see these new capabilities in action, adding roughly 280 lines across the suite.&lt;/p&gt;

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

&lt;p&gt;Our upcoming focus is on D2.4c, addressing equality routing for Result types. While &lt;code&gt;assert_eq&lt;/code&gt; functions effortlessly for Result due to i128 equality on Ok tags, Err comparison will rely on &lt;code&gt;cx_str_eq&lt;/code&gt; for fairness on strings. These finer routing details are pivotal for robust error-type handling.&lt;/p&gt;

&lt;p&gt;Meanwhile, the example documentation overhaul is pending commit. The error-handling example, central to our recent changes, waits in the wings for the new commits to merge into main, already 24 commits behind the action.&lt;/p&gt;

&lt;p&gt;Looking ahead, our roadmap includes tackling dynamic strings (R6) and DotAccess in compound forms to complete Phase 11. Parity benchmarks have already improved with 229 tests passing out of 287 on submain, whereas main lingers a bit behind.&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-06-27" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-27&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-26</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sat, 27 Jun 2026 00:08:17 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-26-1kbf</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-26-1kbf</guid>
      <description>&lt;p&gt;No code landed today. No commits from the developer across any branch for the second day in a row. The only repo activity was automated: yesterday's daily log commit and a site blog post. That makes this a good moment to take stock of where things actually stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static strings are done, dynamic strings are not
&lt;/h2&gt;

&lt;p&gt;The static string subset (D2.3a through D2.3d) shipped to submain and has been stable for about 48 hours now. That covers &lt;code&gt;len()&lt;/code&gt; constant folding, string literal lowering, concat folding with content equality, and string interpolation with f64 print support. Everything that can avoid runtime allocation is handled.&lt;/p&gt;

&lt;p&gt;The next real frontier is R6: dynamic strings. This means runtime allocation, lifetime management, and a new string representation. It is a qualitative step up from the static work. It has been the predicted next move on daily logs for ten consecutive days now, but no work on it has started yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain-to-main gap keeps growing
&lt;/h2&gt;

&lt;p&gt;Submain is 22 commits ahead of main. The last merge (PR #295) was 21 days ago. The test matrix on submain is clean at 286 pass / 0 fail, with parity numbers at 222 pass / 64 skip / 0 parity fail. Main sits at 230 pass / 0 fail out of 230.&lt;/p&gt;

&lt;p&gt;There is no technical blocker to merging. The gap is just growing through inertia.&lt;/p&gt;

&lt;h2&gt;
  
  
  The daily-log PR backlog
&lt;/h2&gt;

&lt;p&gt;There are at least 10 open daily-log PRs (June 16 through 25, PRs #308 through #317), and none have been merged. The last daily-log PR that actually landed on main was from late May. This matters because those PRs carry roadmap updates that check off real completed work: range-check hardening (CR#1 through 4), arithmetic safety gates, &lt;code&gt;when&lt;/code&gt; block lowering, unknown/TBool lowering, and the full static string subset. Main's ROADMAP.md still reads "Last updated: 2026-05-18," which is over five weeks stale.&lt;/p&gt;

&lt;p&gt;The roadmap on main does not reflect the current state of the project. Anyone looking at main alone would have no idea that the static string subset is done.&lt;/p&gt;

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

&lt;p&gt;The same three items that have been predicted for the last ten days remain the natural continuation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic strings (R6)&lt;/strong&gt; is the clearest technical frontier. It requires allocation infrastructure that does not exist yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merging submain to main&lt;/strong&gt; would close the 22-commit gap and bring the roadmap current. Zero regressions stand in the way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DotAccess in compound forms&lt;/strong&gt; is the last unchecked non-string item under Phase 11.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two rest days in a row might mean the developer is away or working on something outside this repo. When work does resume, any of these three would move the project 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-06-26" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-26&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-25</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Fri, 26 Jun 2026 00:09:05 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-25-3ef2</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-25-3ef2</guid>
      <description>&lt;p&gt;No code landed today. The static string subset wrapped up yesterday with D2.3d (print-time interpolation and f64 print lowering), and today was a genuine pause. Sometimes those are worth documenting too, because the project state right now is interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static strings: done
&lt;/h2&gt;

&lt;p&gt;The D2.3a through D2.3d arc is complete on submain. The JIT now handles string literals, compile-time concatenation, content equality, and print-time string interpolation. Every string operation that can avoid runtime allocation is covered.&lt;/p&gt;

&lt;p&gt;The approach to interpolation is worth noting: &lt;code&gt;print("a {x} b")&lt;/code&gt; decomposes at lowering into a sequence of inline prints rather than building a new string in memory. That was a deliberate design call to keep R6 (dynamic string allocation) out of scope for this batch. It works for print statements; string interpolation in general expression context will need the allocation infrastructure that R6 brings.&lt;/p&gt;

&lt;p&gt;The parity numbers tell the story. Submain sits at 222 PASS / 64 SKIP / 0 PARITY_FAIL across 286 fixtures. Those 64 SKIPs are the dynamic string cases and JIT-unsound paths that need R6 or bounds checking to resolve. Main's matrix holds steady at 230/0.&lt;/p&gt;

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

&lt;p&gt;Submain is now 22 commits ahead of main. The last merge was PR #295 (the v0.2.0 batch), and that was 20 days ago. Every daily log for over a week has predicted a submain-to-main merge, and it keeps not happening.&lt;/p&gt;

&lt;p&gt;There are zero regressions on submain and no merge conflicts expected. The accumulated work includes range-check hardening, arithmetic safety gates, when block lowering, the full static string arc, and multiple rounds of parity improvements. It is a lot of verified work sitting in a branch.&lt;/p&gt;

&lt;p&gt;This is not a technical blocker. It is just a prioritization pattern where new feature work keeps winning over integration. At some point the gap gets unwieldy enough that the merge itself becomes a task worth scheduling explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap catch-up
&lt;/h2&gt;

&lt;p&gt;The roadmap on main was last updated 2026-05-18, which is over five weeks stale. Today's daily log branch brought it current by checking off all the submain work through D2.3d: range-check hardening (CR#1-4), arithmetic safety gates, when block lowering, and the full static string series. No new tasks were added since the natural next steps are already represented in existing items.&lt;/p&gt;

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

&lt;p&gt;The next real frontier is R6: dynamic strings. Everything the JIT handles today involves strings that are fully known at compile time or decomposed into inline print sequences. Dynamic concatenation with runtime operands, string values flowing through non-print expression contexts, runtime string construction -- all of that requires allocation infrastructure, lifetime management, and potentially a new string representation.&lt;/p&gt;

&lt;p&gt;That is a qualitative step up from the static subset. The static string work was a series of lowering patterns and host callbacks. R6 means building actual memory management into the runtime.&lt;/p&gt;

&lt;p&gt;The other long-deferred item is DotAccess in compound forms, the last unchecked non-string Phase 11 sub-item. It has been predicted in every daily log for over a week and not started. Whether it gets picked up before or after R6 remains to be seen.  &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-06-25" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-25&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-24</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 25 Jun 2026 00:07:39 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-24-17e5</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-24-17e5</guid>
      <description>&lt;p&gt;Two significant commits hit submain today, closing out the static string subset for the JIT. D2.3d brings print-time string interpolation and f64 print support, and D2.3c adds compile-time literal string concatenation and content equality. The commit sequence moved our parity numbers from 215/71/0 to 222/64/0 across 286 fixtures—submain is advancing fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  D2.3d: print-time interpolation and f64
&lt;/h2&gt;

&lt;p&gt;This is the heavyweight commit. We've got &lt;code&gt;print("a {x} b")&lt;/code&gt; now breaking down into an inline print sequence during lowering. No runtime string construction here; we're passing literals and values through type-suited intrinsics and completing the statement with a &lt;code&gt;cx_print_newline&lt;/code&gt;. The aim? Completely sidestep R6 by avoiding dynamic string allocation.&lt;/p&gt;

&lt;p&gt;We diverged from the interpreter in a couple of nuanced areas: shadowed names after exiting inner blocks and handling use-before-declaration. Neither scenario is covered by current fixtures, so it's deliberate, not a silent ship. It's linked to an ongoing interpolation-scoping question we've been nudging down the road.&lt;/p&gt;

&lt;p&gt;Five new host intrinsics are onboarded in &lt;code&gt;HostBoundary&lt;/code&gt;— &lt;code&gt;cx_print_str_inline&lt;/code&gt;, &lt;code&gt;cx_printn_inline&lt;/code&gt;, &lt;code&gt;cx_print_bool_inline&lt;/code&gt;, &lt;code&gt;cx_print_f64_inline&lt;/code&gt;, and &lt;code&gt;cx_print_newline&lt;/code&gt;. Normal print behavior remains unchanged.&lt;/p&gt;

&lt;p&gt;f64 print also gets support. Now, &lt;code&gt;print(some_f64)&lt;/code&gt; takes the &lt;code&gt;cx_print_f64_inline&lt;/code&gt; path, aligning with the interpreter's method using Rust's &lt;code&gt;Display&lt;/code&gt;. Previously, f64 was completely off the table for print. Updated fixtures &lt;code&gt;t75_string_interpolation&lt;/code&gt; and &lt;code&gt;t55_f64_basic&lt;/code&gt; confirm byte-for-byte matches with interpreter output.&lt;/p&gt;

&lt;h2&gt;
  
  
  D2.3c: literal concat folding and string equality
&lt;/h2&gt;

&lt;p&gt;Technically slightly before midnight, this commit went live on June 23. The &lt;code&gt;str + str&lt;/code&gt; concatenation collapses compile-time-known operands into one static descriptor at lowering time—employing the static leak mechanism similar to D2.3b, with runtime skipping beyond R6.&lt;/p&gt;

&lt;p&gt;For content equality, we added a &lt;code&gt;cx_str_eq(a_desc, b_desc)&lt;/code&gt; callback. It handles descriptors by checking length and &lt;code&gt;memcmp&lt;/code&gt;. &lt;code&gt;!=&lt;/code&gt; is simply &lt;code&gt;==&lt;/code&gt; negated. String equality checks, like &lt;code&gt;assert_eq&lt;/code&gt;, follow this route. Five fixtures transitioned: &lt;code&gt;t_concat_basic&lt;/code&gt;, &lt;code&gt;t_concat_chain&lt;/code&gt;, &lt;code&gt;t_concat_empty&lt;/code&gt;, &lt;code&gt;t_concat_eq&lt;/code&gt;, &lt;code&gt;t78_assert_eq_strings&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static string subset: done
&lt;/h2&gt;

&lt;p&gt;With D2.3d in, our static string subset is complete. JIT now rolls with string literals, compile-time concat, content equality, and print-time interpolation. Anything necessitating runtime allocation—like dynamic concatenation of non-literals—remains deferred to R6. We've defined a clean boundary: no heap-allocated string type, no dynamic work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submain gap keeps growing
&lt;/h2&gt;

&lt;p&gt;There's a 22-commit gulf between submain and main. Submain stands at 222/64/0 across 286 fixtures, while main hovers at 230/230. This separation spans 19 days and counting; predictions of a merge have been off for eight straight days. No technical hurdles in sight—submain's ready.&lt;/p&gt;

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

&lt;p&gt;Next up is R6 (dynamic strings), signaling a big leap beyond static strings. This means allocation, lifetime management, maybe revisiting the string representation. DotAccess in compound forms is the loose end of Phase 11, predicted for eight days now—a start is overdue. The submain merge remains our best low-effort/high-impact move.  &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-06-24" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-24&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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