Add client-side route matching so pure pages (no IO deps) can render instantly without a server roundtrip. Page metadata serialized as SX dict literals (not JSON) in <script type="text/sx-pages"> blocks. - New router.sx spec: route pattern parsing and matching (6 pure functions) - boot.sx: process page registry using SX parser at startup - orchestration.sx: intercept boost links for client routing with try-first/fallback — client attempts local eval, falls back to server - helpers.py: _build_pages_sx() serializes defpage metadata as SX - Routing analyzer demo page showing per-page client/server classification - 32 tests for Phase 2 IO detection (scan_io_refs, transitive_io_refs, compute_all_io_refs, component_pure?) + fallback/ref parity - 37 tests for Phase 3 router functions + page registry serialization - Fix bootstrap_py.py _emit_let cell variable initialization bug - Fix missing primitive aliases (split, length, merge) in bootstrap_py.py Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
418 lines
26 KiB
Plaintext
418 lines
26 KiB
Plaintext
;; Spec viewer components — display canonical SX specification source
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Architecture intro page
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~spec-architecture-content ()
|
|
(~doc-page :title "Spec Architecture"
|
|
(div :class "space-y-8"
|
|
|
|
(div :class "space-y-4"
|
|
(p :class "text-lg text-stone-600"
|
|
"SX is defined in SX. The canonical specification is a set of s-expression files that are both documentation and executable definition. Bootstrap compilers read these files to generate native implementations in JavaScript, Python, Rust, or any other target.")
|
|
(p :class "text-stone-600"
|
|
"The spec is split into two layers: a "
|
|
(strong "core") " that defines the language itself, and "
|
|
(strong "adapters") " that connect it to specific environments."))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Core")
|
|
(p :class "text-stone-600"
|
|
"The core is platform-independent. It defines how SX source is parsed, how expressions are evaluated, what primitives exist, and what shared rendering definitions all adapters use. These four files are the language.")
|
|
(div :class "overflow-x-auto rounded border border-stone-200"
|
|
(table :class "w-full text-left text-sm"
|
|
(thead (tr :class "border-b border-stone-200 bg-stone-100"
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "File")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Role")))
|
|
(tbody
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/parser" :class "hover:underline"
|
|
:sx-get "/specs/parser" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"parser.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Tokenization and parsing of SX source text into AST"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/evaluator" :class "hover:underline"
|
|
:sx-get "/specs/evaluator" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"eval.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Tree-walking evaluation of SX expressions"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/primitives" :class "hover:underline"
|
|
:sx-get "/specs/primitives" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"primitives.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "All built-in pure functions and their signatures"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/special-forms" :class "hover:underline"
|
|
:sx-get "/specs/special-forms" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"special-forms.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "All special forms — syntactic constructs with custom evaluation rules"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/renderer" :class "hover:underline"
|
|
:sx-get "/specs/renderer" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"render.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Shared rendering registries and utilities used by all adapters"))))))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Adapters")
|
|
(p :class "text-stone-600"
|
|
"Adapters are selectable rendering backends. Each one takes the same evaluated expression tree and produces output for a specific environment. You only need the adapters relevant to your target.")
|
|
(div :class "overflow-x-auto rounded border border-stone-200"
|
|
(table :class "w-full text-left text-sm"
|
|
(thead (tr :class "border-b border-stone-200 bg-stone-100"
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "File")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Output")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Environment")))
|
|
(tbody
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/adapter-dom" :class "hover:underline"
|
|
:sx-get "/specs/adapter-dom" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"adapter-dom.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Live DOM nodes")
|
|
(td :class "px-3 py-2 text-stone-500" "Browser"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/adapter-html" :class "hover:underline"
|
|
:sx-get "/specs/adapter-html" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"adapter-html.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "HTML strings")
|
|
(td :class "px-3 py-2 text-stone-500" "Server"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/adapter-sx" :class "hover:underline"
|
|
:sx-get "/specs/adapter-sx" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"adapter-sx.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "SX wire format")
|
|
(td :class "px-3 py-2 text-stone-500" "Server to client"))))))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Engine")
|
|
(p :class "text-stone-600"
|
|
"The engine is the browser-side fetch/swap/history system. It processes "
|
|
(code :class "text-violet-700 text-sm" "sx-*")
|
|
" attributes on elements to make HTTP requests, swap content, manage browser history, and handle events. It is split into two files: pure logic ("
|
|
(code :class "text-violet-700 text-sm" "engine.sx")
|
|
") and browser wiring ("
|
|
(code :class "text-violet-700 text-sm" "orchestration.sx")
|
|
").")
|
|
(div :class "overflow-x-auto rounded border border-stone-200"
|
|
(table :class "w-full text-left text-sm"
|
|
(thead (tr :class "border-b border-stone-200 bg-stone-100"
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "File")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Role")))
|
|
(tbody
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/engine" :class "hover:underline"
|
|
:sx-get "/specs/engine" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"engine.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Pure logic — trigger parsing, swap algorithms, morph, history, SSE, indicators"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/orchestration" :class "hover:underline"
|
|
:sx-get "/specs/orchestration" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"orchestration.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Browser wiring — binds engine to DOM events, fetch, request lifecycle"))))))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Browser")
|
|
(p :class "text-stone-600"
|
|
"Browser-level support: startup lifecycle and on-demand CSS. "
|
|
(code :class "text-violet-700 text-sm" "boot.sx")
|
|
" handles page load — processing scripts, mounting content, and hydrating elements. "
|
|
(code :class "text-violet-700 text-sm" "cssx.sx")
|
|
" provides the on-demand CSS system that resolves keyword atoms into class names and injects rules as needed.")
|
|
(div :class "overflow-x-auto rounded border border-stone-200"
|
|
(table :class "w-full text-left text-sm"
|
|
(thead (tr :class "border-b border-stone-200 bg-stone-100"
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "File")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Role")))
|
|
(tbody
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/boot" :class "hover:underline"
|
|
:sx-get "/specs/boot" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"boot.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Browser startup lifecycle — mount, hydrate, script processing, head hoisting"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/cssx" :class "hover:underline"
|
|
:sx-get "/specs/cssx" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"cssx.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "On-demand CSS — style dictionary, keyword resolution, rule injection"))))))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Dependency graph")
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 mx-auto max-w-3xl"
|
|
(pre :class "text-sm leading-relaxed whitespace-pre-wrap break-words font-mono text-stone-700"
|
|
"parser.sx (standalone — no dependencies)
|
|
primitives.sx (standalone — declarative registry)
|
|
special-forms.sx (standalone — declarative registry)
|
|
eval.sx depends on: parser, primitives, special-forms
|
|
render.sx (standalone — shared registries)
|
|
|
|
adapter-dom.sx depends on: render, eval
|
|
adapter-html.sx depends on: render, eval
|
|
adapter-sx.sx depends on: render, eval
|
|
|
|
engine.sx depends on: eval, adapter-dom
|
|
orchestration.sx depends on: engine, adapter-dom
|
|
cssx.sx depends on: render
|
|
boot.sx depends on: cssx, orchestration, adapter-dom, render
|
|
|
|
;; Extensions (optional — loaded only when target requests them)
|
|
continuations.sx depends on: eval (optional)
|
|
callcc.sx depends on: eval (optional)
|
|
|
|
;; Spec modules (optional — loaded via --spec-modules)
|
|
deps.sx depends on: eval (optional)
|
|
router.sx (standalone — pure string/list ops)")))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Extensions")
|
|
(p :class "text-stone-600"
|
|
"Optional bolt-on specifications that extend the core language. Bootstrappers include them only when the target requests them. Code that doesn't use extensions pays zero cost.")
|
|
(div :class "overflow-x-auto rounded border border-stone-200"
|
|
(table :class "w-full text-left text-sm"
|
|
(thead (tr :class "border-b border-stone-200 bg-stone-100"
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "File")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Role")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Recommended targets")))
|
|
(tbody
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/continuations" :class "hover:underline"
|
|
:sx-get "/specs/continuations" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"continuations.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Delimited continuations — shift/reset")
|
|
(td :class "px-3 py-2 text-stone-500" "All targets"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/specs/callcc" :class "hover:underline"
|
|
:sx-get "/specs/callcc" :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
"callcc.sx"))
|
|
(td :class "px-3 py-2 text-stone-700" "Full first-class continuations — call/cc")
|
|
(td :class "px-3 py-2 text-stone-500" "Scheme, Haskell"))))))
|
|
|
|
(div :class "space-y-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Self-hosting")
|
|
(p :class "text-stone-600"
|
|
"Every spec file is written in the same restricted subset of SX that the evaluator itself defines. A bootstrap compiler for a new target only needs to understand this subset — roughly 20 special forms and 80 primitives — to generate a fully native implementation. The spec files are the single source of truth; implementations are derived artifacts.")
|
|
(p :class "text-stone-600"
|
|
"This is not a theoretical exercise. The JavaScript implementation ("
|
|
(code :class "text-violet-700 text-sm" "sx.js")
|
|
") and the Python implementation ("
|
|
(code :class "text-violet-700 text-sm" "shared/sx/")
|
|
") are both generated from these spec files via "
|
|
(code :class "text-violet-700 text-sm" "bootstrap_js.py")
|
|
" and its Python counterpart.")))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Overview pages (Core / Adapters) — show truncated previews of each file
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~spec-overview-content (&key spec-title spec-files)
|
|
(~doc-page :title (or spec-title "Specs")
|
|
(p :class "text-stone-600 mb-6"
|
|
(case spec-title
|
|
"Core Language"
|
|
"The core specification defines the language itself — parsing, evaluation, primitives, and shared rendering definitions. These four files are platform-independent and sufficient to implement SX on any target."
|
|
"Adapters & Engine"
|
|
"Adapters connect the core language to specific environments. Each adapter takes evaluated expression trees and produces output for its target. The engine adds browser-side fetch/swap behaviour, split into pure logic and browser orchestration."
|
|
"Browser"
|
|
"Browser-level support: the startup lifecycle that boots SX in the browser, and the on-demand CSS system that resolves keyword atoms into Tailwind-compatible class names."
|
|
:else ""))
|
|
(div :class "space-y-8"
|
|
(map (fn (spec)
|
|
(div :class "space-y-3"
|
|
(div :class "flex items-baseline gap-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800"
|
|
(a :href (get spec "href")
|
|
:sx-get (get spec "href") :sx-target "#main-panel" :sx-select "#main-panel"
|
|
:sx-swap "outerHTML" :sx-push-url "true"
|
|
:class "text-violet-700 hover:text-violet-900 underline"
|
|
(get spec "title")))
|
|
(span :class "text-sm text-stone-400 font-mono" (get spec "filename")))
|
|
(p :class "text-stone-600" (get spec "desc"))
|
|
(when (get spec "prose")
|
|
(p :class "text-sm text-stone-500 leading-relaxed" (get spec "prose")))
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 max-h-72 overflow-y-auto"
|
|
(pre :class "text-xs leading-relaxed whitespace-pre-wrap break-words"
|
|
(code (highlight (get spec "source") "sx"))))))
|
|
spec-files))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Detail page — full source of a single spec file
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~spec-detail-content (&key spec-title spec-desc spec-filename spec-source spec-prose)
|
|
(~doc-page :title spec-title
|
|
(div :class "flex items-baseline gap-3 mb-4"
|
|
(span :class "text-sm text-stone-400 font-mono" spec-filename)
|
|
(span :class "text-sm text-stone-500" spec-desc))
|
|
(when spec-prose
|
|
(div :class "mb-6 space-y-3"
|
|
(p :class "text-stone-600 leading-relaxed" spec-prose)
|
|
(p :class "text-xs text-stone-400 italic"
|
|
"The s-expression source below is the canonical specification. "
|
|
"The English description above is a summary.")))
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 mx-auto max-w-3xl"
|
|
(pre :class "text-sm leading-relaxed whitespace-pre-wrap break-words"
|
|
(code (highlight spec-source "sx"))))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Bootstrappers — summary index
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~bootstrappers-index-content ()
|
|
(~doc-page :title "Bootstrappers"
|
|
(div :class "space-y-6"
|
|
(p :class "text-lg text-stone-600"
|
|
"A bootstrapper reads the canonical " (code :class "text-violet-700 text-sm" ".sx")
|
|
" specification files and emits a native implementation for a specific target. "
|
|
"The spec files are the single source of truth — bootstrappers are the bridge from specification to runnable code.")
|
|
(p :class "text-stone-600"
|
|
"Each bootstrapper is a compiler that understands the restricted SX subset used in the spec files "
|
|
"(roughly 20 special forms and 80 primitives) and translates it into idiomatic target code. "
|
|
"Platform-specific operations (DOM access, HTTP, timers) are emitted as native implementations "
|
|
"rather than translated from SX.")
|
|
(div :class "overflow-x-auto rounded border border-stone-200"
|
|
(table :class "w-full text-left text-sm"
|
|
(thead (tr :class "border-b border-stone-200 bg-stone-100"
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Target")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Bootstrapper")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Output")
|
|
(th :class "px-3 py-2 font-medium text-stone-600" "Status")))
|
|
(tbody
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 text-stone-700" "JavaScript")
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/bootstrappers/javascript" :class "hover:underline"
|
|
"bootstrap_js.py"))
|
|
(td :class "px-3 py-2 font-mono text-sm text-stone-500" "sx-browser.js")
|
|
(td :class "px-3 py-2 text-green-600" "Live"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 text-stone-700" "Python")
|
|
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
|
|
(a :href "/bootstrappers/python" :class "hover:underline"
|
|
"bootstrap_py.py"))
|
|
(td :class "px-3 py-2 font-mono text-sm text-stone-500" "sx_ref.py")
|
|
(td :class "px-3 py-2 text-green-600" "Live"))
|
|
(tr :class "border-b border-stone-100"
|
|
(td :class "px-3 py-2 text-stone-700" "Rust")
|
|
(td :class "px-3 py-2 font-mono text-sm text-stone-400" "bootstrap_rs.py")
|
|
(td :class "px-3 py-2 font-mono text-sm text-stone-400" "sx-native")
|
|
(td :class "px-3 py-2 text-stone-400" "Planned")))))
|
|
)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Bootstrapper detail — shows bootstrapper source + generated output
|
|
;; ---------------------------------------------------------------------------
|
|
;; @css border-violet-300 animate-pulse
|
|
|
|
(defcomp ~bootstrapper-js-content (&key bootstrapper-source bootstrapped-output)
|
|
(~doc-page :title "JavaScript Bootstrapper"
|
|
(div :class "space-y-8"
|
|
|
|
(div :class "space-y-3"
|
|
(p :class "text-stone-600"
|
|
"This page reads the canonical " (code :class "text-violet-700 text-sm" ".sx")
|
|
" spec files, runs the Python bootstrapper, and displays both the compiler source and its generated JavaScript output. "
|
|
"The generated code below is live — it was produced by the bootstrapper at page load time, not served from a static file.")
|
|
(p :class "text-xs text-stone-400 italic"
|
|
"The sx-browser.js powering this page IS the bootstrapped output. "
|
|
"This page re-runs the bootstrapper to display the source and result."))
|
|
|
|
(div :class "space-y-3"
|
|
(div :class "flex items-baseline gap-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Bootstrapper")
|
|
(span :class "text-sm text-stone-400 font-mono" "bootstrap_js.py"))
|
|
(p :class "text-sm text-stone-500"
|
|
"The compiler reads " (code :class "text-violet-700 text-sm" ".sx")
|
|
" spec files (parser, eval, primitives, render, adapters, engine, orchestration, boot, cssx) "
|
|
"and emits a standalone JavaScript file. Platform bridge functions (DOM operations, fetch, timers) "
|
|
"are emitted as native JS implementations.")
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 max-h-96 overflow-y-auto border border-stone-200"
|
|
(pre :class "text-xs leading-relaxed whitespace-pre-wrap break-words"
|
|
(code (highlight bootstrapper-source "python")))))
|
|
|
|
(div :class "space-y-3"
|
|
(div :class "flex items-baseline gap-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Generated Output")
|
|
(span :class "text-sm text-stone-400 font-mono" "sx-browser.js"))
|
|
(p :class "text-sm text-stone-500"
|
|
"The JavaScript below was generated by running the bootstrapper against the current spec files. "
|
|
"It is a complete, self-contained SX runtime — parser, evaluator, DOM adapter, engine, and CSS system.")
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 max-h-96 overflow-y-auto border border-violet-300"
|
|
(pre :class "text-xs leading-relaxed whitespace-pre-wrap break-words"
|
|
(code (highlight bootstrapped-output "javascript"))))))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Python bootstrapper detail
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~bootstrapper-py-content (&key bootstrapper-source bootstrapped-output)
|
|
(~doc-page :title "Python Bootstrapper"
|
|
(div :class "space-y-8"
|
|
|
|
(div :class "space-y-3"
|
|
(p :class "text-stone-600"
|
|
"This page reads the canonical " (code :class "text-violet-700 text-sm" ".sx")
|
|
" spec files, runs the Python bootstrapper, and displays both the compiler source and its generated Python output. "
|
|
"The generated code below is live — it was produced by the bootstrapper at page load time.")
|
|
(p :class "text-xs text-stone-400 italic"
|
|
"With SX_USE_REF=1, the server-side SX evaluator running this page IS the bootstrapped output. "
|
|
"This page re-runs the bootstrapper to display the source and result."))
|
|
|
|
(div :class "space-y-3"
|
|
(div :class "flex items-baseline gap-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Bootstrapper")
|
|
(span :class "text-sm text-stone-400 font-mono" "bootstrap_py.py"))
|
|
(p :class "text-sm text-stone-500"
|
|
"The compiler reads " (code :class "text-violet-700 text-sm" ".sx")
|
|
" spec files (eval, primitives, render, adapter-html) "
|
|
"and emits a standalone Python module. Platform bridge functions (type constructors, environment ops) "
|
|
"are emitted as native Python implementations.")
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 max-h-96 overflow-y-auto border border-stone-200"
|
|
(pre :class "text-xs leading-relaxed whitespace-pre-wrap break-words"
|
|
(code (highlight bootstrapper-source "python")))))
|
|
|
|
(div :class "space-y-3"
|
|
(div :class "flex items-baseline gap-3"
|
|
(h2 :class "text-2xl font-semibold text-stone-800" "Generated Output")
|
|
(span :class "text-sm text-stone-400 font-mono" "sx_ref.py"))
|
|
(p :class "text-sm text-stone-500"
|
|
"The Python below was generated by running the bootstrapper against the current spec files. "
|
|
"It is a complete server-side SX evaluator — eval, primitives, and HTML renderer.")
|
|
(div :class "not-prose bg-stone-100 rounded-lg p-5 max-h-96 overflow-y-auto border border-violet-300"
|
|
(pre :class "text-xs leading-relaxed whitespace-pre-wrap break-words"
|
|
(code (highlight bootstrapped-output "python"))))))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Not found
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~spec-not-found (&key slug)
|
|
(~doc-page :title "Spec Not Found"
|
|
(p :class "text-stone-600"
|
|
"No specification found for \"" slug "\". This spec may not exist yet.")))
|