Files
rose-ash/shared/sx/templates/client-libs/page-functions.sx
giles c0665ba58e Adopt Step 7 language features across SX codebase
112 conversions across 19 .sx files using match, let-match, and pipe operators:

match (17): type/value dispatch replacing cond/if chains
  - lib/vm.sx: HO form dispatch (for-each/map/filter/reduce/some/every?)
  - lib/tree-tools.sx: node-display, node-matches?, rename, count, replace, free-symbols
  - lib/types.sx: narrow-type, substitute-in-type, infer-type, resolve-type
  - web/engine.sx: default-trigger, resolve-target, classify-trigger
  - web/deps.sx: scan-refs-walk, scan-io-refs-walk

let-match (89): dict destructuring replacing (get d "key") patterns
  - shared/page-functions.sx (20), blog/admin.sx (17), pub-api.sx (13)
  - events/ layouts/page/tickets/entries/forms (27 total)
  - specs-explorer.sx (7), federation/social.sx (3), lib/ small files (3)

-> pipes (6): replacing triple-chained gets in lib/vm.sx
  - frame-closure → closure-code → code-bytecode chains

Also: lib/vm.sx accessor upgrades (get vm "sp" → vm-sp vm throughout)

2650/2650 tests pass, zero regressions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 20:49:02 +00:00

721 lines
24 KiB
Plaintext

