js-on-sx: obj destructure rename + rest + nested tolerance

Pattern {key: local-name} emits ("rename" key local). Transpile
emits (define local (js-get-prop tmp key)).

Rest in obj pattern stubs (no supported), nested {} and [] treated
as holes.

442/444 unit (+2), 148/148 slice unchanged.
This commit is contained in:
2026-04-23 23:19:31 +00:00
parent c5e2bc2fe1
commit 9f9e4e1e9d
3 changed files with 53 additions and 4 deletions

View File

@@ -862,17 +862,45 @@
(st names)
(cond
((jp-at? st "punct" "}") nil)
((jp-at? st "punct" "...")
(begin
(jp-advance! st)
(when
(= (get (jp-peek st) :type) "ident")
(append! names (list "rest" (get (jp-peek st) :value)))
(jp-advance! st))))
(else
(begin
(let
((nm (get (jp-peek st) :value)))
((key (get (jp-peek st) :value)))
(if
(or
(= (get (jp-peek st) :type) "ident")
(= (get (jp-peek st) :type) "string"))
(= (get (jp-peek st) :type) "string")
(= (get (jp-peek st) :type) "number"))
(jp-advance! st)
(error "expected ident in obj pattern"))
(append! names nm))
(error "expected key in obj pattern"))
(if
(jp-at? st "punct" ":")
(begin
(jp-advance! st)
(cond
((= (get (jp-peek st) :type) "ident")
(begin
(append!
names
(list "rename" key (get (jp-peek st) :value)))
(jp-advance! st)))
((jp-at? st "punct" "{")
(begin (jp-skip-balanced st "{" "}") (append! names nil)))
((jp-at? st "punct" "[")
(begin (jp-skip-balanced st "[" "]") (append! names nil)))
(else
(error "expected ident/pattern after : in obj pattern"))))
(append! names key))
(when
(jp-at? st "op" "=")
(begin (jp-advance! st) (jp-parse-assignment st))))
(cond
((jp-at? st "punct" ",")
(begin (jp-advance! st) (jp-parse-obj-pattern-loop st names)))