Skip to content

DVM v10 language: structured control flow, subroutines, arrays, mapkeys, Bool, Int, CONST (fixes #125) - #126

Open
liqdmetal wants to merge 1 commit into
DEROFDN:community-devfrom
liqdmetal:feat/dvm-language
Open

DVM v10 language: structured control flow, subroutines, arrays, mapkeys, Bool, Int, CONST (fixes #125)#126
liqdmetal wants to merge 1 commit into
DEROFDN:community-devfrom
liqdmetal:feat/dvm-language

Conversation

@liqdmetal

Copy link
Copy Markdown

Summary

One reviewable PR replacing seven stacked PRs (#101, #103, #107, #109, #111,
#115, #117).
The complete DVM v10 language: structured BASIC.

What's in it

Item Syntax What it gives
L1 FOR x = a TO b [STEP z] / NEXT, WHILE/WEND, block IF/ELSE/ENDIF structured loops replace GOTO spaghetti
L2 GOSUB <line> / RETURN shared helper reuse inside one contract
L3 DIM a(n) AS type, a[i], arrlen(a) list semantics + loops over arrays
L4 mapkeys() enumerate SC state keys (batch/paged contracts)
L6 DIM b AS Bool, TRUE/FALSE, &&/`
L7 CONST name = value immutable named constants
L8 enforced version gate new syntax hard-requires version("10.0.0")
L9 DIM i AS Int, negative literals, signed arithmetic signed 64-bit ints (deltas, negatives)

Design notes (why it's safe)

  • All gated >=10.0.0 — pre-fork contracts can never accidentally parse new
    syntax (gateControlFlow rejects versions without version()).
  • Arrays (*[]Variable), Bool, Int are Locals-only — never serialized to
    RamStore/storage, so the change is consensus-neutral on the state tree.
  • Variable.Array is a pointer so Variable stays comparable (it's a map key).
  • Block-IF coexists with the existing single-line IF THEN GOTO (untouched).
  • RETURN pops the CallStack when non-empty (subroutine return), otherwise
    the existing function-return semantics are unchanged.

Tests

14 files, 8 control-flow test suites (L1–L9) covering: FOR sum/step/nesting,
WHILE countdown, IF/ELSE both branches, nested GOSUB, array fill via loop +
get/set + arrlen, Bool logic + params, CONST immutability, Int negative
arithmetic, and version-gate rejection. Plus a wargame test.

Supersedes

Closes #101, #103, #107, #109, #111, #115, #117 in favour of this single
package.

…rrays, mapkeys, Bool, Int, CONST

The complete DVM-BASIC language expansion in one coherent package (gated
>=10.0.0), consolidated from the L-series:

L1  structured control flow — FOR/NEXT, WHILE/WEND, block IF/ELSE/ENDIF
L2  subroutines — GOSUB/RETURN (CallStack on the interpreter)
L3  RAM arrays — DIM a(n), a[i] get/set, arrlen() (Locals-only, consensus-neutral)
L4  mapkeys() — SC state key enumeration
L6  Bool type — TRUE/FALSE constants, && / || / !
L7  CONST — named immutable constants
L8  enforced version gate — every new keyword requires version("10.0.0")
L9  signed integers — Int type, negative literals, signed arithmetic

Backward compatible: all new syntax gated behind version("10.0.0"); a
contract at 1.2.3 (or no version call) is rejected from using it, so
pre-fork contracts are unaffected.

Tests: control_flow_test.go + l2/l3/l4/l6/l7/l9 (33 tests across the
suite), full dvm suite green.

Build manifest (go.mod/go.sum/prompt.go KickReader fix) included because
community-dev does not build from a fresh clone.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant