js-on-sx: rest in array pattern + nested pattern tolerance
Array destructure now supports [a, ...rest]. Rest entry is transpiled to (define name (js-list-slice tmp i (len tmp))). Nested patterns like [[a,b], c] now parse (as holes) instead of erroring. jp-skip-balanced skips nested groups. 440/442 unit (+2), 148/148 slice unchanged.
This commit is contained in:
@@ -900,6 +900,29 @@
|
||||
(append! names nil)
|
||||
(jp-advance! st)
|
||||
(jp-parse-arr-pattern-loop st names)))
|
||||
((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))))
|
||||
((jp-at? st "punct" "[")
|
||||
(begin
|
||||
(jp-skip-balanced st "[" "]")
|
||||
(append! names nil)
|
||||
(cond
|
||||
((jp-at? st "punct" ",")
|
||||
(begin (jp-advance! st) (jp-parse-arr-pattern-loop st names)))
|
||||
(else nil))))
|
||||
((jp-at? st "punct" "{")
|
||||
(begin
|
||||
(jp-skip-balanced st "{" "}")
|
||||
(append! names nil)
|
||||
(cond
|
||||
((jp-at? st "punct" ",")
|
||||
(begin (jp-advance! st) (jp-parse-arr-pattern-loop st names)))
|
||||
(else nil))))
|
||||
(else
|
||||
(begin
|
||||
(let
|
||||
@@ -909,11 +932,39 @@
|
||||
(jp-advance! st)
|
||||
(error "expected ident in arr pattern"))
|
||||
(append! names nm))
|
||||
(when
|
||||
(jp-at? st "op" "=")
|
||||
(begin (jp-advance! st) (jp-parse-assignment st)))
|
||||
(cond
|
||||
((jp-at? st "punct" ",")
|
||||
(begin (jp-advance! st) (jp-parse-arr-pattern-loop st names)))
|
||||
(else nil)))))))
|
||||
|
||||
(define
|
||||
jp-skip-balanced
|
||||
(fn
|
||||
(st open close)
|
||||
(jp-expect! st "punct" open)
|
||||
(let ((depth 1)) (jp-skip-balanced-loop st open close depth))))
|
||||
|
||||
(define
|
||||
jp-skip-balanced-loop
|
||||
(fn
|
||||
(st open close depth)
|
||||
(cond
|
||||
((<= depth 0) nil)
|
||||
((>= (get st :idx) (len (get st :tokens))) nil)
|
||||
((jp-at? st "punct" open)
|
||||
(begin
|
||||
(jp-advance! st)
|
||||
(jp-skip-balanced-loop st open close (+ depth 1))))
|
||||
((jp-at? st "punct" close)
|
||||
(begin
|
||||
(jp-advance! st)
|
||||
(jp-skip-balanced-loop st open close (- depth 1))))
|
||||
(else
|
||||
(begin (jp-advance! st) (jp-skip-balanced-loop st open close depth))))))
|
||||
|
||||
(define
|
||||
jp-parse-var-stmt
|
||||
(fn
|
||||
|
||||
Reference in New Issue
Block a user