;; 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 "/language/specs/parser" :class "hover:underline" :sx-get "/language/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 "/language/specs/evaluator" :class "hover:underline" :sx-get "/language/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 "/language/specs/primitives" :class "hover:underline" :sx-get "/language/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 "/language/specs/special-forms" :class "hover:underline" :sx-get "/language/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 "/language/specs/renderer" :class "hover:underline" :sx-get "/language/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 "/language/specs/adapter-dom" :class "hover:underline" :sx-get "/language/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 "/language/specs/adapter-html" :class "hover:underline" :sx-get "/language/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 "/language/specs/adapter-sx" :class "hover:underline" :sx-get "/language/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 "/language/specs/engine" :class "hover:underline" :sx-get "/language/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 "/language/specs/orchestration" :class "hover:underline" :sx-get "/language/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 "/language/specs/boot" :class "hover:underline" :sx-get "/language/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 "/language/specs/cssx" :class "hover:underline" :sx-get "/language/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 "/language/specs/continuations" :class "hover:underline" :sx-get "/language/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 "/language/specs/callcc" :class "hover:underline" :sx-get "/language/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 "/language/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 "/language/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 bg-green-50" (td :class "px-3 py-2 text-stone-700" "Python (self-hosting)") (td :class "px-3 py-2 font-mono text-sm text-violet-700" (a :href "/language/bootstrappers/self-hosting" :class "hover:underline" "py.sx")) (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" "G0 == G1")) (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")))))))) ;; --------------------------------------------------------------------------- ;; Self-hosting bootstrapper (py.sx) — live verification ;; --------------------------------------------------------------------------- ;; @css bg-green-100 text-green-800 bg-green-50 border-green-200 text-green-700 (defcomp ~bootstrapper-self-hosting-content (&key py-sx-source g0-output g1-output defines-matched defines-total g0-lines g0-bytes verification-status) (~doc-page :title "Self-Hosting Bootstrapper (py.sx)" (div :class "space-y-8" (div :class "space-y-3" (p :class "text-stone-600" (code :class "text-violet-700 text-sm" "py.sx") " is an SX-to-Python translator written in SX. " "This page runs it live: loads py.sx into the evaluator, translates each spec file, " "and diffs the result against " (code :class "text-violet-700 text-sm" "bootstrap_py.py") ".") (div :class "rounded-lg p-4" :class (if (= verification-status "identical") "bg-green-50 border border-green-200" "bg-red-50 border border-red-200") (div :class "flex items-center gap-3" (span :class "inline-flex items-center rounded-full px-3 py-1 text-sm font-semibold" :class (if (= verification-status "identical") "bg-green-100 text-green-800" "bg-red-100 text-red-800") (if (= verification-status "identical") "G0 == G1" "MISMATCH")) (p :class "text-sm" :class (if (= verification-status "identical") "text-green-700" "text-red-700") defines-matched "/" defines-total " defines match. " g0-lines " lines, " g0-bytes " bytes.")))) (div :class "space-y-3" (div :class "flex items-baseline gap-3" (h2 :class "text-2xl font-semibold text-stone-800" "py.sx Source") (span :class "text-sm text-stone-400 font-mono" "shared/sx/ref/py.sx")) (p :class "text-sm text-stone-500" "The SX-to-Python translator — 55 " (code "define") " forms. " "Name mangling (200+ RENAMES), expression emission, statement emission, " "cell variable detection for " (code "set!") " across lambda boundaries.") (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 py-sx-source "lisp"))))) (div :class "space-y-3" (div :class "flex items-baseline gap-3" (h2 :class "text-2xl font-semibold text-stone-800" "G0 Output") (span :class "text-sm text-stone-400 font-mono" "bootstrap_py.py → sx_ref.py")) (p :class "text-sm text-stone-500" "Generated by the hand-written Python bootstrapper.") (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 g0-output "python"))))) (div :class "space-y-3" (div :class "flex items-baseline gap-3" (h2 :class "text-2xl font-semibold text-stone-800" "G1 Output") (span :class "text-sm text-stone-400 font-mono" "py.sx → sx_ref.py")) (p :class "text-sm text-stone-500" "Generated by py.sx running on the Python evaluator. " (if (= verification-status "identical") (strong "Byte-for-byte identical to G0.") "Differs from G0 — see mismatch details.")) (div :class "not-prose bg-stone-100 rounded-lg p-5 max-h-96 overflow-y-auto border" :class (if (= verification-status "identical") "border-green-200" "border-red-200") (pre :class "text-xs leading-relaxed whitespace-pre-wrap break-words" (code (highlight g1-output "python")))))))) ;; --------------------------------------------------------------------------- ;; Self-hosting JS bootstrapper (js.sx) — live verification ;; --------------------------------------------------------------------------- ;; @css bg-green-100 text-green-800 bg-green-50 border-green-200 text-green-700 bg-amber-50 border-amber-200 text-amber-700 text-amber-800 bg-amber-100 (defcomp ~bootstrapper-self-hosting-js-content (&key js-sx-source defines-matched defines-total js-sx-lines verification-status) (~doc-page :title "Self-Hosting Bootstrapper (js.sx)" (div :class "space-y-8" (div :class "space-y-3" (p :class "text-stone-600" (code :class "text-violet-700 text-sm" "js.sx") " is an SX-to-JavaScript translator written in SX. " "This page runs it live: loads js.sx into the evaluator, translates every spec file, " "and verifies each define matches " (code :class "text-violet-700 text-sm" "bootstrap_js.py") "'s JSEmitter.") (div :class "rounded-lg p-4" :class (if (= verification-status "identical") "bg-green-50 border border-green-200" "bg-red-50 border border-red-200") (div :class "flex items-center gap-3" (span :class "inline-flex items-center rounded-full px-3 py-1 text-sm font-semibold" :class (if (= verification-status "identical") "bg-green-100 text-green-800" "bg-red-100 text-red-800") (if (= verification-status "identical") "G0 == G1" "MISMATCH")) (p :class "text-sm" :class (if (= verification-status "identical") "text-green-700" "text-red-700") defines-matched "/" defines-total " defines match across all spec files. " js-sx-lines " lines of SX.")))) ;; G0 Bug Discovery (div :class "space-y-3" (h2 :class "text-2xl font-semibold text-stone-800" "G0 Bug Discovery") (div :class "rounded-lg bg-amber-50 border border-amber-200 p-4" (div :class "flex items-start gap-3" (span :class "inline-flex items-center rounded-full bg-amber-100 px-3 py-1 text-sm font-semibold text-amber-800" "Fixed") (div :class "text-sm text-amber-700 space-y-2" (p "Building js.sx revealed a bug in " (code "bootstrap_js.py") "'s " (code "_emit_define") " method. The Python code:") (pre :class "bg-amber-100 rounded p-2 text-xs font-mono" "val = self.emit(fn_expr) if fn_expr else \"NIL\"") (p "Python's " (code "if fn_expr") " treats " (code "0") ", " (code "False") ", and " (code "\"\"") " as falsy. So " (code "(define *batch-depth* 0)") " emitted " (code "var _batchDepth = NIL") " instead of " (code "var _batchDepth = 0") ". Similarly, " (code "(define _css-hash \"\")") " emitted " (code "var _cssHash = NIL") " instead of " (code "var _cssHash = \"\"") ".") (p "Fix: " (code "if fn_expr is not None") " — explicit None check. " "js.sx never had this bug because SX's " (code "nil?") " only matches " (code "nil") ", not " (code "0") " or " (code "false") ". " "The self-hosting bootstrapper caught a host language bug."))))) ;; JS vs Python differences (div :class "space-y-3" (h2 :class "text-2xl font-semibold text-stone-800" "Translation Differences from py.sx") (p :class "text-sm text-stone-500" "Both py.sx and js.sx translate the same SX ASTs, but target languages differ:") (div :class "overflow-x-auto rounded border border-stone-200" (table :class "w-full text-sm" (thead :class "bg-stone-50" (tr (th :class "px-4 py-2 text-left font-semibold text-stone-700" "Feature") (th :class "px-4 py-2 text-left font-semibold text-stone-700" "py.sx → Python") (th :class "px-4 py-2 text-left font-semibold text-stone-700" "js.sx → JavaScript"))) (tbody (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "Name mangling") (td :class "px-4 py-2 font-mono text-xs" "eval-expr → eval_expr") (td :class "px-4 py-2 font-mono text-xs" "eval-expr → evalExpr")) (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "Declarations") (td :class "px-4 py-2 font-mono text-xs" "name = value") (td :class "px-4 py-2 font-mono text-xs" "var name = value;")) (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "Functions") (td :class "px-4 py-2 font-mono text-xs" "lambda x: body") (td :class "px-4 py-2 font-mono text-xs" "function(x) { return body; }")) (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "set! (mutation)") (td :class "px-4 py-2 font-mono text-xs" "_cells dict (closure hack)") (td :class "px-4 py-2 font-mono text-xs" "Direct assignment (JS captures by ref)")) (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "Tail recursion") (td :class "px-4 py-2 font-mono text-xs" "—") (td :class "px-4 py-2 font-mono text-xs" "while(true) { continue; }")) (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "let binding") (td :class "px-4 py-2 font-mono text-xs" "(lambda x: body)(val)") (td :class "px-4 py-2 font-mono text-xs" "(function() { var x = val; return body; })()")) (tr :class "border-t border-stone-100" (td :class "px-4 py-2 text-stone-600" "and/or") (td :class "px-4 py-2 font-mono text-xs" "ternary chains") (td :class "px-4 py-2 font-mono text-xs" "&& / sxOr()")))))) ;; Source (div :class "space-y-3" (div :class "flex items-baseline gap-3" (h2 :class "text-2xl font-semibold text-stone-800" "js.sx Source") (span :class "text-sm text-stone-400 font-mono" "shared/sx/ref/js.sx")) (p :class "text-sm text-stone-500" "The SX-to-JavaScript translator — 61 " (code "define") " forms. " "camelCase mangling (500+ RENAMES), expression/statement emission, " "self-tail-recursive while loop optimization.") (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 js-sx-source "lisp")))))))) ;; --------------------------------------------------------------------------- ;; 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.")))