starlight-cli 1.0.33 → 1.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starlight-cli",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
4
4
  "description": "Starlight Programming Language CLI",
5
5
  "bin": {
6
6
  "starlight": "index.js"
package/src/evaluator.js CHANGED
@@ -404,11 +404,54 @@ async evalWhile(node, env) {
404
404
  }
405
405
 
406
406
  async evalFor(node, env) {
407
+ // --- Python-style for x in iterable ---
408
+ if (node.type === 'ForInStatement') {
409
+ const iterable = await this.evaluate(node.iterable, env);
410
+
411
+ if (iterable == null || typeof iterable !== 'object') {
412
+ throw new Error('Cannot iterate over non-iterable');
413
+ }
414
+
415
+ // Handle arrays
416
+ if (Array.isArray(iterable)) {
417
+ for (let i = 0; i < iterable.length; i++) {
418
+ const loopEnv = new Environment(env);
419
+ loopEnv.define(node.variable, iterable[i]);
420
+
421
+ try {
422
+ await this.evaluate(node.body, loopEnv);
423
+ } catch (e) {
424
+ if (e instanceof BreakSignal) break;
425
+ if (e instanceof ContinueSignal) continue;
426
+ throw e;
427
+ }
428
+ }
429
+ } else {
430
+ // Handle objects: iterate over keys
431
+ for (const key of Object.keys(iterable)) {
432
+ const loopEnv = new Environment(env);
433
+ loopEnv.define(node.variable, key);
434
+
435
+ try {
436
+ await this.evaluate(node.body, loopEnv);
437
+ } catch (e) {
438
+ if (e instanceof BreakSignal) break;
439
+ if (e instanceof ContinueSignal) continue;
440
+ throw e;
441
+ }
442
+ }
443
+ }
444
+
445
+ return null;
446
+ }
447
+
407
448
  const local = new Environment(env);
408
449
  if (node.init) await this.evaluate(node.init, local);
450
+
409
451
  while (!node.test || await this.evaluate(node.test, local)) {
410
- try { await this.evaluate(node.body, local); }
411
- catch (e) {
452
+ try {
453
+ await this.evaluate(node.body, local);
454
+ } catch (e) {
412
455
  if (e instanceof BreakSignal) break;
413
456
  if (e instanceof ContinueSignal) {
414
457
  if (node.update) await this.evaluate(node.update, local);
@@ -416,8 +459,10 @@ async evalFor(node, env) {
416
459
  }
417
460
  throw e;
418
461
  }
462
+
419
463
  if (node.update) await this.evaluate(node.update, local);
420
464
  }
465
+
421
466
  return null;
422
467
  }
423
468