98deb8f3fe
The `eval` and `eval_observed` methods in the `VM` struct were very similar, with the primary difference being the call to the `VMObserver` trait. This commit refactors these methods into a single macro, `dispatch_eval!`, which reduces code duplication and improves maintainability. The `Value::TailCallRequest` variant was also updated to use `Box` for its contents, which helps keep the `Value` enum size consistent. Finally, the benchmarks in the `examples` directory have been updated to reflect minor performance changes resulting from these code modifications.
27 lines
731 B
Plaintext
27 lines
731 B
Plaintext
;; Benchmark: 25.9us
|
|
;; Output: 36
|
|
(do
|
|
;; Excessive capture test
|
|
;; This script creates deep nesting where the inner-most lambda
|
|
;; grabs variables from every single outer scope.
|
|
|
|
(def excessive (fn [v1]
|
|
(do
|
|
(def v2 2)
|
|
(fn [v3]
|
|
(do
|
|
(def v4 4)
|
|
(fn [v5]
|
|
(do
|
|
(def v6 6)
|
|
(fn [v7]
|
|
(do
|
|
(def v8 8)
|
|
;; v1, v3, v5, v7 are parameters (captured as upvalues)
|
|
;; v2, v4, v6, v8 are locals (captured from outer scopes)
|
|
(+ v1 v2 v3 v4 v5 v6 v7 v8))))))))))
|
|
|
|
;; Execution: (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8) = 36
|
|
((((excessive 1) 3) 5) 7)
|
|
)
|