;; 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] )