Refactor: Implement block scoping and statement separation

This commit introduces fundamental changes to Myc's language structure
to enhance type safety and scoping clarity.

Key changes include:
- Introducing local scopes for `do` blocks.
- Separating statements (`def`, `assign`) from expressions, where
  statements now have no return value and are only allowed within
  blocks.
- A block now consists of multiple statements followed by a single final
  expression.
- Stricter validation rules are enforced, such as disallowing
  redefinition of local symbols in the same scope while allowing
  shadowing of outer symbols.
- Compiler errors are generated for statements used in expression
  contexts.

The implementation involved modifications to the AST, parser, binder
(scope-stack), and various compiler passes, along with VM runtime
optimizations.
This commit is contained in:
Michael Schimmel
2026-03-09 16:38:44 +01:00
parent 8339ee413e
commit beb693a068
26 changed files with 1057 additions and 948 deletions
+1 -2
View File
@@ -3,7 +3,6 @@
;; Output: 5
(do
(def y 1)
(macro m1 [x] `(do (def y 10) (assign y 4)))
(m1 8)
(macro m1 [x] `(do (def y 10) (assign y 4) y))(m1 8)
(+ y (m1 8))
)
+4 -5
View File
@@ -1,5 +1,5 @@
;; Benchmark: 1.4us
;; Benchmark-Repeat: 1473
;; Benchmark: 1.4us
;; Benchmark-Repeat: 1473
;; Output: [150 130 "Insufficient funds" 130]
; ---------------------------------------------------------
@@ -20,13 +20,12 @@
:balance (fn [] balance)
; Method: Deposit money
:deposit (fn [amount]
(assign balance (+ balance amount)))
:deposit (fn [amount] (do (assign balance (+ balance amount)) balance))
; Method: Withdraw money with validation
:withdraw (fn [amount]
(if (>= balance amount)
(assign balance (- balance amount))
(do (assign balance (- balance amount)) balance)
"Insufficient funds"))
}
)))
+1 -1
View File
@@ -8,7 +8,7 @@
;; Use our new generic create-ticker to pulse 3 times
(def cnt 3)
(def ticker (create-ticker (fn [] (> (assign cnt (- cnt 1)) -1))))
(def ticker (create-ticker (fn [] (do (assign cnt (- cnt 1)) (> cnt -1)))))
;; The candle generator reacting to the ticker
(def last-close 100.0)
+1 -1
View File
@@ -7,6 +7,6 @@
(def x (.start config))
(while (< x (.limit config))
(assign x (+ x (.step config))))
(do (assign x (+ x (.step config))) x))
x
)