|
144 | 144 | (define range-colon-enabled #t) |
145 | 145 | ; in space-sensitive mode "x -y" is 2 expressions, not a subtraction |
146 | 146 | (define space-sensitive #f) |
147 | | -(define inside-vec #f) |
| 147 | +; seeing `for` stops parsing macro arguments and makes a generator |
| 148 | +(define for-generator #f) |
148 | 149 | ; treat 'end' like a normal symbol instead of a reserved word |
149 | 150 | (define end-symbol #f) |
150 | 151 | ; treat newline like ordinary whitespace instead of as a potential separator |
|
164 | 165 | `(with-bindings ((range-colon-enabled #t) |
165 | 166 | (space-sensitive #f) |
166 | 167 | (where-enabled #t) |
167 | | - (inside-vec #f) |
| 168 | + (for-generator #f) |
168 | 169 | (end-symbol #f) |
169 | 170 | (whitespace-newline #f)) |
170 | 171 | ,@body)) |
|
178 | 179 | (whitespace-newline #f)) |
179 | 180 | ,@body)) |
180 | 181 |
|
181 | | -(define-macro (with-inside-vec . body) |
182 | | - `(with-bindings ((space-sensitive #t) |
183 | | - (inside-vec #t) |
184 | | - (whitespace-newline #f)) |
185 | | - ,@body)) |
186 | | - |
187 | 182 | (define-macro (with-end-symbol . body) |
188 | 183 | `(with-bindings ((end-symbol #t)) |
189 | 184 | ,@body)) |
|
1129 | 1124 | ((#\( ) |
1130 | 1125 | (if (ts:space? s) (disallowed-space ex t)) |
1131 | 1126 | (take-token s) |
1132 | | - (let ((c (let ((al (parse-arglist s #\) ))) |
| 1127 | + (let ((c (let ((al (parse-call-arglist s #\) ))) |
1133 | 1128 | (receive |
1134 | 1129 | (params args) (separate (lambda (x) |
1135 | 1130 | (and (pair? x) |
|
1172 | 1167 | (cond ((eqv? (peek-token s) #\() |
1173 | 1168 | (begin |
1174 | 1169 | (take-token s) |
1175 | | - `(|.| ,ex (tuple ,@(parse-arglist s #\) ))))) |
| 1170 | + `(|.| ,ex (tuple ,@(parse-call-arglist s #\) ))))) |
1176 | 1171 | ((eqv? (peek-token s) ':) |
1177 | 1172 | (begin |
1178 | 1173 | (take-token s) |
|
1195 | 1190 | ((#\{ ) |
1196 | 1191 | (if (ts:space? s) (disallowed-space ex t)) |
1197 | 1192 | (take-token s) |
1198 | | - (loop (list* 'curly ex (parse-arglist s #\} )))) |
| 1193 | + (loop (list* 'curly ex (parse-call-arglist s #\} )))) |
1199 | 1194 | ((#\" #\`) |
1200 | 1195 | (if (and (or (symbol? ex) (valid-modref? ex)) |
1201 | 1196 | (not (operator? ex)) |
|
1629 | 1624 | (let loop ((exprs '())) |
1630 | 1625 | (if (or (closing-token? (peek-token s)) |
1631 | 1626 | (newline? (peek-token s)) |
1632 | | - (and inside-vec (eq? (peek-token s) 'for))) |
| 1627 | + (and for-generator (eq? (peek-token s) 'for))) |
1633 | 1628 | (reverse! exprs) |
1634 | 1629 | (let ((e (parse-eq s))) |
1635 | 1630 | (case (peek-token s) |
|
1645 | 1640 | x)) |
1646 | 1641 | lst)) |
1647 | 1642 |
|
| 1643 | +;; like parse-arglist, but with `for` parsed as a generator |
| 1644 | +(define (parse-call-arglist s closer) |
| 1645 | + (with-bindings ((for-generator #t)) |
| 1646 | + (parse-arglist s closer))) |
| 1647 | + |
1648 | 1648 | ;; handle function call argument list, or any comma-delimited list. |
1649 | 1649 | ;; . an extra comma at the end is allowed |
1650 | 1650 | ;; . expressions after a ; are enclosed in (parameters ...) |
1651 | 1651 | ;; . an expression followed by ... becomes (... x) |
1652 | 1652 | (define (parse-arglist s closer) |
1653 | | -(with-normal-ops |
1654 | | - (with-whitespace-newline |
| 1653 | +(with-bindings ((range-colon-enabled #t) |
| 1654 | + (space-sensitive #f) |
| 1655 | + (where-enabled #t) |
| 1656 | + (whitespace-newline #t)) |
1655 | 1657 | (let loop ((lst '())) |
1656 | 1658 | (let ((t (require-token s))) |
1657 | 1659 | (if (eqv? t closer) |
|
1689 | 1691 | (error (string "unexpected \"" c "\" in argument list"))) |
1690 | 1692 | (else |
1691 | 1693 | (error (string "missing comma or " closer |
1692 | | - " in argument list")))))))))))) |
| 1694 | + " in argument list"))))))))))) |
1693 | 1695 |
|
1694 | 1696 | (define (parse-vect s first closer) |
1695 | 1697 | (let loop ((lst '()) |
|
1709 | 1711 | ((#\;) |
1710 | 1712 | (if (eqv? (require-token s) closer) |
1711 | 1713 | (loop lst nxt) |
1712 | | - (let ((params (parse-arglist s closer))) |
| 1714 | + (let ((params (parse-call-arglist s closer))) |
1713 | 1715 | `(vcat ,@params ,@(reverse lst) ,nxt)))) |
1714 | 1716 | ((#\] #\}) |
1715 | 1717 | (error (string "unexpected \"" t "\""))) |
|
1792 | 1794 | (error (string "expected space before \"" t "\"")))) |
1793 | 1795 |
|
1794 | 1796 | (define (parse-cat s closer last-end-symbol) |
1795 | | - (with-normal-ops |
1796 | | - (with-inside-vec |
| 1797 | + (with-bindings ((range-colon-enabled #t) |
| 1798 | + (space-sensitive #t) |
| 1799 | + (where-enabled #t) |
| 1800 | + (whitespace-newline #f) |
| 1801 | + (for-generator #t)) |
1797 | 1802 | (if (eqv? (require-token s) closer) |
1798 | 1803 | (begin (take-token s) |
1799 | 1804 | '()) |
|
1811 | 1816 | (parse-vect s first closer) |
1812 | 1817 | (parse-matrix s first closer #t last-end-symbol))) |
1813 | 1818 | (else |
1814 | | - (parse-matrix s first closer #f last-end-symbol)))))))) |
| 1819 | + (parse-matrix s first closer #f last-end-symbol))))))) |
1815 | 1820 |
|
1816 | 1821 | (define (kw-to-= e) (if (kwarg? e) (cons '= (cdr e)) e)) |
1817 | 1822 | (define (=-to-kw e) (if (assignment? e) (cons 'kw (cdr e)) e)) |
|
0 commit comments