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:
@@ -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))
|
||||
)
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
)))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user