Unify scoped effects: scope as general primitive, provide as sugar
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 12m54s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 12m54s
- Add `scope` special form to eval.sx: (scope name body...) or (scope name :value v body...) — general dynamic scope primitive - `provide` becomes sugar: (provide name value body...) calls scope - Rename provide-push!/provide-pop! to scope-push!/scope-pop! throughout all adapters (async, dom, html, sx) and platform implementations - Update boundary.sx: Tier 5 now "Scoped effects" with scope-push!/ scope-pop! as primary, provide-push!/provide-pop! as aliases - Add scope form handling to async adapter and aser wire format - Update sx-browser.js, sx_ref.py (bootstrapped output) - Add scopes.sx docs page, update provide/spreads/demo docs - Update nav-data, page-functions, docs page definitions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -340,24 +340,27 @@
|
||||
(p "The path from current SX to the scope primitive follows the existing plan "
|
||||
"and adds two phases:")
|
||||
|
||||
(~docs/subsection :title "Phase 1: provide/context/emit! (immediate)"
|
||||
(p "Already planned. Implement render-time dynamic scope. Four primitives: "
|
||||
(~docs/subsection :title "Phase 1: provide/context/emit! ✓"
|
||||
(p (strong "Complete. ") "Render-time dynamic scope. Four primitives: "
|
||||
(code "provide") " (special form), " (code "context") ", " (code "emit!") ", "
|
||||
(code "emitted") ". Platform provides " (code "provide-push!/provide-pop!") ".")
|
||||
(p "This is " (code "scope") " with " (code ":propagation :render") " only. "
|
||||
"No change to islands or lakes. Pure addition.")
|
||||
(p (strong "Delivers: ") "render-time context, scoped accumulation, "
|
||||
"spread and collect reimplemented as sugar over provide/emit."))
|
||||
(code "emitted") ". Platform provides " (code "scope-push!/scope-pop!") ". "
|
||||
"Spreads reimplemented on provide/emit!.")
|
||||
(p "See "
|
||||
(a :href "/sx/(geography.(provide))" :class "text-violet-600 hover:underline" "provide article")
|
||||
" and "
|
||||
(a :href "/sx/(geography.(spreads))" :class "text-violet-600 hover:underline" "spreads article")
|
||||
"."))
|
||||
|
||||
(~docs/subsection :title "Phase 2: scope as the common form (next)"
|
||||
(p "Introduce " (code "scope") " as the general form. "
|
||||
(code "provide") " becomes sugar for " (code "(scope ... :propagation :render)") ". "
|
||||
(code "defisland") " becomes sugar for " (code "(scope ... :propagation :reactive)") ". "
|
||||
(code "lake") " becomes sugar for " (code "(scope ... :propagation :morph)") ".")
|
||||
(p "The sugar forms remain — nobody writes " (code "scope") " directly in page code. "
|
||||
"But the evaluator, adapters, and bootstrappers all dispatch through one mechanism.")
|
||||
(p (strong "Delivers: ") "unified internal representation, reactive context (the new cell), "
|
||||
"simplified adapter code (one scope handler instead of three separate paths)."))
|
||||
(~docs/subsection :title "Phase 2: scope as the common form ✓"
|
||||
(p (strong "Complete. ") (code "scope") " is now the general form. "
|
||||
(code "provide") " is sugar for " (code "(scope name :value v body...)") ". "
|
||||
(code "collect!") " creates a lazy root scope with deduplication. "
|
||||
"All adapters use " (code "scope-push!/scope-pop!") " directly.")
|
||||
(p "The unified platform structure:")
|
||||
(~docs/code :code (highlight "_scope_stacks = {} ;; {name: [{value, emitted: [], dedup: bool}]}" "python"))
|
||||
(p "See "
|
||||
(a :href "/sx/(geography.(scopes))" :class "text-violet-600 hover:underline" "scopes article")
|
||||
"."))
|
||||
|
||||
(~docs/subsection :title "Phase 3: effect handlers (future)"
|
||||
(p "Make propagation modes extensible. A " (code ":propagation") " value is a "
|
||||
@@ -437,8 +440,10 @@
|
||||
"and composable. It's the last primitive SX needs.")
|
||||
|
||||
(~docs/note
|
||||
(p (strong "Status: ") "Phase 1 (" (code "provide/context/emit!") ") is specced and "
|
||||
"ready to build. Phase 2 (" (code "scope") " unification) follows naturally once "
|
||||
"provide is working. Phase 3 (extensible handlers) is the research frontier — "
|
||||
(p (strong "Status: ") "Phase 1 (" (code "provide/context/emit!") ") and "
|
||||
"Phase 2 (" (code "scope") " unification) are complete. "
|
||||
"574 tests pass. All four adapters use " (code "scope-push!/scope-pop!") ". "
|
||||
(code "collect!") " is backed by lazy scopes with dedup. "
|
||||
"Phase 3 (extensible handlers) is the research frontier — "
|
||||
"it may turn out that three modes are sufficient, or it may turn out that "
|
||||
"user-defined modes unlock something unexpected.")))))
|
||||
|
||||
Reference in New Issue
Block a user