ee89d2330d
This commit introduces support for comments within the AST nodes. Comments are now parsed by the lexer and stored within the `Token` struct. These comments are then propagated through various compiler phases, including the `Node` struct, ensuring they are preserved in the Abstract Syntax Tree. This change enhances the AST's ability to retain source code information, which can be valuable for debugging and analysis.
55 lines
1.6 KiB
Plaintext
55 lines
1.6 KiB
Plaintext
;; Benchmark: 1.2us
|
|
;; Benchmark-Repeat: 1731
|
|
;; Output: [150 130 "Insufficient funds" 130]
|
|
|
|
; ---------------------------------------------------------
|
|
; Object-Oriented Records Example
|
|
; ---------------------------------------------------------
|
|
; This showcase treats a record as an object by storing
|
|
; closures that capture private state.
|
|
|
|
(do
|
|
; A factory function (Constructor) for a BankAccount object
|
|
(def make-account (fn [initial-balance]
|
|
(do
|
|
; 'balance' is a captured parameter, acting as private state
|
|
(def balance initial-balance)
|
|
|
|
{
|
|
; Method: Get current balance
|
|
:balance (fn [] balance)
|
|
|
|
; Method: Deposit money
|
|
:deposit (fn [amount]
|
|
(assign balance (+ balance amount)))
|
|
|
|
; Method: Withdraw money with validation
|
|
:withdraw (fn [amount]
|
|
(if (>= balance amount)
|
|
(assign balance (- balance amount))
|
|
"Insufficient funds"))
|
|
}
|
|
)))
|
|
|
|
; 1. Create an instance
|
|
(def my-acc (make-account 100))
|
|
|
|
; 2. Call 'deposit' method
|
|
; Note the double parens: (.deposit my-acc) gets the function, then we call it
|
|
; balance is now 150
|
|
(def b1 ((.deposit my-acc) 50))
|
|
|
|
; 3. Call 'withdraw' method
|
|
; balance is now 130
|
|
(def b2 ((.withdraw my-acc) 20))
|
|
|
|
; 4. Call 'withdraw' with invalid amount
|
|
(def error-msg ((.withdraw my-acc) 1000))
|
|
|
|
; 5. Call 'balance' getter
|
|
(def final-balance ((.balance my-acc)))
|
|
|
|
; Return summary of operations
|
|
[b1 b2 error-msg final-balance]
|
|
)
|