(define
slug->component
(fn
(slug prefix infix suffix)
(if
infix
(make-symbol (str prefix slug infix slug suffix))
(make-symbol (str prefix slug suffix)))))
(define
make-page-fn
(fn
(default-name prefix infix suffix)
(fn
(slug)
(if
(nil? slug)
(list (make-symbol default-name))
(list (slug->component slug prefix infix suffix))))))
(define
home
(fn
(content)
(if (nil? content) (quote (~docs-content/home-content)) content)))
(define language (fn (content) (if (nil? content) nil content)))
(define
geography
(fn
(content)
(if (nil? content) (quote (~geography/index-content)) content)))
(define applications (fn (content) (if (nil? content) nil content)))
(define etc (fn (content) (if (nil? content) nil content)))
(define hypermedia (fn (content) (if (nil? content) nil content)))
(define
reactive
(fn
(content)
(if
(nil? content)
(quote (~reactive-islands/index/reactive-islands-index-content))
content)))
(define
examples
(make-page-fn
"~reactive-islands/demo/reactive-islands-demo-content"
"~reactive-islands/demo/example-"
nil
""))
(define
cek
(fn
(slug)
(if
(nil? slug)
(quote (~geography/cek/cek-content))
(case
slug
"demo"
(quote (~geography/cek/cek-demo-content))
"freeze"
(quote (~geography/cek/cek-freeze-content))
"content"
(quote (~geography/cek/cek-content-address-content))
:else (quote (~geography/cek/cek-content))))))
(define
provide
(fn
(content)
(if (nil? content) (quote (~geography/provide-content)) content)))
(define
scopes
(fn
(content)
(if (nil? content) (quote (~geography/scopes-content)) content)))
(define
spreads
(fn
(content)
(if (nil? content) (quote (~geography/spreads-content)) content)))
(define
marshes
(fn
(slug)
(if
(nil? slug)
(quote (~reactive-islands/marshes/reactive-islands-marshes-content))
(case
slug
"hypermedia-feeds"
(quote (~reactive-islands/marshes/example-hypermedia-feeds))
"server-signals"
(quote (~reactive-islands/marshes/example-server-signals))
"on-settle"
(quote (~reactive-islands/marshes/example-on-settle))
"signal-triggers"
(quote (~reactive-islands/marshes/example-signal-triggers))
"view-transform"
(quote (~reactive-islands/marshes/example-view-transform))
:else (quote (~reactive-islands/marshes/reactive-islands-marshes-content))))))
(define
isomorphism
(fn
(slug)
(if
(nil? slug)
(quote (~plans/isomorphic/plan-isomorphic-content))
(case
slug
"bundle-analyzer"
(let-match
{:total-macros total-macros :pages pages :io-count io-count :pure-count pure-count :total-components total-components}
(helper "bundle-analyzer-data")
(quasiquote
(~analyzer/bundle-analyzer-content
:pages (unquote pages)
:total-components (unquote total-components)
:total-macros (unquote total-macros)
:pure-count (unquote pure-count)
:io-count (unquote io-count))))
"routing-analyzer"
(let-match
{:pages pages :total-pages total-pages :server-count server-count :registry-sample registry-sample :client-count client-count}
(helper "routing-analyzer-data")
(quasiquote
(~routing-analyzer/content
:pages (unquote pages)
:total-pages (unquote total-pages)
:client-count (unquote client-count)
:server-count (unquote server-count)
:registry-sample (unquote registry-sample))))
"data-test"
(let-match
{:server-time server-time :transport transport :phase phase :items items}
(helper "data-test-data")
(quasiquote
(~data-test/content
:server-time (unquote server-time)
:items (unquote items)
:phase (unquote phase)
:transport (unquote transport))))
"async-io"
(quote (~async-io-demo/content))
"affinity"
(let-match
{:components components :page-plans page-plans}
(helper "affinity-demo-data")
(quasiquote
(~affinity-demo/content
:components (unquote components)
:page-plans (unquote page-plans))))
"optimistic"
(let-match
{:server-time server-time :items items}
(helper "optimistic-demo-data")
(quasiquote
(~optimistic-demo/content
:items (unquote items)
:server-time (unquote server-time))))
"offline"
(let-match
{:server-time server-time :notes notes}
(helper "offline-demo-data")
(quasiquote
(~offline-demo/content
:notes (unquote notes)
:server-time (unquote server-time))))
:else (quote (~plans/isomorphic/plan-isomorphic-content))))))
(define
doc
(fn
(slug)
(if
(nil? slug)
(quote (~docs-content/docs-introduction-content))
(case
slug
"introduction"
(quote (~docs-content/docs-introduction-content))
"getting-started"
(quote (~docs-content/docs-getting-started-content))
"components"
(quote (~docs-content/docs-components-content))
"evaluator"
(quote (~docs-content/docs-evaluator-content))
"primitives"
(let
((data (helper "primitives-data")))
(quasiquote
(~docs-content/docs-primitives-content
:prims (~docs/primitives-tables :primitives (unquote data)))))
"special-forms"
(let
((data (helper "special-forms-data")))
(quasiquote
(~docs-content/docs-special-forms-content
:forms (~docs/special-forms-tables :forms (unquote data)))))
"server-rendering"
(quote (~docs-content/docs-server-rendering-content))
:else (quote (~docs-content/docs-introduction-content))))))
(define
spec
(fn
(slug)
(if
(nil? slug)
(quote (~specs/architecture-content))
(case
slug
"core"
(let
((files (make-spec-files core-spec-items)))
(quasiquote
(~specs/overview-content
:spec-title "Core Language"
:spec-files (unquote files))))
"adapters"
(let
((files (make-spec-files adapter-spec-items)))
(quasiquote
(~specs/overview-content
:spec-title "Adapters"
:spec-files (unquote files))))
"browser"
(let
((files (make-spec-files browser-spec-items)))
(quasiquote
(~specs/overview-content
:spec-title "Browser Runtime"
:spec-files (unquote files))))
"reactive"
(let
((files (make-spec-files reactive-spec-items)))
(quasiquote
(~specs/overview-content
:spec-title "Reactive System"
:spec-files (unquote files))))
"host"
(let
((files (make-spec-files host-spec-items)))
(quasiquote
(~specs/overview-content
:spec-title "Host Interface"
:spec-files (unquote files))))
"extensions"
(let
((files (make-spec-files extension-spec-items)))
(quasiquote
(~specs/overview-content
:spec-title "Extensions"
:spec-files (unquote files))))
:else (let
((found-spec (find-spec slug)))
(if
found-spec
(let-match
{:desc desc :prose prose :title title :filename filename}
found-spec
(let
((src (helper "read-spec-file" filename)))
(quasiquote
(~specs/detail-content
:spec-title (unquote title)
:spec-desc (unquote desc)
:spec-filename (unquote filename)
:spec-source (unquote src)
:spec-prose (unquote prose)))))
(quasiquote (~specs/not-found :slug (unquote slug)))))))))
(define
explore
(fn
(slug)
(if
(nil? slug)
(quote (~specs/architecture-content))
(let
((found-spec (find-spec slug)))
(if
found-spec
(let
((data (spec-explore (get found-spec "filename") (get found-spec "title") (get found-spec "desc"))))
(if
data
(quasiquote
(~specs-explorer/spec-explorer-content :data (unquote data)))
(quasiquote (~specs/not-found :slug (unquote slug)))))
(quasiquote (~specs/not-found :slug (unquote slug))))))))
(define
make-spec-files
(fn
(items)
(map
(fn
(item)
(dict
:title (get item "title")
:desc (get item "desc")
:prose (get item "prose")
:filename (get item "filename")
:href (str "/sx/(language.(spec." (get item "slug") "))")
:source (helper "read-spec-file" (get item "filename"))))
items)))
(define
bootstrapper
(fn
(slug)
(if
(nil? slug)
(quote (~specs/bootstrappers-index-content))
(let
((data (helper "bootstrapper-data" slug)))
(if
(get data "bootstrapper-not-found")
(quasiquote (~specs/not-found :slug (unquote slug)))
(case
slug
"self-hosting"
(let-match
{:g1-output g1-output :py-sx-source py-sx-source :g0-bytes g0-bytes :verification-status verification-status :g0-output g0-output :defines-total defines-total :defines-matched defines-matched :g0-lines g0-lines}
data
(quasiquote
(~specs/bootstrapper-self-hosting-content
:py-sx-source (unquote py-sx-source)
:g0-output (unquote g0-output)
:g1-output (unquote g1-output)
:defines-matched (unquote defines-matched)
:defines-total (unquote defines-total)
:g0-lines (unquote g0-lines)
:g0-bytes (unquote g0-bytes)
:verification-status (unquote verification-status))))
"self-hosting-js"
(let-match
{:js-sx-source js-sx-source :verification-status verification-status :js-sx-lines js-sx-lines :defines-total defines-total :defines-matched defines-matched}
data
(quasiquote
(~specs/bootstrapper-self-hosting-js-content
:js-sx-source (unquote js-sx-source)
:defines-matched (unquote defines-matched)
:defines-total (unquote defines-total)
:js-sx-lines (unquote js-sx-lines)
:verification-status (unquote verification-status))))
"python"
(let-match
{:bootstrapper-source bootstrapper-source :bootstrapped-output bootstrapped-output}
data
(quasiquote
(~specs/bootstrapper-py-content
:bootstrapper-source (unquote bootstrapper-source)
:bootstrapped-output (unquote bootstrapped-output))))
"page-helpers"
(let-match
{:attr-result attr-result :sf-source sf-source :ref-ms ref-ms :req-attrs req-attrs :attr-detail attr-detail :attr-keys attr-keys :server-total-ms server-total-ms :attr-ms attr-ms :comp-ms comp-ms :routing-ms routing-ms :comp-source comp-source :routing-result routing-result :sf-categories sf-categories :sf-total sf-total :sf-ms sf-ms :ref-sample ref-sample}
(helper "page-helpers-demo-data")
(quasiquote
(~page-helpers-demo/content
:sf-categories (unquote sf-categories)
:sf-total (unquote sf-total)
:sf-ms (unquote sf-ms)
:ref-sample (unquote ref-sample)
:ref-ms (unquote ref-ms)
:attr-result (unquote attr-result)
:attr-ms (unquote attr-ms)
:comp-source (unquote comp-source)
:comp-ms (unquote comp-ms)
:routing-result (unquote routing-result)
:routing-ms (unquote routing-ms)
:server-total-ms (unquote server-total-ms)
:sf-source (unquote sf-source)
:attr-detail (unquote attr-detail)
:req-attrs (unquote req-attrs)
:attr-keys (unquote attr-keys))))
:else (let-match
{:bootstrapper-source bootstrapper-source :bootstrapped-output bootstrapped-output}
data
(quasiquote
(~specs/bootstrapper-js-content
:bootstrapper-source (unquote bootstrapper-source)
:bootstrapped-output (unquote bootstrapped-output))))))))))
(define
test
(fn
(slug)
(if
(nil? slug)
(let-match
{:server-results server-results :parser-source parser-source :framework-source framework-source :eval-source eval-source :router-source router-source :engine-source engine-source :render-source render-source :deps-source deps-source}
(helper "run-modular-tests" "all")
(quasiquote
(~testing/overview-content
:server-results (unquote server-results)
:framework-source (unquote framework-source)
:eval-source (unquote eval-source)
:parser-source (unquote parser-source)
:router-source (unquote router-source)
:render-source (unquote render-source)
:deps-source (unquote deps-source)
:engine-source (unquote engine-source))))
(case
slug
"runners"
(quote (~testing/runners-content))
:else (let-match
{:server-results server-results :spec-source spec-source :framework-source framework-source}
(helper "run-modular-tests" slug)
(case
slug
"eval"
(quasiquote
(~testing/spec-content
:spec-name "eval"
:spec-title "Evaluator Tests"
:spec-desc "81 tests covering the core evaluator — literals, symbols, special forms, closures."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
"parser"
(quasiquote
(~testing/spec-content
:spec-name "parser"
:spec-title "Parser Tests"
:spec-desc "39 tests covering tokenization and parsing."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
"router"
(quasiquote
(~testing/spec-content
:spec-name "router"
:spec-title "Router Tests"
:spec-desc "18 tests covering client-side route matching."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
"render"
(quasiquote
(~testing/spec-content
:spec-name "render"
:spec-title "Renderer Tests"
:spec-desc "23 tests covering HTML rendering."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
"deps"
(quasiquote
(~testing/spec-content
:spec-name "deps"
:spec-title "Dependency Analysis Tests"
:spec-desc "33 tests covering component dependency analysis."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
"engine"
(quasiquote
(~testing/spec-content
:spec-name "engine"
:spec-title "Engine Tests"
:spec-desc "37 tests covering engine pure functions."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
"orchestration"
(quasiquote
(~testing/spec-content
:spec-name "orchestration"
:spec-title "Orchestration Tests"
:spec-desc "17 tests covering orchestration."
:spec-source (unquote spec-source)
:framework-source (unquote framework-source)
:server-results (unquote server-results)))
:else (quasiquote
(~testing/overview-content
:server-results (unquote server-results)))))))))
(define
reference
(fn
(slug)
(if
(nil? slug)
(quote (~examples/reference-index-content))
(let
((data (helper "reference-data" slug)))
(case
slug
"attributes"
(let-match
{:req-attrs req-attrs :beh-attrs beh-attrs :uniq-attrs uniq-attrs}
data
(quasiquote
(~reference/attrs-content
:req-table (~docs/attr-table-from-data
:title "Request Attributes"
:attrs (unquote req-attrs))
:beh-table (~docs/attr-table-from-data
:title "Behavior Attributes"
:attrs (unquote beh-attrs))
:uniq-table (~docs/attr-table-from-data
:title "Unique to sx"
:attrs (unquote uniq-attrs)))))
"headers"
(let-match
{:req-headers req-headers :resp-headers resp-headers}
data
(quasiquote
(~reference/headers-content
:req-table (~docs/headers-table-from-data
:title "Request Headers"
:headers (unquote req-headers))
:resp-table (~docs/headers-table-from-data
:title "Response Headers"
:headers (unquote resp-headers)))))
"events"
(quasiquote
(~reference/events-content
:table (~docs/two-col-table-from-data
:intro "sx fires custom DOM events at various points in the request lifecycle."
:col1 "Event"
:col2 "Description"
:items (unquote (get data "events-list")))))
"js-api"
(quasiquote
(~reference/js-api-content
:table (~docs/two-col-table-from-data
:intro "The client-side sx.js library exposes a public API for programmatic use."
:col1 "Method"
:col2 "Description"
:items (unquote (get data "js-api-list")))))
:else (let-match
{:req-attrs req-attrs :beh-attrs beh-attrs :uniq-attrs uniq-attrs}
data
(quasiquote
(~reference/attrs-content
:req-table (~docs/attr-table-from-data
:title "Request Attributes"
:attrs (unquote req-attrs))
:beh-table (~docs/attr-table-from-data
:title "Behavior Attributes"
:attrs (unquote beh-attrs))
:uniq-table (~docs/attr-table-from-data
:title "Unique to sx"
:attrs (unquote uniq-attrs))))))))))
(define
reference-detail
(fn
(kind slug)
(if
(nil? slug)
nil
(case
kind
"attributes"
(let
((data (helper "attr-detail-data" slug)))
(if
(get data "attr-not-found")
(quasiquote (~reference/attr-not-found :slug (unquote slug)))
(let-match
{:attr-handler attr-handler :attr-title attr-title :attr-example attr-example :attr-description attr-description :attr-demo attr-demo :attr-wire-id attr-wire-id}
data
(quasiquote
(~reference/attr-detail-content
:title (unquote attr-title)
:description (unquote attr-description)
:demo (unquote attr-demo)
:example-code (unquote attr-example)
:handler-code (unquote attr-handler)
:wire-placeholder-id (unquote attr-wire-id))))))
"headers"
(let
((data (helper "header-detail-data" slug)))
(if
(get data "header-not-found")
(quasiquote (~reference/attr-not-found :slug (unquote slug)))
(let-match
{:header-description header-description :header-demo header-demo :header-title header-title :header-example header-example :header-direction header-direction}
data
(quasiquote
(~reference/header-detail-content
:title (unquote header-title)
:direction (unquote header-direction)
:description (unquote header-description)
:example-code (unquote header-example)
:demo (unquote header-demo))))))
"events"
(let
((data (helper "event-detail-data" slug)))
(if
(get data "event-not-found")
(quasiquote (~reference/attr-not-found :slug (unquote slug)))
(let-match
{:event-example event-example :event-demo event-demo :event-description event-description :event-title event-title}
data
(quasiquote
(~reference/event-detail-content
:title (unquote event-title)
:description (unquote event-description)
:example-code (unquote event-example)
:demo (unquote event-demo))))))
:else nil))))
(define
example
(fn
(slug)
(if
(nil? slug)
nil
(list (slug->component slug "~examples-content/example-" nil "")))))
(define sx-urls (fn (slug) (quote (~sx-urls/urls-content))))
(define cssx (make-page-fn "~cssx/overview-content" "~cssx/" nil "-content"))
(define
protocol
(make-page-fn "~protocols/wire-format-content" "~protocols/" nil "-content"))
(define
sx-pub
(fn (slug) (if (nil? slug) (quote (~sx-pub/overview-content)) nil)))
(define
sx-tools
(fn
(&key title &rest args)
(quasiquote
(~sx-tools/overview-content
:title (unquote (or title "SX Tools"))
(splice-unquote args)))))
(define tools (fn (content) (if (nil? content) nil content)))
(define
services
(fn
(&key title &rest args)
(quasiquote
(~services-tools/overview-content
:title (unquote (or title "Services"))
(splice-unquote args)))))
(define
reactive-runtime
(make-page-fn
"~reactive-runtime/overview-content"
"~reactive-runtime/"
nil
"-content"))
(define
native-browser
(make-page-fn
"~applications/native-browser/content"
"~applications/native-browser/"
nil
"-content"))
(define
essay
(make-page-fn "~essays/index/essays-index-content" "~essays/" "/essay-" ""))
(define
philosophy
(fn
(slug)
(if
(nil? slug)
(quote (~essays/philosophy-index/content))
(case
slug
"sx-manifesto"
(quote (~essay-sx-manifesto))
"godel-escher-bach"
(quote (~essays/godel-escher-bach/essay-godel-escher-bach))
"wittgenstein"
(quote (~essays/sx-and-wittgenstein/essay-sx-and-wittgenstein))
"dennett"
(quote (~essays/sx-and-dennett/essay-sx-and-dennett))
"existentialism"
(quote (~essays/s-existentialism/essay-s-existentialism))
"platonic-sx"
(quote (~essays/platonic-sx/essay-platonic-sx))
:else (quote (~essays/philosophy-index/content))))))
(define
plan
(make-page-fn
"~plans/index/plans-index-content"
"~plans/"
"/plan-"
"-content"))
(define capabilities (fn (&key title &rest args) (quasiquote (~geography/capabilities-content))))
(define modules (fn (&key title &rest args) (quasiquote (~geography/modules-content))))
(define eval-rules (fn (&key title &rest args) (quasiquote (~geography/eval-rules-content))))
(define sxtp (make-page-fn "~applications/sxtp/content" "~applications/sxtp/" nil "-content"))