Skip to content

feat(lang): add for loop — range and list forms (V2 Tier 2c)#13

Merged
particlesector merged 1 commit into
mainfrom
feat/lang-for
Apr 22, 2026
Merged

feat(lang): add for loop — range and list forms (V2 Tier 2c)#13
particlesector merged 1 commit into
mainfrom
feat/lang-for

Conversation

@particlesector
Copy link
Copy Markdown
Owner

Enables iterative geometry in SCAD scripts:

for (i = [0:4]) translate([i10, 0, 0]) sphere(r=3);
for (i = [0:2:8]) translate([i
5, 0, 0]) cube([4,4,4]);
for (v = [1, 3, 7]) cylinder(h=v, r=2);

difference() {
cube([60, 12, 12], center=true);
for (i = [0:4]) translate([-24+i*12, 0, 0]) cylinder(h=20, r=3);
}

Changes:

  • Token.h: For, Colon token kinds
  • Lexer.cpp: "for" keyword, ':' operator
  • AST.h: ForRange (isRange/start/step/end/list), ForNode; added to AstNode variant with makeFor() helper
  • Parser.h/cpp: parseFor() — parses [start:end], [start:step:end], and [v0,v1,...] forms; disambiguates on first ':' vs ','
  • Interpreter.h/cpp: getVar()/setVar() for loop variable binding
  • CsgEvaluator.h/cpp: evalFor() — builds value sequence, binds loop var in interpreter, collects geometry from each iteration, unions all results; saves/restores outer variable binding; safety cap of 10000 iterations; empty range → nullptr
  • Tests: 13 new tests across lexer, parser, and CSG evaluator (121 total, 688 assertions)
  • tests/for_test.scad: 6 visual scenes including nested for loops

Enables iterative geometry in SCAD scripts:

  for (i = [0:4])      translate([i*10, 0, 0]) sphere(r=3);
  for (i = [0:2:8])    translate([i*5,  0, 0]) cube([4,4,4]);
  for (v = [1, 3, 7])  cylinder(h=v, r=2);

  difference() {
    cube([60, 12, 12], center=true);
    for (i = [0:4]) translate([-24+i*12, 0, 0]) cylinder(h=20, r=3);
  }

Changes:
- Token.h: For, Colon token kinds
- Lexer.cpp: "for" keyword, ':' operator
- AST.h: ForRange (isRange/start/step/end/list), ForNode;
  added to AstNode variant with makeFor() helper
- Parser.h/cpp: parseFor() — parses [start:end], [start:step:end],
  and [v0,v1,...] forms; disambiguates on first ':' vs ','
- Interpreter.h/cpp: getVar()/setVar() for loop variable binding
- CsgEvaluator.h/cpp: evalFor() — builds value sequence, binds
  loop var in interpreter, collects geometry from each iteration,
  unions all results; saves/restores outer variable binding;
  safety cap of 10000 iterations; empty range → nullptr
- Tests: 13 new tests across lexer, parser, and CSG evaluator
  (121 total, 688 assertions)
- tests/for_test.scad: 6 visual scenes including nested for loops

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@particlesector particlesector merged commit 8d81359 into main Apr 22, 2026
4 checks passed
@particlesector particlesector deleted the feat/lang-for branch April 22, 2026 05:52
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.

2 participants