Commit Graph

3 Commits

Author SHA1 Message Date
9257b6a2d8 Step 5.5 phases 5-6: primitive :body specs + runtime trimming
Phase 5: Added :body implementations to 13 more primitives in
spec/primitives.sx (26/94 total, up from 13). New bodies for:
- Type predicates: nil?, boolean?, number?, string?, list?, dict?,
  continuation? — all via (= (type-of x) "typename")
- Comparisons: <=, >=, eq?, equal? — composed from <, >, =, identical?
- Logic: not — via (if x false true)
- Collections: empty? — via (or (nil? coll) (= (len coll) 0))

Remaining 68 are genuinely native (host string/list/dict/math ops).

Phase 6: Removed 43 unused wrapper functions from sx_runtime.ml
(489 → 414 lines, -78 lines). Dead code from pre-transpilation era:
predicate wrappers (nil_p, keyword_p, contains_p, etc.), signal
accessors (signal_set_value, notify_subscribers, etc.), scope
delegates (sx_collect, sx_emit, etc.), HO form stubs (map_indexed,
map_dict, for_each), handler def stubs (sf_defquery, sf_defaction,
sf_defpage).

2598/2598 tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:27:31 +00:00
4ce4762237 Add spec/stdlib.sx: 46 primitives become library functions
The irreducible primitive set drops from 79 to 33. Everything that can
be expressed in SX is now a library function in stdlib.sx, loaded after
evaluator.sx and before render.sx.

Moved to stdlib.sx (pure SX, no host dependency):
- Logic: not
- Comparison: != <= >= eq? eqv? equal?
- Predicates: nil? boolean? number? string? list? dict? continuation?
  empty? odd? even? zero? contains?
- Arithmetic: inc dec abs ceil round min max clamp
- Collections: first last rest nth cons append reverse flatten range
  chunk-every zip-pairs vals has-key? merge assoc dissoc into
- Strings: upcase downcase string-length substring string-contains?
  starts-with? ends-with? split join replace
- Text: pluralize escape assert parse-datetime

Remaining irreducible primitives (33):
  + - * / mod floor pow sqrt = < > type-of symbol-name keyword-name
  str slice index-of upper lower trim char-from-code list dict concat
  get len keys dict-set! append! random-int json-encode format-date
  parse-int format-decimal strip-tags sx-parse error apply

All hosts: JS 957+1080, Python 744, OCaml 952 — zero regressions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 08:55:57 +00:00
1a3d7b3d77 Separate core spec from web framework
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m49s
Three-layer architecture:
  spec/  — Core language (19 files): evaluator, parser, primitives,
           CEK machine, types, continuations. Host-independent.
  web/   — Web framework (20 files): signals, adapters, engine,
           orchestration, boot, router, CSSX. Built on core spec.
  sx/    — Application (sx-docs website). Built on web framework.

Split boundary.sx into boundary-core.sx (type-of, make-env, identical?)
and boundary-web.sx (IO primitives, signals, spreads, page helpers).

Bootstrappers search spec/ → web/ → shared/sx/ref/ for .sx files.
Original files remain in shared/sx/ref/ as fallback during transition.
All 63 tests pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 01:42:19 +00:00