|
1612 | 1612 | (else
|
1613 | 1613 | `(,@(map (lambda (v) `(local ,v)) myvars)
|
1614 | 1614 | (= (tuple ,@vars) ,argname))))))
|
1615 |
| - (if (and (null? splat) |
1616 |
| - (length= expr 3) (eq? (car expr) 'call) |
1617 |
| - (eq? (caddr expr) argname) |
1618 |
| - (not (dotop-named? (cadr expr))) |
1619 |
| - (not (expr-contains-eq argname (cadr expr)))) |
1620 |
| - (cadr expr) ;; eta reduce `x->f(x)` => `f` |
1621 |
| - (let ((expr (cond ((and flat (pair? expr) (eq? (car expr) 'generator)) |
1622 |
| - (expand-generator expr #f (delete-duplicates (append outervars myvars)))) |
1623 |
| - ((and flat (pair? expr) (eq? (car expr) 'flatten)) |
1624 |
| - (expand-generator (cadr expr) #t (delete-duplicates (append outervars myvars)))) |
1625 |
| - ((pair? outervars) |
1626 |
| - `(let (block ,@(map (lambda (v) `(= ,v ,v)) (filter (lambda (x) (not (underscore-symbol? x))) |
1627 |
| - outervars))) |
1628 |
| - ,expr)) |
1629 |
| - (else expr)))) |
1630 |
| - `(-> ,argname (block ,@splat ,expr)))))) |
| 1615 | + (cond |
| 1616 | + ((eq? expr argname) |
| 1617 | + ;; use `identity` for x->x |
| 1618 | + `(top identity)) |
| 1619 | + ((and (null? splat) |
| 1620 | + (length= expr 3) (eq? (car expr) 'call) |
| 1621 | + (eq? (caddr expr) argname) |
| 1622 | + (not (dotop-named? (cadr expr))) |
| 1623 | + (not (expr-contains-eq argname (cadr expr)))) |
| 1624 | + ;; eta reduce `x->f(x)` => `f` |
| 1625 | + (cadr expr)) |
| 1626 | + (else |
| 1627 | + (let ((expr (cond ((and flat (pair? expr) (eq? (car expr) 'generator)) |
| 1628 | + (expand-generator expr #f (delete-duplicates (append outervars myvars)))) |
| 1629 | + ((and flat (pair? expr) (eq? (car expr) 'flatten)) |
| 1630 | + (expand-generator (cadr expr) #t (delete-duplicates (append outervars myvars)))) |
| 1631 | + ((pair? outervars) |
| 1632 | + `(let (block ,@(map (lambda (v) `(= ,v ,v)) (filter (lambda (x) (not (underscore-symbol? x))) |
| 1633 | + outervars))) |
| 1634 | + ,expr)) |
| 1635 | + (else expr)))) |
| 1636 | + `(-> ,argname (block ,@splat ,expr))))))) |
1631 | 1637 |
|
1632 | 1638 | (define (expand-generator e flat outervars)
|
1633 | 1639 | (let* ((expr (cadr e))
|
|
0 commit comments