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>
This commit is contained in:
2026-04-04 20:49:02 +00:00
parent aee4770a6a
commit c0665ba58e
19 changed files with 4974 additions and 3771 deletions

View File

@@ -323,28 +323,43 @@
;; ---------------------------------------------------------------------------
;; Day checkboxes from data — replaces Python loop
(defcomp ~forms/day-checkboxes-from-data (&key days-data all-checked)
(defcomp
~forms/day-checkboxes-from-data
(&key days-data all-checked)
(<>
(~forms/day-all-checkbox :checked (when all-checked "checked"))
(map (lambda (d)
(~forms/day-checkbox
:name (get d "name")
:label (get d "label")
:checked (when (get d "checked") "checked")))
(map
(lambda
(d)
(let-match
{:checked checked :label label :name name}
d
(~forms/day-checkbox
:name name
:label label
:checked (when checked "checked"))))
(or days-data (list)))))
;; Slot options from data — replaces _slot_options_html Python loop
(defcomp ~forms/slot-options-from-data (&key slots)
(<> (map (lambda (s)
(~forms/slot-option
:value (get s "value")
:data-start (get s "data-start")
:data-end (get s "data-end")
:data-flexible (get s "data-flexible")
:data-cost (get s "data-cost")
:selected (get s "selected")
:label (get s "label")))
(or slots (list)))))
(defcomp
~forms/slot-options-from-data
(&key slots)
(<>
(map
(lambda
(s)
(let-match
{:data-end data-end :data-flexible data-flexible :selected selected :value value :data-cost data-cost :label label :data-start data-start}
s
(~forms/slot-option
:value value
:data-start data-start
:data-end data-end
:data-flexible data-flexible
:data-cost data-cost
:selected selected
:label label)))
(or slots (list)))))
;; Slot picker from data — wraps picker + options
(defcomp ~forms/slot-picker-from-data (&key id slots)