2cc47c557b
This commit updates the benchmark results for various examples. The benchmark times and repeat counts have been adjusted to reflect current performance characteristics.
53 lines
1.5 KiB
Plaintext
53 lines
1.5 KiB
Plaintext
;; Benchmark: 1.9us
|
|
;; Benchmark-Repeat: 1072
|
|
;; 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
|
|
(def b1 ((.deposit my-acc) 50)) ; balance is now 150
|
|
|
|
; 3. Call 'withdraw' method
|
|
(def b2 ((.withdraw my-acc) 20)) ; balance is now 130
|
|
|
|
; 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]
|
|
)
|