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/dist/index.js +464 -337
- package/package.json +1 -1
- package/src/evaluator.js +47 -2
- package/src/parser.js +418 -336
package/package.json
CHANGED
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 {
|
|
411
|
-
|
|
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
|
|