@lango-project/lango-js 0.0.0-stage → 0.1.1

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/README.md CHANGED
@@ -1,3 +1,901 @@
1
- # Temporary Holding Version
1
+ # Lango
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Lango is a JavaScript-transpiling language designed for readable, pragmatic
4
+ programs. Its language decisions are in `design/`.
5
+
6
+ ## Faz 1
7
+
8
+ Faz 1 is the first executable vertical slice. It compiles the
9
+ `examples/002-main-branch` program and supports:
10
+
11
+ - separate `export main(args)` header followed by `main(args)`
12
+ - local assignments
13
+ - `if` / `else`
14
+ - numeric `>` conditions
15
+ - `.length` and numeric array indexing
16
+ - string interpolation
17
+ - explicit `_(...)` localization
18
+ - `println(...)`
19
+
20
+ Build a source file with:
21
+
22
+ ```sh
23
+ npm run build -- examples/002-main-branch/input.lango --out /tmp/lango/main.mjs
24
+ ```
25
+
26
+ Decimal division can be configured per build with enum-style rounding names:
27
+
28
+ ```sh
29
+ npm run build -- input.lango --out main.mjs --decimal-division-scale 2 --decimal-division-rounding HalfUp
30
+ ```
31
+
32
+ The build writes the generated module, an external source-map file, and its
33
+ private `.lango/runtime.mjs` beside the output. Run the current checks with:
34
+
35
+ ```sh
36
+ npm test
37
+ ```
38
+
39
+ Create a new application project with:
40
+
41
+ ```sh
42
+ npx @lango-project/lango-js init hello-lango
43
+ cd hello-lango
44
+ npm install
45
+ npm run run
46
+ ```
47
+
48
+ The generated project includes source and test files, npm scripts, and VS Code
49
+ settings that recommend the Lango extension when it becomes available.
50
+
51
+ Faz 1 deliberately rejects all syntax outside this vertical slice. It is the
52
+ base for progressively implementing the accepted language decisions rather than
53
+ a claim of full-language support.
54
+
55
+ Run a program directly with its Lango arguments after `--`:
56
+
57
+ ```sh
58
+ npm run run -- examples/002-main-branch/input.lango Ada
59
+ ```
60
+
61
+ For the built-in SQLite adapter, opt in with a database file:
62
+
63
+ ```sh
64
+ npm run run -- input.lango --database app.sqlite -- Ada
65
+ ```
66
+
67
+ An optional JSON translation catalog is passed to the runtime with `--catalog`:
68
+
69
+ ```sh
70
+ npm run run -- input.lango --catalog tr.json
71
+ ```
72
+
73
+ The same `--database` and `--catalog` options are available to `npm run
74
+ test:lango -- input.lango` when Lango test blocks need host services.
75
+
76
+ ### Embedding a generated program
77
+
78
+ `buildFile()` writes a matched private runtime next to the generated module.
79
+ Before calling exported Lango entry points, import that runtime and configure
80
+ it. `configure()` accepts an object with optional `output`, `catalog`, and
81
+ `database_adapter` values; it returns `null`, resets dynamic context and
82
+ transaction-failure state, and rejects an invalid configuration with
83
+ `RuntimeConfigurationError`. `output` is a function (or `null`), `catalog` is
84
+ a non-array object, and `database_adapter` is an object (or `null`).
85
+
86
+ ```js
87
+ const runtime = await import("./.lango/runtime.mjs");
88
+ const program = await import("./main.mjs");
89
+
90
+ runtime.configure({
91
+ output: (value) => console.log(value),
92
+ catalog: { Hello: "Merhaba" },
93
+ database_adapter: null,
94
+ });
95
+ await program.main(["Ada"]);
96
+ ```
97
+
98
+ The emitted runtime is tied to that build output; hosts must configure this
99
+ private sibling module, not a separately installed runtime package.
100
+
101
+ ## Faz 2
102
+
103
+ Faz 2 adds same-module functions, `return`, calls with arity validation,
104
+ Boolean/null literals, and numeric `+`, `-`, `*`, `/`, `%`, `**`, `>`, `==`, and `!=` expressions.
105
+ See `examples/003-functions`.
106
+
107
+ ## Faz 3
108
+
109
+ Faz 3 adds `loop while`, `<`, `break`, `continue`, and `name++`. See
110
+ `examples/004-loops`.
111
+
112
+ ## Faz 4
113
+
114
+ Faz 4 adds single-line array literals, `for values as value`, and `Array#add()`.
115
+ See `examples/005-arrays`.
116
+
117
+ ## Faz 5
118
+
119
+ Faz 5 adds multiline object literals, dot access, and `for object as key: value`.
120
+ See `examples/006-objects`.
121
+
122
+ ## Faz 10
123
+
124
+ Faz 10 adds a class-level `properties` section. Declared `@property` names are
125
+ emitted as JavaScript public fields; other `@property` names remain JavaScript
126
+ private `#fields`. See `examples/010-public-properties`.
127
+
128
+ ## Faz 11
129
+
130
+ Faz 11 adds initialized class-level values through a `static` section. They are
131
+ read as `Class.Name` outside the class and as `@@Name` in instance methods. See
132
+ `examples/011-static-values`.
133
+
134
+ ## Faz 12
135
+
136
+ Faz 12 adds the readonly `enum` class section. Its values are accessed like
137
+ static values, but an assignment through `@@Name` is a compiler error. See
138
+ `examples/012-enum-values`.
139
+
140
+ ## Faz 13
141
+
142
+ Faz 13 adds single inheritance with `class Child : Parent`, `super(...)`, and
143
+ `super.method(...)`. See `examples/013-inheritance`.
144
+
145
+ ## Faz 14
146
+
147
+ Faz 14 adds direct imports of exported Lango classes with `class Name` in an
148
+ import header. See `examples/014-class-modules`.
149
+
150
+ ## Faz 15
151
+
152
+ Faz 15 adds protected instance properties with `_name`, accessible from a class
153
+ and its descendants but not through Lango external member access. See
154
+ `examples/015-protected-properties`.
155
+
156
+ ## Faz 16
157
+
158
+ Faz 16 adds static methods with `Class::method()` and calls such as
159
+ `Class.method()`. See `examples/016-static-methods`.
160
+
161
+ ## Faz 17
162
+
163
+ Faz 17 adds class-import aliases with `alias Local = class Exported`. See
164
+ `examples/017-class-import-alias`.
165
+
166
+ ## Faz 18
167
+
168
+ Faz 18 adds class API declarations. Listed `methods` are public instance
169
+ methods; listed `static` methods are public static methods. Other implementations compile to JavaScript
170
+ private methods. See `examples/018-public-methods`.
171
+
172
+ ## Faz 19
173
+
174
+ Faz 19 adds value and condition-only `switch` with grouped non-fallthrough
175
+ cases. See `examples/019-switch`.
176
+
177
+ ## Faz 20
178
+
179
+ Faz 20 makes Lango's sole equality spelling, `==`, compile to JavaScript strict
180
+ equality. See `examples/020-strict-equality`.
181
+
182
+ ## Faz 21
183
+
184
+ Faz 21 adds `not`, `and`, and `or` logical aliases. See
185
+ `examples/021-logical-operators`.
186
+
187
+ ## Faz 22
188
+
189
+ Faz 22 adds decimal, scientific, and hexadecimal number literals. See
190
+ `examples/022-number-literals`.
191
+
192
+ ## Faz 23
193
+
194
+ Faz 23 adds variable-index and string-key bracket access. See
195
+ `examples/023-bracket-access`.
196
+
197
+ ## Faz 24
198
+
199
+ Faz 24 adds value-free `return`. See `examples/024-empty-return`.
200
+
201
+ ## Faz 25
202
+
203
+ Faz 25 adds nested dot access such as `order.customer.name`. See
204
+ `examples/025-nested-access`.
205
+
206
+ ## Faz 26
207
+
208
+ Faz 26 adds nested multiline object literals. See
209
+ `examples/026-nested-objects`.
210
+
211
+ ## Faz 27
212
+
213
+ Faz 27 adds standalone function-call statements such as `finish()`.
214
+
215
+ ## Faz 28
216
+
217
+ Faz 28 adds local closures with an explicit `capture` header. See
218
+ `examples/028-closures`.
219
+
220
+ ## Faz 29
221
+
222
+ Faz 29 makes closure capture declarations meaningful: an outer binding must be
223
+ captured, a capture must be used, and local captures must be assigned before
224
+ the closure is created.
225
+
226
+ ## Faz 30
227
+
228
+ Faz 30 permits a function to return a closure directly. See
229
+ `examples/030-returned-closures`.
230
+
231
+ ## Faz 31
232
+
233
+ Faz 31 makes an explicit `capture @property` retain the original class
234
+ instance in a returned closure. See `examples/031-property-capture`.
235
+
236
+ ## Faz 32
237
+
238
+ Faz 32 verifies nested closures: each closure declares its own direct capture,
239
+ while the captured binding remains shared. See `examples/032-nested-closures`.
240
+
241
+ ## Faz 33
242
+
243
+ Faz 33 validates captured instance and static properties against the enclosing
244
+ class, and rejects property captures outside class methods.
245
+
246
+ ## Faz 34
247
+
248
+ Faz 34 verifies static-property capture and rejects malformed or duplicate
249
+ capture declarations. See `examples/034-static-capture`.
250
+
251
+ ## Faz 35
252
+
253
+ Faz 35 extends explicit closure capture to protected properties. See
254
+ `examples/035-protected-capture`.
255
+
256
+ ## Faz 36
257
+
258
+ Faz 36 preserves a captured local as one shared, mutable binding rather than a
259
+ new closure-local variable. See `examples/036-shared-capture`.
260
+
261
+ ## Faz 37
262
+
263
+ Faz 37 adds synchronous, dynamically scoped `context` bindings. See
264
+ `examples/037-context`.
265
+
266
+ ## Faz 38
267
+
268
+ Faz 38 verifies nested context shadowing and restoration on function return.
269
+ See `examples/038-context-restoration`.
270
+
271
+ ## Faz 39
272
+
273
+ Faz 39 makes declared context bindings available in class methods. See
274
+ `examples/039-class-context`.
275
+
276
+ ## Faz 40
277
+
278
+ Faz 40 gives closures their own explicit context declarations. See
279
+ `examples/040-closure-context`.
280
+
281
+ ## Faz 41
282
+
283
+ Faz 41 adds mutable file globals with explicit per-function access
284
+ declarations. See `examples/041-globals`.
285
+
286
+ ## Faz 42
287
+
288
+ Faz 42 requires closures to declare globals explicitly before using them. See
289
+ `examples/042-closure-global`.
290
+
291
+ ## Faz 43
292
+
293
+ Faz 43 adds standard `from_json()` and `to_json()` helpers. See
294
+ `examples/043-json`.
295
+
296
+ ## Faz 44
297
+
298
+ Faz 44 checks JSON-helper arity and reports malformed input as `JsonParseError`.
299
+
300
+ ## Faz 45
301
+
302
+ Faz 45 adds `get_class()` and `is_kindof()` reflection helpers. See
303
+ `examples/045-reflection`.
304
+
305
+ ## Faz 46
306
+
307
+ Faz 46 adds explicit standard-library predicates for number, string, Boolean,
308
+ object, and array values. See `examples/046-predicates`.
309
+
310
+ ## Faz 47
311
+
312
+ Faz 47 requires Boolean values for conditions and logical operators instead of
313
+ using JavaScript truthiness. See `examples/047-boolean-conditions`.
314
+
315
+ ## Faz 48
316
+
317
+ Faz 48 adds `loop until` and unqualified `loop` forms. See
318
+ `examples/048-loop-until`.
319
+
320
+ ## Faz 49
321
+
322
+ Faz 49 lets `array.add(value)` be used as an expression and preserves its new
323
+ length result. See `examples/049-array-add-return`.
324
+
325
+ ## Faz 50
326
+
327
+ Faz 50 adds `run <input.lango> [args...]` to the CLI for programs that export
328
+ `main(args)`.
329
+
330
+ ## Faz 51
331
+
332
+ Faz 51 adds validated `break N` and `continue N` for nested loops. See
333
+ `examples/051-loop-levels`.
334
+
335
+ ## Faz 52
336
+
337
+ Faz 52 adds discoverable `test` blocks and `assert` statements. Production
338
+ builds omit them; `npm run test:lango -- <input.lango>` runs them synchronously.
339
+
340
+ ## Faz 53
341
+
342
+ Faz 53 resets dynamic context, file globals, and class static values before
343
+ each CLI-run Lango test.
344
+
345
+ ## Faz 54
346
+
347
+ Faz 54 rejects unknown instance, protected, and static property references in
348
+ class code.
349
+
350
+ ## Faz 55
351
+
352
+ Faz 55 validates that declared public instance and static method signatures
353
+ match their implementations.
354
+
355
+ ## Faz 56
356
+
357
+ Faz 56 rejects duplicate static member names across `static` values, `enum`
358
+ values, and public static methods.
359
+
360
+ ## Faz 57
361
+
362
+ Faz 57 rejects duplicate public instance members and duplicate class-method
363
+ implementations.
364
+
365
+ ## Faz 58
366
+
367
+ Faz 58 aligns statically known Lango calls with the default-parameter rule:
368
+ excess arguments are ignored, while every required parameter must receive its
369
+ own positional argument.
370
+
371
+ ## Faz 59
372
+
373
+ Faz 59 adds runtime arity checks for dynamically called Lango functions,
374
+ methods, and closures; excess arguments remain ignored.
375
+
376
+ ## Faz 60
377
+
378
+ Faz 60 applies compile-time arity validation to direct constructor and
379
+ statically known class-method calls.
380
+
381
+ ## Faz 61
382
+
383
+ Faz 61 normalizes JavaScript `undefined` at method boundaries and makes a
384
+ bare Lango `return` produce `null`.
385
+
386
+ ## Faz 62
387
+
388
+ Faz 62 normalizes missing JavaScript property and index reads, including known
389
+ but unassigned class properties, to Lango `null`.
390
+
391
+ ## Faz 63
392
+
393
+ Faz 63 rejects non-finite native-number arithmetic and JavaScript boundary
394
+ values with `NonFiniteNumber`.
395
+
396
+ ## Faz 64
397
+
398
+ Faz 64 rejects a numeric literal that would compile to a non-finite JavaScript
399
+ Number.
400
+
401
+ ## Faz 65
402
+
403
+ Faz 65 supports dynamic callback values and reports `NotCallable` for a
404
+ non-callable dynamic value.
405
+
406
+ ## Faz 66
407
+
408
+ Faz 66 permits calls through local dynamic bindings and reports `NotCallable`
409
+ when the bound value is not a function.
410
+
411
+ ## Faz 67
412
+
413
+ Faz 67 normalizes and validates JavaScript arguments at every Lango function
414
+ and method entry.
415
+
416
+ ## Faz 68
417
+
418
+ Faz 68 applies the same JavaScript-boundary normalization and validation to
419
+ Lango closures.
420
+
421
+ ## Faz 69
422
+
423
+ Faz 69 gives `to_json` Lango boundary semantics for nested `undefined`,
424
+ non-finite numbers, plain objects, and cycles.
425
+
426
+ ## Faz 70
427
+
428
+ Faz 70 adds header-only JavaScript namespace imports such as
429
+ `import js "node:path" as path`; their namespace cannot collide with a Lango
430
+ declaration.
431
+
432
+ ## Faz 71
433
+
434
+ Faz 71 lets closures explicitly capture JavaScript namespace imports and
435
+ resolves imported aliases by their local name.
436
+
437
+ ## Faz 72
438
+
439
+ Faz 72 adds aliased Lango function imports, for example
440
+ `alias sum = add(left, right)`.
441
+
442
+ ## Faz 73
443
+
444
+ Faz 73 verifies during a build that each selected Lango function or class is
445
+ actually exported by its target module.
446
+
447
+ ## Faz 74
448
+
449
+ Faz 74 rejects duplicate imported local names and import/declaration name
450
+ collisions.
451
+
452
+ ## Faz 75
453
+
454
+ Faz 75 validates direct calls to imported Lango functions against the signature
455
+ declared in the import header.
456
+
457
+ ## Faz 76
458
+
459
+ Faz 76 requires an imported Lango function signature to match its target
460
+ export.
461
+
462
+ ## Faz 77
463
+
464
+ Faz 77 rejects `@instance` and protected-property access from static class
465
+ methods.
466
+
467
+ ## Faz 78
468
+
469
+ Faz 78 allows qualified JavaScript construction such as
470
+ `new events/EventEmitter()` after a namespace import.
471
+
472
+ ## Faz 79
473
+
474
+ Faz 79 supports nested JavaScript namespace method calls such as
475
+ `fs/promises/readFile(...)`.
476
+
477
+ ## Faz 80
478
+
479
+ Faz 80 reserves slash-separated namespace paths for imported JavaScript
480
+ namespaces; object properties and methods remain dot-separated.
481
+
482
+ ## Faz 81
483
+
484
+ Faz 81 treats a JavaScript namespace itself as non-callable and reports
485
+ `NotCallable`.
486
+
487
+ ## Faz 105
488
+
489
+ Faz 105 adds the initial synchronous SQLite adapter and core transactions:
490
+ `start_trans()`, `commit_trans()`, `rollback_trans()`, and `trans_state()`.
491
+ Nested transactions join the outer physical transaction; an inner rollback
492
+ makes it rollback-only. See `examples/105-transactions`.
493
+
494
+ ## Faz 106
495
+
496
+ Faz 106 adds indented `SQL` query objects with statically declared named
497
+ parameters, `execute()`, `next()`, and current-row field access. See
498
+ `examples/106-sql-query`.
499
+
500
+ ## Faz 107
501
+
502
+ Faz 107 adds `affected_rows` and `generated_key` on executed SQL query
503
+ objects. See `examples/107-query-results`.
504
+
505
+ ## Faz 108
506
+
507
+ Faz 108 maps adapter failures to parameter-safe `SqlError` values with
508
+ `code`, `query`, and `position`. See `examples/108-sql-errors`.
509
+
510
+ ## Faz 109
511
+
512
+ Faz 109 requires the host to configure the one default database adapter;
513
+ unconfigured database work raises `DatabaseNotConfigured`. See
514
+ `examples/109-database-configuration`.
515
+
516
+ ## Faz 110
517
+
518
+ Faz 110 exposes an adapter-reported unusable transaction as `DB.Failed`; it
519
+ must be closed with `rollback_trans()`. See `examples/110-failed-transaction`.
520
+
521
+ ## Faz 111
522
+
523
+ Faz 111 supports SQL `returning` clauses as normal query rows. See
524
+ `examples/111-returning`.
525
+
526
+ ## Faz 112
527
+
528
+ Faz 112 binds Decimal SQL parameters as canonical text without narrowing them
529
+ to JavaScript numbers. See `examples/112-decimal-sql`.
530
+
531
+ ## Faz 113
532
+
533
+ Faz 113 keeps arithmetic assigned to a Decimal binding in Decimal precision.
534
+ See `examples/113-decimal-assignment`.
535
+
536
+ ## Faz 114
537
+
538
+ Faz 114 recognizes SQL parameters only outside quoted SQL text and comments.
539
+ See `examples/114-sql-parameters`.
540
+
541
+ ## Faz 115
542
+
543
+ Faz 115 adds deliberate raw `${expression}` interpolation to SQL literals,
544
+ separate from safe `:name` parameter binding. See `examples/115-sql-interpolation`.
545
+
546
+ ## Faz 116
547
+
548
+ Faz 116 recognizes PostgreSQL `::type` casts without treating a type name as a
549
+ SQL parameter. See `examples/116-postgres-casts`.
550
+
551
+ ## Faz 117
552
+
553
+ Faz 117 adds explicit Decimal literals such as `$10.50` and `$1e3`. See
554
+ `examples/117-decimal-literals`.
555
+
556
+ ## Faz 118
557
+
558
+ Faz 118 recognizes operators only at the current expression level, including
559
+ inside nested function arguments. See `examples/118-nested-expressions`.
560
+
561
+ ## Faz 119
562
+
563
+ Faz 119 preserves commas inside quoted and nested function arguments. See
564
+ `examples/119-nested-arguments`.
565
+
566
+ ## Faz 120
567
+
568
+ Faz 120 evaluates equal-precedence arithmetic chains from left to right. See
569
+ `examples/120-operator-order`.
570
+
571
+ ## Faz 121
572
+
573
+ Faz 121 adds parentheses for explicit expression grouping. See
574
+ `examples/121-parentheses`.
575
+
576
+ ## Faz 122
577
+
578
+ Faz 122 adds unary minus for native and Decimal values. See
579
+ `examples/122-negative-numbers`.
580
+
581
+ ## Faz 123
582
+
583
+ Faz 123 adds inclusive `<=` and `>=` comparisons. See
584
+ `examples/123-inclusive-comparisons`.
585
+
586
+ ## Faz 124
587
+
588
+ Faz 124 compares Decimal values without narrowing them to JavaScript numbers.
589
+ See `examples/124-decimal-comparisons`.
590
+
591
+ ## Faz 125
592
+
593
+ Faz 125 compares compound Decimal expressions with Decimal equality. See
594
+ `examples/125-decimal-equality`.
595
+
596
+ ## Faz 126
597
+
598
+ Faz 126 adds strict inequality with `!=`, including precision-safe Decimal
599
+ comparisons. See `examples/126-not-equal`.
600
+
601
+ ## Faz 127
602
+
603
+ Faz 127 adds the remainder operator `%` for native and Decimal numbers. See
604
+ `examples/127-remainder`.
605
+
606
+ ## Faz 128
607
+
608
+ Faz 128 adds right-associative exponentiation with `**` for native and Decimal
609
+ numbers. See `examples/128-exponentiation`.
610
+
611
+ ## Faz 129
612
+
613
+ Faz 129 evaluates arithmetic whose two operands are compound Decimal
614
+ expressions through the Decimal backend. See
615
+ `examples/129-compound-decimal-arithmetic`.
616
+
617
+ ## Faz 130
618
+
619
+ Faz 130 infers Decimal returns through nested compound arithmetic, while
620
+ keeping Decimal comparisons Boolean. See `examples/130-decimal-return-inference`.
621
+
622
+ ## Faz 131
623
+
624
+ Faz 131 adds null coalescing with `??`. See `examples/131-null-coalescing`.
625
+
626
+ ## Faz 132
627
+
628
+ Faz 132 adds array and string membership with `in`. See
629
+ `examples/132-membership`.
630
+
631
+ ## Faz 133
632
+
633
+ Faz 133 adds negated membership with `not in`. See
634
+ `examples/133-not-membership`.
635
+
636
+ ## Faz 134
637
+
638
+ Faz 134 extends membership to own object keys. See
639
+ `examples/134-object-membership`.
640
+
641
+ ## Faz 135
642
+
643
+ Faz 135 adds inline object literals. See `examples/135-inline-objects`.
644
+
645
+ ## Faz 136
646
+
647
+ Faz 136 adds quoted object keys. See `examples/136-quoted-object-keys`.
648
+
649
+ ## Faz 137
650
+
651
+ Faz 137 rejects duplicate object keys at compile time. See
652
+ `examples/137-duplicate-object-keys`.
653
+
654
+ ## Faz 138
655
+
656
+ Faz 138 infers Decimal function results through null coalescing. See
657
+ `examples/138-decimal-null-coalescing`.
658
+
659
+ ## Faz 140
660
+
661
+ Faz 140 adds membership support for host `Set` values. See
662
+ `examples/140-set-membership`.
663
+
664
+ ## Faz 141
665
+
666
+ Faz 141 adds key membership support for host `Map` values. See
667
+ `examples/141-map-membership`.
668
+
669
+ ## Faz 142
670
+
671
+ Faz 142 lets key-value loops iterate host `Map` values. See
672
+ `examples/142-map-iteration`.
673
+
674
+ ## Faz 143
675
+
676
+ Faz 143 adds null-safe property access with `?.`. See
677
+ `examples/143-optional-properties`.
678
+
679
+ ## Faz 144
680
+
681
+ Faz 144 adds null-safe indexed access with `?.[]`. See
682
+ `examples/144-optional-indexing`.
683
+
684
+ ## Faz 145
685
+
686
+ Faz 145 adds null-safe method calls with `?.`. See
687
+ `examples/145-optional-methods`.
688
+
689
+ ## Faz 146
690
+
691
+ Faz 146 adds computed index expressions. See
692
+ `examples/146-computed-indexing`.
693
+
694
+ ## Faz 147
695
+
696
+ Faz 147 adds chained index access. See `examples/147-chained-indexing`.
697
+
698
+ ## Faz 148
699
+
700
+ Faz 148 adds chained null-safe index access. See
701
+ `examples/148-optional-chained-indexing`.
702
+
703
+ ## Faz 149
704
+
705
+ Faz 149 adds property access and method calls after indexed values. See
706
+ `examples/149-indexed-members`.
707
+
708
+ ## Faz 150
709
+
710
+ Faz 150 adds property access and method calls after call results. See
711
+ `examples/150-call-result-members`.
712
+
713
+ ## Faz 151
714
+
715
+ Faz 151 adds index access after function and method results. See
716
+ `examples/151-call-result-indexing`.
717
+
718
+ ## Faz 152
719
+
720
+ Faz 152 adds chained safe access after call results. See
721
+ `examples/152-chained-call-result-access`.
722
+
723
+ ## Faz 153
724
+
725
+ Faz 153 adds compound numeric assignment and decrement. See
726
+ `examples/153-compound-assignment`.
727
+
728
+ ## Faz 154
729
+
730
+ Faz 154 adds postfix updates for properties and Decimal bindings. See
731
+ `examples/154-postfix-updates`.
732
+
733
+ ## Faz 155
734
+
735
+ Faz 155 adds indexed assignment and updates. See
736
+ `examples/155-indexed-assignment`.
737
+
738
+ ## Faz 156
739
+
740
+ Faz 156 adds multidimensional indexed updates. See
741
+ `examples/156-multidimensional-assignment`.
742
+
743
+ ## Faz 157
744
+
745
+ Faz 157 adds indexed updates for object-held collections. See
746
+ `examples/157-property-indexed-assignment`.
747
+
748
+ ## Faz 158
749
+
750
+ Faz 158 lets `for` loops use iterable expressions. See
751
+ `examples/158-iterable-expressions`.
752
+
753
+ ## Faz 159
754
+
755
+ Faz 159 adds numeric indexes for array key-value iteration. See
756
+ `examples/159-array-key-value-iteration`.
757
+
758
+ ## Faz 160
759
+
760
+ Faz 160 adds numeric code-point indexes for string key-value iteration. See
761
+ `examples/160-string-key-value-iteration`.
762
+
763
+ ## Faz 161
764
+
765
+ Faz 161 adds `key: value` iteration for host `Set` values. See
766
+ `examples/161-set-key-value-iteration`.
767
+
768
+ ## Faz 162
769
+
770
+ Faz 162 adds end-exclusive integer `range(start, end)` iteration. See
771
+ `examples/162-range`.
772
+
773
+ ## Faz 163
774
+
775
+ Faz 163 adds optional stepped and descending ranges. See
776
+ `examples/163-range-step`.
777
+
778
+ ## Faz 164
779
+
780
+ Faz 164 adds the zero-based `range(end)` shorthand. See
781
+ `examples/164-range-end`.
782
+
783
+ ## Faz 165
784
+
785
+ Faz 165 adds numeric `key: value` indexes for generic iterables. See
786
+ `examples/165-iterable-key-value-iteration`.
787
+
788
+ ## Faz 166
789
+
790
+ Faz 166 lets `Array#add()` work through properties and host-provided arrays. See
791
+ `examples/166-array-add-receivers`.
792
+
793
+ ## Faz 167
794
+
795
+ Faz 167 adds statement method calls after indexed and call-result values. See
796
+ `examples/167-chained-method-statements`.
797
+
798
+ ## Faz 168
799
+
800
+ Faz 168 lets `Array#add()` append multiple values in one call. See
801
+ `examples/168-array-add-multiple`.
802
+
803
+ ## Faz 169
804
+
805
+ Faz 169 adds `Array#remove(value)`, which removes the first matching value and
806
+ returns whether it was found. See `examples/169-array-remove`.
807
+
808
+ ## Faz 170
809
+
810
+ Faz 170 permits assigning results from method calls on indexed and call-result
811
+ values. See `examples/170-chained-method-expressions`.
812
+
813
+ ## Faz 171
814
+
815
+ Faz 171 adds `Array#clear()` for emptying local and host-provided arrays. See
816
+ `examples/171-array-clear`.
817
+
818
+ ## Faz 172
819
+
820
+ Faz 172 adds `Array#remove_at(index)` for removing a value at a zero-based
821
+ position. See `examples/172-array-remove-at`.
822
+
823
+ ## Faz 173
824
+
825
+ Faz 173 adds `Array#insert_at(index, value)` for inserting at a zero-based
826
+ position. See `examples/173-array-insert-at`.
827
+
828
+ ## Faz 174
829
+
830
+ Faz 174 adds `Array#remove_all(value)` for removing every matching value. See
831
+ `examples/174-array-remove-all`.
832
+
833
+ ## Faz 175
834
+
835
+ Faz 175 preserves null-safe optional access for array mutation helpers. See
836
+ `examples/175-optional-array-mutations`.
837
+
838
+ ## Faz 176
839
+
840
+ Faz 176 requires `to_js_number()` before a Decimal enters a direct host method
841
+ through `args`. See `examples/176-host-method-decimal`.
842
+
843
+ ## Faz 177
844
+
845
+ Faz 177 retains Decimal boundary checks when `fetch` is assigned to a local alias.
846
+ See `examples/177-host-function-alias-decimal`.
847
+
848
+ ## Faz 178
849
+
850
+ Faz 178 retains Decimal boundary checks when a host callable is read from `args`.
851
+ See `examples/178-host-property-alias-decimal`.
852
+
853
+ ## Faz 179
854
+
855
+ Faz 179 retains Decimal boundary checks through copied host callable aliases.
856
+ See `examples/179-host-alias-copy-decimal`.
857
+
858
+ ## Faz 180
859
+
860
+ Faz 180 retains Decimal boundary checks through definitely assigned host aliases.
861
+
862
+ ## Faz 181
863
+
864
+ Faz 181 retains Decimal boundary checks through host aliases assigned in `try`
865
+ and `catch` paths.
866
+
867
+ ## Faz 182
868
+
869
+ Faz 182 retains Decimal boundary checks through host aliases assigned in `finally`.
870
+ See `examples/182-host-alias-finally-decimal`.
871
+
872
+ ## Faz 183
873
+
874
+ Faz 183 clears host-alias tracking after reassignment to a Lango callable.
875
+ See `examples/183-host-alias-reassignment`.
876
+
877
+ ## Faz 184
878
+
879
+ Faz 184 avoids treating mixed host and Lango callable branches as definitely host.
880
+ See `examples/184-host-alias-mixed-branches`.
881
+
882
+ ## Faz 185–187
883
+
884
+ These phases retain Decimal boundary checks when a Lango function returns a
885
+ host callable, including transitive returns and host callables obtained from
886
+ `args`.
887
+
888
+ ## Faz 188–206
889
+
890
+ These phases extend path-sensitive definite-assignment analysis across
891
+ `switch`, loops, `try`/`catch`/`finally`, captures, update targets, callable
892
+ statements, methods, and Lango test bodies.
893
+
894
+ ## Faz 208
895
+
896
+ Faz 208 rejects dynamic JavaScript values in unary numeric negation unless they
897
+ are native finite numbers.
898
+
899
+ ## Faz 209
900
+
901
+ Faz 209 rejects dynamic non-numeric range bounds.