|
984 | 984 | ((#\") '_str)
|
985 | 985 | ((#\`) '_cmd)))
|
986 | 986 |
|
987 |
| -(define (parse-call-chain s ex one-call) |
| 987 | +(define (parse-call-chain s ex macrocall?) |
988 | 988 | (let loop ((ex ex))
|
989 | 989 | (let ((t (peek-token s)))
|
990 | 990 | (if (or (and space-sensitive (ts:space? s)
|
|
997 | 997 | ((#\( )
|
998 | 998 | (if (ts:space? s) (disallowed-space ex t))
|
999 | 999 | (take-token s)
|
1000 |
| - (let ((c (let ((al (parse-arglist s #\) ))) |
1001 |
| - (receive |
1002 |
| - (params args) (separate (lambda (x) |
1003 |
| - (and (pair? x) |
1004 |
| - (eq? (car x) 'parameters))) |
1005 |
| - al) |
1006 |
| - (if (eq? (peek-token s) 'do) |
1007 |
| - (begin |
1008 |
| - (take-token s) |
1009 |
| - `(call ,ex ,@params ,(parse-do s) ,@args)) |
1010 |
| - `(call ,ex ,@al)))))) |
1011 |
| - (if one-call |
1012 |
| - c |
1013 |
| - (loop c)))) |
| 1000 | + (if macrocall? |
| 1001 | + (let ((args (if (eqv? (require-token s) #\) ) |
| 1002 | + (begin (take-token s) '()) |
| 1003 | + (begin0 (with-normal-ops |
| 1004 | + (with-whitespace-newline |
| 1005 | + (parse-comma-separated s parse-eq* #t))) |
| 1006 | + (if (not (eqv? (require-token s) #\) )) |
| 1007 | + (error "missing ) in argument list")) |
| 1008 | + (take-token s))))) |
| 1009 | + `(call ,ex ,@args)) |
| 1010 | + (loop (let ((al (parse-arglist s #\) ))) |
| 1011 | + (receive |
| 1012 | + (params args) (separate (lambda (x) |
| 1013 | + (and (pair? x) |
| 1014 | + (eq? (car x) 'parameters))) |
| 1015 | + al) |
| 1016 | + (if (eq? (peek-token s) 'do) |
| 1017 | + (begin |
| 1018 | + (take-token s) |
| 1019 | + `(call ,ex ,@params ,(parse-do s) ,@args)) |
| 1020 | + `(call ,ex ,@al))))))) |
1014 | 1021 | ((#\[ )
|
1015 | 1022 | (if (ts:space? s) (disallowed-space ex t))
|
1016 | 1023 | (take-token s)
|
|
1400 | 1407 | `(,word ,@(reverse path)))))))
|
1401 | 1408 |
|
1402 | 1409 | ;; parse comma-separated assignments, like "i=1:n,j=1:m,..."
|
1403 |
| -(define (parse-comma-separated s what) |
| 1410 | +(define (parse-comma-separated s what (in-parens #f)) |
1404 | 1411 | (let loop ((exprs '()))
|
1405 | 1412 | (let ((r (what s)))
|
1406 | 1413 | (case (peek-token s)
|
1407 |
| - ((#\,) (take-token s) (loop (cons r exprs))) |
| 1414 | + ((#\,) |
| 1415 | + (take-token s) |
| 1416 | + (if (and in-parens (eqv? (require-token s) #\) )) |
| 1417 | + (reverse! (cons r exprs)) |
| 1418 | + (loop (cons r exprs)))) |
1408 | 1419 | (else (reverse! (cons r exprs)))))))
|
1409 | 1420 |
|
1410 | 1421 | (define (parse-comma-separated-assignments s)
|
|
0 commit comments