Update reference SX spec to match sx.js macros branch (CSSX, dict literals, new primitives)
- eval.sx: Add defstyle, defkeyframes, defhandler special forms; add ho-for-each
- parser.sx: Add dict {...} literal parsing and quasiquote/unquote sugar
- primitives.sx: Add parse-datetime, split-ids, css, merge-styles primitives
- render.sx: Add StyleValue handling, SVG filter elements, definition forms in render, fix render-to-html to handle HTML tags directly
- bootstrap_js.py: Add StyleValue type, buildKeyframes, isEvery platform helper, new primitives (format-date, parse-datetime, split-ids, css, merge-styles), dict/quasiquote parser, expose render functions as primitives
- sx-ref.js: Regenerated — 132/132 tests passing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -96,7 +96,7 @@
|
||||
|
||||
;; --- dict literal ---
|
||||
"dict"
|
||||
(map-dict (fn (k v) (list k (trampoline (eval-expr v env)))) expr)
|
||||
(map-dict (fn (k v) (trampoline (eval-expr v env))) expr)
|
||||
|
||||
;; --- list = call or special form ---
|
||||
"list"
|
||||
@@ -141,6 +141,9 @@
|
||||
(= name "define") (sf-define args env)
|
||||
(= name "defcomp") (sf-defcomp args env)
|
||||
(= name "defmacro") (sf-defmacro args env)
|
||||
(= name "defstyle") (sf-defstyle args env)
|
||||
(= name "defkeyframes") (sf-defkeyframes args env)
|
||||
(= name "defhandler") (sf-define args env)
|
||||
(= name "begin") (sf-begin args env)
|
||||
(= name "do") (sf-begin args env)
|
||||
(= name "quote") (sf-quote args env)
|
||||
@@ -495,6 +498,25 @@
|
||||
(list params rest-param))))
|
||||
|
||||
|
||||
(define sf-defstyle
|
||||
(fn (args env)
|
||||
;; (defstyle name expr) — bind name to evaluated expr (typically a StyleValue)
|
||||
(let ((name-sym (first args))
|
||||
(value (trampoline (eval-expr (nth args 1) env))))
|
||||
(env-set! env (symbol-name name-sym) value)
|
||||
value)))
|
||||
|
||||
|
||||
(define sf-defkeyframes
|
||||
(fn (args env)
|
||||
;; (defkeyframes name (selector body) ...) — build @keyframes rule,
|
||||
;; register in keyframes dict, return StyleValue.
|
||||
;; Delegates to platform: build-keyframes returns a StyleValue.
|
||||
(let ((kf-name (symbol-name (first args)))
|
||||
(steps (rest args)))
|
||||
(build-keyframes kf-name steps env))))
|
||||
|
||||
|
||||
(define sf-begin
|
||||
(fn (args env)
|
||||
(if (empty? args)
|
||||
@@ -651,6 +673,15 @@
|
||||
coll))))
|
||||
|
||||
|
||||
(define ho-for-each
|
||||
(fn (args env)
|
||||
(let ((f (trampoline (eval-expr (first args) env)))
|
||||
(coll (trampoline (eval-expr (nth args 1) env))))
|
||||
(for-each
|
||||
(fn (item) (trampoline (call-lambda f (list item) env)))
|
||||
coll))))
|
||||
|
||||
|
||||
;; --------------------------------------------------------------------------
|
||||
;; 8. Primitives — pure functions available in all targets
|
||||
;; --------------------------------------------------------------------------
|
||||
@@ -728,4 +759,7 @@
|
||||
;; (strip-prefix s prefix) → string with prefix removed (or s unchanged)
|
||||
;; (apply f args) → call f with args list
|
||||
;; (zip lists...) → list of tuples
|
||||
;;
|
||||
;; CSSX (style system):
|
||||
;; (build-keyframes name steps env) → StyleValue (platform builds @keyframes)
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user