Add scope-collected/scope-clear-collected!/scope-emitted primitives
Register hashtable-based scope accessors that bypass the CEK special form dispatch, for use by adapter-html.sx and shell templates. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1141,6 +1141,8 @@ PRIMITIVES_JS_MODULES: dict[str, str] = {
|
|||||||
PRIMITIVES["scope-emit!"] = scopeEmit;
|
PRIMITIVES["scope-emit!"] = scopeEmit;
|
||||||
PRIMITIVES["scope-peek"] = scopePeek;
|
PRIMITIVES["scope-peek"] = scopePeek;
|
||||||
PRIMITIVES["scope-emitted"] = sxEmitted;
|
PRIMITIVES["scope-emitted"] = sxEmitted;
|
||||||
|
PRIMITIVES["scope-collected"] = sxCollected;
|
||||||
|
PRIMITIVES["scope-clear-collected!"] = sxClearCollected;
|
||||||
|
|
||||||
// ---- VM stack primitives ----
|
// ---- VM stack primitives ----
|
||||||
// The VM spec (vm.sx) requires these array-like operations.
|
// The VM spec (vm.sx) requires these array-like operations.
|
||||||
|
|||||||
@@ -224,6 +224,23 @@ let () = Sx_primitives.register "scope-emitted" (fun args ->
|
|||||||
(match stack with List items :: _ -> List items | _ -> List [])
|
(match stack with List items :: _ -> List items | _ -> List [])
|
||||||
| _ -> List [])
|
| _ -> List [])
|
||||||
|
|
||||||
|
let () = Sx_primitives.register "scope-collected" (fun args ->
|
||||||
|
match args with
|
||||||
|
| [String name] ->
|
||||||
|
let stack = try Hashtbl.find _scope_stacks name with Not_found -> [] in
|
||||||
|
(match stack with List items :: _ -> List items | _ -> List [])
|
||||||
|
| _ -> List [])
|
||||||
|
|
||||||
|
let () = Sx_primitives.register "scope-clear-collected!" (fun args ->
|
||||||
|
match args with
|
||||||
|
| [String name] ->
|
||||||
|
let stack = try Hashtbl.find _scope_stacks name with Not_found -> [] in
|
||||||
|
(match stack with
|
||||||
|
| _ :: rest -> Hashtbl.replace _scope_stacks name (List [] :: rest)
|
||||||
|
| [] -> Hashtbl.replace _scope_stacks name [List []]);
|
||||||
|
Nil
|
||||||
|
| _ -> Nil)
|
||||||
|
|
||||||
let () = Sx_primitives.register "provide-push!" (fun args ->
|
let () = Sx_primitives.register "provide-push!" (fun args ->
|
||||||
match Sx_primitives.get_primitive "scope-push!" with
|
match Sx_primitives.get_primitive "scope-push!" with
|
||||||
| NativeFn (_, fn) -> fn args | _ -> Nil)
|
| NativeFn (_, fn) -> fn args | _ -> Nil)
|
||||||
|
|||||||
@@ -32,9 +32,7 @@
|
|||||||
(meta :name "csrf-token" :content csrf)
|
(meta :name "csrf-token" :content csrf)
|
||||||
(style :id "sx-css" (raw! (or sx-css "")))
|
(style :id "sx-css" (raw! (or sx-css "")))
|
||||||
;; CSSX rules from island SSR — must be in <head> so they survive
|
;; CSSX rules from island SSR — must be in <head> so they survive
|
||||||
;; #main-panel morphs during SPA navigation. Inline the flush logic
|
;; #main-panel morphs during SPA navigation.
|
||||||
;; rather than calling ~cssx/flush (which has :affinity :client and
|
|
||||||
;; gets skipped during SSR rendering).
|
|
||||||
(let ((cssx-rules (collected "cssx")))
|
(let ((cssx-rules (collected "cssx")))
|
||||||
(clear-collected! "cssx")
|
(clear-collected! "cssx")
|
||||||
(when (not (empty? cssx-rules))
|
(when (not (empty? cssx-rules))
|
||||||
|
|||||||
Reference in New Issue
Block a user