REXX Language implementation
Status: working planning scratchpad for beta 3. This file captures candidate GitHub issues before they are created. It is not a release contract.
Target milestone: 1.0.0-beta.3.
Current baseline: develop is beta 3 WIP after the tagged v1.0.0-beta.2
release.
docs/planning/beta-3/notes/<issue-number-or-slug>.md.Create these immediately with the beta 3 milestone:
Create the remaining foundation implementation issues after their design-lock decisions are approved or narrowed.
Created on 2026-06-17 under GitHub milestone
1.0.0-beta.3.
| Candidate id | GitHub issue | Owner | Role |
|---|---|---|---|
| B3-DL-00 | #606 | Adrian | Parent tracker |
| B3-FT-00 | #607 | Adrian | Parent tracker |
| B3-PKG-00 | #608 | Rene | Parent tracker |
| B3-DOC-00 | #609 | Rene | Parent tracker |
| B3-DL-01 | #610 | Adrian | Design lock |
| B3-DL-02 | #611 | Adrian | Design lock |
| B3-DL-03 | #612 | Adrian | Design lock |
| B3-DL-04 | #613 | Adrian | Design lock |
| B3-DL-05 | #614 | Adrian | Design lock |
| B3-DL-06 | #615 | Rene | Design lock |
| B3-DL-07 | #616 | Adrian | Design lock |
| B3-DL-08 | #617 | Peter | Design lock |
| B3-DL-09 | #618 | Adrian | Design lock |
| B3-DL-10 | #619 | Adrian | Design lock |
| B3-DL-11 | #620 | Adrian | Design lock, high risk |
| B3-DL-12 | #621 | Adrian | Design lock |
| B3-F-06 | #622 | Peter | Foundation starter |
| B3-F-13 | #623 | Rene | Foundation starter |
| B3-F-14 | #624 | Rene | Foundation starter |
| B3-F-15 | #625 | Rene | Foundation starter |
| B3-F-16 | #626 | Adrian | Foundation starter, high risk |
These principles should be turned into issue text, acceptance criteria, or design notes as the beta 3 issues are created.
The preprocessor is a first-class part of the toolchain.
Preprocessing should not be treated as text glue hidden before compilation. It needs explicit ownership, tests, diagnostics, source provenance, and a documented relationship to source files, generated source, and downstream compiler stages.
Source provenance is a release concern.
Errors, warnings, traces, generated code, preprocessed code, and RexxScript integration should preserve enough mapping information to report the right user source line. If exact mapping is not yet possible everywhere, beta 3 should document the known gaps and choose the next foundation slice.
RexxScript integration is a distinct development line, not Level C.
RexxScript should be treated as a modern, interpreted-only Rexx-family surface that primarily uses strings. It may later migrate toward a light Classic Rexx subset, and it should share BIF implementations with Classic Rexx / Level C where that is clean, but it is not the Level C compiler path.
Level C is compiled Classic Rexx through canonical AST lowering.
Level C should compile Classic Rexx by transforming the Level C parse/AST shape into the canonical compiler AST shape used by the normal validation, optimization, and emission pipeline. This is separate from RexxScript.
Classic Rexx support needs a deliberate value model.
Classic Rexx variables should be represented by a dedicated value class that owns the canonical string value and can cache derived forms such as integer, decimal, boolean, or binary where appropriate. The cache rules must preserve Classic Rexx semantics rather than leaking Level B type assumptions.
Classic Rexx variable pools are a first-class runtime abstraction.
A variable-pool class should model Classic Rexx variable lookup, assignment, stems, host-visible variable access, and any SAA/ADDRESS integration needs. BIFs and Level C work should use this abstraction instead of ad hoc maps.
Rexx BIFs should be curated for shared use where possible.
The beta 3 plan should identify a clean set of BIFs that can serve RexxScript and Classic Rexx / Level C where possible. The implementation should avoid bespoke conversions per BIF: RexxScript may call string-first BIF entry points, while Level C uses the Classic Rexx value class and variable pool where Classic semantics require them.
Level B classes should feel designed for Level B.
The Level B class library should be reviewed for Classic Rexx oddities, historical compatibility leftovers, confusing names, or APIs that are only there because of older implementation paths. Keep what supports Level B clearly; move Classic-oriented behavior toward the Level C/value-pool layer.
Plugins and exits need curation, not just cleanup.
Classify plugins, compiler exits, host exits, demos, and legacy integrations as core, integration, optional, deprecated, experimental, or remove. The default build and package contents should make that classification visible.
| Candidate id | Gate | Title | Owner | Type | Acceptance signal | Fallback |
|---|---|---|---|---|---|---|
| B3-DL-00 | Design lock | Beta 3 design lock tracker | Adrian | Parent | All design-lock decisions below are linked, assigned, and have explicit approve/defer outcomes by 2026-07-03. | Keep unresolved items out of beta 3 scope and record them as post-beta-3. |
| B3-FT-00 | Foundation | Beta 3 foundation tracker | Adrian | Parent | Foundation issues below have land/defer decisions, tests or design notes, and package/release-note status by 2026-07-31. | Defer incomplete foundation work with explicit known limitations. |
| B3-PKG-00 | Foundation | Beta 3 package shape tracker | Rene | Parent | ZIP fallback, macOS pkg, Linux deb hardening, and Windows NSIS status are known before beta 3 publication. | Ship portable ZIPs plus only proven installers. |
| B3-DOC-00 | Foundation | Beta 3 docs, demos, and release-note tracker | Rene | Parent | Demos, tutorials, known limitations, and beta 3 release notes match the shipped tag. | Ship fewer curated demos with clear limitations. |
| Candidate id | Title | Owner | Labels | Acceptance signal | Notes |
|---|---|---|---|---|---|
| B3-DL-01 | Define the preprocessor as a first-class toolchain concern | Adrian | beta3, design-lock, compiler, preprocessor |
Design note states ownership, supported inputs/outputs, source-provenance expectations, test strategy, and relationship to compiler stages. | Should include whether preprocessing is a separate stage, an rxc mode, or both. |
| B3-DL-02 | Define source mapping and diagnostics provenance contract | Adrian | beta3, design-lock, compiler, diagnostics |
Errors and warnings have a documented expectation for original source line mapping through preprocessing and generated code. | Cross-cuts preprocessor, RexxScript, parser mode, TRACE, and debug metadata. |
| B3-DL-03 | Define RexxScript integration strategy for beta 3 | Adrian | beta3, design-lock, rexxscript |
Design note identifies beta 3 RexxScript goal, integration points, out-of-scope items, and tests/demos. | RexxScript is not Level C; keep it separate from compiled Classic Rexx. |
| B3-DL-04 | Define Classic Rexx value class semantics | Adrian | beta3, design-lock, level-c, runtime |
Design note specifies canonical string ownership, cached numeric/binary forms, invalidation rules, comparison/conversion semantics, and memory ownership. | Foundation for Classic BIFs and variable pool. |
| B3-DL-05 | Define Classic Rexx variable pool model | Adrian | beta3, design-lock, level-c, runtime, saa |
Design note specifies lookup, assignment, stems, exposure, host-variable access, and SAA/ADDRESS interaction. | Should avoid coupling Level B class APIs to Classic variable behavior. |
| B3-DL-06 | Define shared Rexx BIF surface for RexxScript and Level C | Rene | beta3, design-lock, rexxscript, level-c, bifs |
Candidate BIF list is grouped by must/should/defer and identifies whether each BIF can share string-first and Classic value/pool entry points. | First slice should be useful for RexxScript demos and later Level C lowering. |
| B3-DL-07 | Define Level B class library design principles | Adrian | beta3, design-lock, level-b, library |
Principles identify what belongs in Level B classes, what should move to Classic/Level C support, and what compatibility oddities should be removed or deprecated. | Turns “clean class library” into reviewable guidance. |
| B3-DL-08 | Define plugin, exit, and integration classification policy | Peter | beta3, design-lock, plugins, exits |
Classification categories are approved and mapped to default build/package policy. | Covers plugins, compiler exits, host exits, demos, and legacy integrations. |
| B3-DL-09 | Define Level B versus Level G boundary | Adrian | beta3, design-lock, level-b, level-g |
Short design note states stable Level B contract and first Level G overlay scope. | Already in Release 1 plan; keep linked here. |
| B3-DL-10 | Define UTF/text ownership | Adrian | beta3, design-lock, unicode, level-b, level-g |
.string, .binary, VM codepoint baseline, and Level G Unicode ownership are agreed. |
Keep Classic Rexx value semantics separate from Level B .string. |
| B3-DL-11 | Define Level C canonical AST lowering milestone | Adrian | beta3, design-lock, level-c, compiler, high-risk |
Decide whether beta 3 includes a small compiled Classic Rexx proof by transforming Level C AST into the canonical compiler AST shape. | RexxScript is separate and should not be used as the Level C lowering proof. |
| B3-DL-12 | Decide GPU/threading Release 1 status | Adrian | beta3, design-lock, vm, initial |
Threading is initial, while GPU remains experimental, design-only or post-R1 as separately recorded. | Prevents accidental release commitment. |
| Candidate id | Title | Owner | Labels | Acceptance signal | Fallback |
|---|---|---|---|---|---|
| B3-F-01 | Add source-provenance foundation for preprocessor output | Adrian | beta3, foundation, compiler, preprocessor, diagnostics |
Minimal source map or provenance metadata exists with focused tests for mapped diagnostics. | Document unmapped diagnostics and keep preprocessing opt-in where needed. |
| B3-F-02 | Build RexxScript integration beta 3 slice | Adrian | beta3, foundation, rexxscript |
Agreed demo/test shows the selected interpreted RexxScript path and reports useful status/errors. | Ship design/demo only and move deeper integration post-beta-3. |
| B3-F-03 | Implement Classic Rexx value class prototype | Adrian | beta3, foundation, level-c, runtime |
Value class handles string canonical form plus selected cached conversions with tests. | Keep design note and defer BIF migration. |
| B3-F-04 | Implement Classic Rexx variable pool prototype | Adrian | beta3, foundation, level-c, runtime, saa |
Variable pool supports the agreed first lookup/assignment/stem behavior with tests. | Keep current ad hoc paths and mark Level C integration blocked. |
| B3-F-05 | Implement first shared Rexx BIF slice | Rene | beta3, foundation, rexxscript, level-c, bifs |
First curated BIF set has tests for RexxScript string-first use and a clear path to Classic value/pool use. | Publish BIF list and defer implementation. |
| B3-F-06 | Inventory and classify plugins and exits | Peter | beta3, foundation, plugins, exits |
Table lists each plugin/exit/demo as core, integration, optional, deprecated, experimental, or remove. | Docs-only classification if CMake/package changes are not ready. |
| B3-F-07 | Align default build/package set with plugin classification | Peter | beta3, foundation, plugins, packaging |
CMake/package defaults match approved classification and release docs. | Keep defaults but document optional/deprecated status clearly. |
| B3-F-08 | Review and curate Level B class library APIs | Adrian | beta3, foundation, level-b, library |
Review identifies keep/deprecate/remove/move decisions for Level B classes and tests. | Defer breaking changes until after Release 1 and document oddities. |
| B3-F-09 | Harden late load, relink, and class/interface rebinding | Adrian | beta3, foundation, vm, classes |
Tests cover current expected behavior for late load and rebinding. | Document unsupported cases and keep hot-path changes gated. |
| B3-F-10 | Replace hot-path linear lookup with indexed lookup | Adrian | beta3, foundation, vm, performance |
Method/factory lookup uses indexed search and preserves late-load correctness. | Keep current lookup and record performance risk. |
| B3-F-11 | Add large immutable constant foundation | Adrian | beta3, foundation, rxas, rxbin, vm |
RXAS/RXBIN/VM have tested minimum representation for approved constant structures. | Defer source sugar; keep only documented internal support. |
| B3-F-12 | Decide perfect-hash select implementation path |
Adrian | beta3, foundation, compiler, performance |
Static select optimization is either implemented with tests or explicitly deferred. | Keep current nested IF lowering. |
| B3-F-13 | Establish beta 3 performance baseline | Rene | beta3, foundation, performance, tests |
Baseline command set and recorded results exist before optimizer claims. | Ship without optimizer claims. |
| B3-F-14 | Validate beta 3 package shape | Rene | beta3, foundation, packaging, qa |
Asset list, signing status, install smoke tests, and known limitations are verified against tag assets. | Publish only proven package formats. |
| B3-F-15 | Curate beta 3 demos and tutorials | Rene | beta3, foundation, docs, demos |
Examples and tutorials match beta 3 capabilities and expected output. | Ship fewer demos with clear boundaries. |
| B3-F-16 | Prototype Level C canonical AST lowering proof | Adrian | beta3, foundation, level-c, compiler, high-risk |
A small Classic Rexx source slice transforms from Level C AST into canonical compiler AST and reaches the agreed downstream phase. | Keep Level C as parser/highlighter plus published lowering plan. |
| Candidate | Status | Evidence and remaining work |
|---|---|---|
| B3-F-09 | Implemented on develop |
Late-loaded interface providers are exercised through both VM variants and through the crexx driver. The driver test names exact contract/provider files; cross-platform QA remains. |
| B3-F-10 | Implemented on develop |
Method and factory registries are sorted after link/relink. Method dispatch uses binary search; factory dispatch binary-searches a provider bucket and caches provider signatures. See reports/runtime-interface-lookup.md. |
| B3-F-11 | Release 1 minimum implemented | Binary constants, typed binary-memory access, zero-copy comparison, and packed jump tables cover the approved internal/demo needs. Dedicated typed arrays and records are deferred. |
| B3-F-12 | Implemented on develop |
RXAS/VM packed jump tables and conservative compiler lowering are complete; arbitrary RXAS ladder recognition is an unscheduled CFG/dataflow roadmap item. |
| B3-F-13 | Open | The runtime lookup and jump-dispatch measurements are component evidence, not the central beta 3 benchmark baseline tracked by #623. |
Use this shape when converting candidates into GitHub issues:
## Purpose
Why this issue exists and what Release 1 or beta 3 risk it reduces.
## Guidance
How to approach the work, including boundaries and things not to do.
## Acceptance
- Concrete observable result.
- Tests, docs, or note updates expected.
- Fallback/defer decision if the work does not land.
## Notes
Link to the durable repo note, related issues, and important source paths.
Purpose:
Guidance:
docs/releases/v1.0.0-beta.3.md and
the relevant planning note.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
rxc mode, an internal
compiler phase, or some combination. Describe how preprocessed output should
be inspected by users and tests. Do not design new macro syntax unless it is
needed to settle architecture.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
.string and .binary APIs unless there is a deliberate bridge.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Id, KeyDB, and Os wrappers and their tests currently live under
lib/classlib but are not linked into classlib.rxbin; their final home and
Release 1 status should be decided through this triage, not as an incidental
source cleanup.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
.string as valid UTF-8 and .binary as arbitrary bytes unless a
design decision explicitly changes that. Decide which layer owns rich Unicode
behavior. Keep Classic Rexx value-string semantics separate from Level B
typed string guarantees.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Id, KeyDB, and Os classlib-adjacent wrappers as package/core
triage entries with their native dependencies and proposed destination.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
Acceptance:
select Implementation PathPurpose:
select optimization or stop carrying it as an
implied beta 3 promise.Guidance:
IF lowering remains the beta 3
behavior.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
develop. For each package,
record asset name, signing status, install command, smoke command, uninstall
or cleanup path, and known caveats. Use portable ZIPs as fallback if an
installer is unreliable.Acceptance:
Purpose:
Guidance:
Acceptance:
Purpose:
Guidance:
SAY, or a tiny IF if that is the agreed path. Keep source mapping visible
through the transformation. Do not depend on RexxScript for this proof.Acceptance: