f7cb6655af
Introduces type specialization for reactive pipeline nodes and their data buffers. This eliminates the overhead of generic `Value` enums and `SharedValueSeries` when dealing with known scalar or record types. The architecture shifts buffer instantiation from the VM to the runtime (RTL), leveraging type information from the AST. A new `out_type` field is added to `BoundKind::Pipe` to store the static type of the pipeline's output, determined by the type checker. This enables the creation of specialized `RingBuffer<T>` and `SharedRecordSeries` (for Struct-of-Arrays layout) when the output type is known, significantly improving memory usage and processing speed for time-series data, especially in financial analysis.
53 lines
1.5 KiB
Plaintext
53 lines
1.5 KiB
Plaintext
;; Benchmark: 1.6us
|
|
;; Benchmark-Repeat: 1233
|
|
;; 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]
|
|
)
|