Add sorting support to the List module across all backends:
- List.sort for natural ordering (Int, Float, String, Bool, Char)
- List.sortBy for custom comparator-based sorting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- WISH-008: `and`/`or` as aliases for `&&`/`||` boolean operators
- WISH-006: `handle` as alias for `run ... with` (same AST output)
- WISH-005: `--watch` flag for `lux compile` recompiles on file change
- WISH-009: Tree-shake unused runtime sections from JS output based on
which effects are actually used (Console, Random, Time, Http, Dom)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- JS backend: Add Int/Float module dispatch in both Call and EffectOp paths
for toFloat, toInt, and toString operations
- C backend: Fix lux_strdup → lux_string_dup in Map module codegen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Map<String, V> as a first-class built-in type for key-value storage,
needed for self-hosting the compiler (parser/typechecker/interpreter all
rely heavily on hashmaps).
- types.rs: Type::Map(K,V) variant, all match arms (unify, apply, etc.)
- interpreter.rs: Value::Map, 12 BuiltinFn variants (new/set/get/contains/
remove/keys/values/size/isEmpty/fromList/toList/merge), immutable semantics
- typechecker.rs: Map<K,V> resolution in resolve_type
- js_backend.rs: Map as JS Map with emit_map_operation()
- c_backend.rs: LuxMap struct (linear-scan), runtime fns, emit_map_operation()
- main.rs: 12 tests covering all Map operations
- validate.sh: now checks all projects/ directories too
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three related bugs fixed:
- BUG-009: let bindings inside lambdas hoisted to top-level
- BUG-011: match expressions inside lambdas hoisted to top-level
- BUG-012: variable name deduplication leaked across function scopes
Root cause: emit_expr() uses writeln() for statements, but lambdas
captured only the return value, not the emitted statements. Also,
var_substitutions from emit_function() leaked to subsequent code.
Fix: Lambda handler now captures all output emitted during body
evaluation and places it inside the function body. Both emit_function
and Lambda save/restore var_substitutions to prevent cross-scope leaks.
Lambda params are registered as identity substitutions to override any
outer bindings with the same name.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- JS backend now emits wildcard let bindings as side-effect statements
instead of const _ declarations, fixing SyntaxError on multiple let _ = ...
- Version string now uses env!("CARGO_PKG_VERSION") to auto-sync with Cargo.toml
- Add -lm linker flag for math library support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
BUG-004: Add ++ operator for string and list concatenation across all
backends (interpreter, C, JS) with type checking and formatting support.
BUG-001: Auto-invoke top-level `let main = fn () => ...` when main is
a zero-parameter function, instead of just printing the function value.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bare `print()` calls in Lux now emit `console.log()` in JS output
instead of undefined `print()`. Fixes BUG-006.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tuple index: `pair.0`, `pair.1` syntax across parser, typechecker,
interpreter, C/JS backends, formatter, linter, and symbol table
- Multi-line function args: allow newlines inside argument lists
- Fix effect unification for callback parameters (empty expected
effects means "no constraint", not "must be pure")
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add full Dom effect: querySelector, createElement, addEventListener,
setAttribute, classList, styles, forms, scrolling, etc.
- Add Html module for type-safe HTML construction (Elm-style)
- Add TEA (The Elm Architecture) runtime for browser apps
- Add view dependency analysis for Svelte-style optimizations
- Support both browser and Node.js environments
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 2 of JS backend: implement effect handlers in runtime
Effects added:
- Console: print, readLine, readInt
- Random: int, bool, float
- Time: now, sleep
- Http: get, post, postJson (async with fetch)
Bug fixes:
- Fix if-else with blocks executing both branches (use if-else
statement instead of ternary for branches with statements)
- Fix main function being called twice when top-level let binding
already invokes it
- Fix List module operations incorrectly treated as effect operations
New tests:
- test_js_random_int
- test_js_random_bool
- test_js_random_float
- test_js_time_now
All 19 JS backend tests pass.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add 10 integration tests that compile Lux to JavaScript and verify
correct execution in Node.js:
- test_js_factorial: Recursion and effects
- test_js_fibonacci: Classic recursive algorithm
- test_js_adt_and_pattern_matching: Custom ADTs with match
- test_js_option_type: Built-in Option type handling
- test_js_closures: Closure creation and variable capture
- test_js_higher_order_functions: Functions as values
- test_js_list_operations: List.map, List.foldl
- test_js_pipe_operator: Pipe (|>) operator
- test_js_records: Record literal and field access
- test_js_string_concatenation: String operations
Also fix List module operations being incorrectly treated as effects
by adding special-case handling in EffectOp emission.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>