Skip to content

Commit 4443010

Browse files
authored
lower x for x in ... to identity function in generator exprs (#34119)
1 parent 3e34cbb commit 4443010

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/julia-syntax.scm

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,22 +1612,28 @@
16121612
(else
16131613
`(,@(map (lambda (v) `(local ,v)) myvars)
16141614
(= (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)))))))
16311637

16321638
(define (expand-generator e flat outervars)
16331639
(let* ((expr (cadr e))

0 commit comments

Comments
 (0)