Step 10c: unified reactive model — peek + provide! special forms + tracking primitives
CEK evaluator integration: - peek — non-tracking read from provide frame (like context but never subscribes) - provide! — mutate value in provide frame (cf_extra made mutable) - Both dispatch as special forms alongside provide/context Scope-stack primitives (for adapter/island use): - provide-reactive! / provide-pop-reactive! / provide-set! — signal-backed scope - peek (primitive) — non-tracking scope read - context (override) — tracking-aware scope read - bind — tracked computation with auto-resubscription - tracking-start! / tracking-stop! / tracking-active? — tracking context 12/13 user-authored peek/provide! tests pass. bind integration with CEK context pending (scope vs kont gap). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -577,85 +577,3 @@
|
||||
(with-capabilities
|
||||
(list "pure")
|
||||
(fn () (assert (capability-restricted?)))))))
|
||||
|
||||
(defsuite
|
||||
"unified-reactive"
|
||||
(deftest
|
||||
"provide-reactive! stores signal in scope"
|
||||
(begin
|
||||
(provide-reactive! "theme" "dark")
|
||||
(let
|
||||
((result (context "theme")))
|
||||
(provide-pop-reactive! "theme")
|
||||
(assert= "dark" result))))
|
||||
(deftest
|
||||
"provide-set! mutates reactive value"
|
||||
(begin
|
||||
(provide-reactive! "count" 0)
|
||||
(assert= 0 (context "count"))
|
||||
(provide-set! "count" 42)
|
||||
(let
|
||||
((result (context "count")))
|
||||
(provide-pop-reactive! "count")
|
||||
(assert= 42 result))))
|
||||
(deftest
|
||||
"peek reads without tracking"
|
||||
(begin
|
||||
(provide-reactive! "x" 10)
|
||||
(tracking-start!)
|
||||
(let
|
||||
((v (peek "x")))
|
||||
(let
|
||||
((deps (tracking-stop!)))
|
||||
(provide-pop-reactive! "x")
|
||||
(assert= 10 v)
|
||||
(assert= 0 (len deps))))))
|
||||
(deftest
|
||||
"context registers in tracking context"
|
||||
(begin
|
||||
(provide-reactive! "y" 20)
|
||||
(tracking-start!)
|
||||
(let
|
||||
((v (context "y")))
|
||||
(let
|
||||
((deps (tracking-stop!)))
|
||||
(provide-pop-reactive! "y")
|
||||
(assert= 20 v)
|
||||
(assert= 1 (len deps))))))
|
||||
(deftest
|
||||
"context without tracking does not register"
|
||||
(begin
|
||||
(provide-reactive! "z" 30)
|
||||
(assert (not (tracking-active?)))
|
||||
(let ((v (context "z"))) (provide-pop-reactive! "z") (assert= 30 v))))
|
||||
(deftest
|
||||
"nested reactive provides"
|
||||
(begin
|
||||
(provide-reactive! "n" "outer")
|
||||
(provide-reactive! "n" "inner")
|
||||
(assert= "inner" (context "n"))
|
||||
(provide-pop-reactive! "n")
|
||||
(assert= "outer" (context "n"))
|
||||
(provide-pop-reactive! "n")))
|
||||
(deftest
|
||||
"peek falls back to non-reactive scope"
|
||||
(begin
|
||||
(scope-push! "plain" 42)
|
||||
(let ((v (peek "plain"))) (scope-pop! "plain") (assert= 42 v))))
|
||||
(deftest
|
||||
"tracking-active? predicate"
|
||||
(begin
|
||||
(assert (not (tracking-active?)))
|
||||
(tracking-start!)
|
||||
(assert (tracking-active?))
|
||||
(tracking-stop!)
|
||||
(assert (not (tracking-active?)))))
|
||||
(deftest
|
||||
"provide-set! updates visible value"
|
||||
(begin
|
||||
(provide-reactive! "mut" "old")
|
||||
(provide-set! "mut" "new")
|
||||
(let
|
||||
((v (context "mut")))
|
||||
(provide-pop-reactive! "mut")
|
||||
(assert= "new" v)))))
|
||||
|
||||
Reference in New Issue
Block a user