|
1524 | 1524 | (define (syntactic-op-to-call e)
|
1525 | 1525 | `(call ,(car e) ,(expand-forms (cadr e)) ,(expand-forms (caddr e))))
|
1526 | 1526 |
|
| 1527 | +;; wrap `expr` in a function appropriate for consuming values from given ranges |
| 1528 | +(define (func-for-generator-ranges expr range-exprs) |
| 1529 | + (let* ((vars (map cadr range-exprs)) |
| 1530 | + (argname (if (and (length= vars 1) (symbol? (car vars))) |
| 1531 | + (car vars) |
| 1532 | + (gensy))) |
| 1533 | + (splat (cond ((eq? argname (car vars)) '()) |
| 1534 | + ((length= vars 1) |
| 1535 | + `(,@(map (lambda (v) `(local ,v)) (lhs-vars (car vars))) |
| 1536 | + (= ,(car vars) ,argname))) |
| 1537 | + (else |
| 1538 | + `(,@(map (lambda (v) `(local ,v)) (lhs-vars `(tuple ,@vars))) |
| 1539 | + (= (tuple ,@vars) ,argname)))))) |
| 1540 | + (if (and (null? splat) |
| 1541 | + (length= expr 3) (eq? (car expr) 'call) |
| 1542 | + (eq? (caddr expr) argname) |
| 1543 | + (not (expr-contains-eq argname (cadr expr)))) |
| 1544 | + (cadr expr) ;; eta reduce `x->f(x)` => `f` |
| 1545 | + `(-> ,argname (block ,@splat ,expr))))) |
| 1546 | + |
1527 | 1547 | ;; table mapping expression head to a function expanding that form
|
1528 | 1548 | (define expand-table
|
1529 | 1549 | (table
|
|
1958 | 1978 |
|
1959 | 1979 | 'generator
|
1960 | 1980 | (lambda (e)
|
1961 |
| - (let ((expr (cadr e)) |
1962 |
| - (vars (map cadr (cddr e))) |
1963 |
| - (ranges (map caddr (cddr e)))) |
1964 |
| - (let* ((argname (if (and (length= vars 1) (symbol? (car vars))) |
1965 |
| - (car vars) |
1966 |
| - (gensy))) |
1967 |
| - (splat (cond ((eq? argname (car vars)) '()) |
1968 |
| - ((length= vars 1) |
1969 |
| - `(,@(map (lambda (v) `(local ,v)) (lhs-vars (car vars))) |
1970 |
| - (= ,(car vars) ,argname))) |
1971 |
| - (else |
1972 |
| - `(,@(map (lambda (v) `(local ,v)) (lhs-vars `(tuple ,@vars))) |
1973 |
| - (= (tuple ,@vars) ,argname)))))) |
1974 |
| - (expand-forms |
1975 |
| - `(call (top Generator) |
1976 |
| - ,(if (and (null? splat) |
1977 |
| - (length= expr 3) (eq? (car expr) 'call) |
1978 |
| - (eq? (caddr expr) argname) |
1979 |
| - (not (expr-contains-eq argname (cadr expr)))) |
1980 |
| - (cadr expr) ;; eta reduce `x->f(x)` => `f` |
1981 |
| - `(-> ,argname (block ,@splat ,expr))) |
1982 |
| - ,(if (length= ranges 1) |
| 1981 | + (let* ((expr (cadr e)) |
| 1982 | + (filt? (eq? (car (caddr e)) 'filter)) |
| 1983 | + (range-exprs (if filt? (cddr (caddr e)) (cddr e))) |
| 1984 | + (ranges (map caddr range-exprs)) |
| 1985 | + (iter (if (length= ranges 1) |
1983 | 1986 | (car ranges)
|
1984 |
| - `(call (top product) ,@ranges))))))) |
| 1987 | + `(call (top product) ,@ranges))) |
| 1988 | + (iter (if filt? |
| 1989 | + `(call (top Filter) |
| 1990 | + ,(func-for-generator-ranges (cadr (caddr e)) range-exprs) |
| 1991 | + ,iter) |
| 1992 | + iter))) |
| 1993 | + (expand-forms |
| 1994 | + `(call (top Generator) |
| 1995 | + ,(func-for-generator-ranges expr range-exprs) |
| 1996 | + ,iter)))) |
| 1997 | + |
| 1998 | + 'flatten |
| 1999 | + (lambda (e) `(call (top Flatten) ,(expand-forms (cadr e)))) |
1985 | 2000 |
|
1986 | 2001 | 'comprehension
|
1987 | 2002 | (lambda (e)
|
1988 |
| - (if (any (lambda (x) (eq? x ':)) (cddr e)) |
1989 |
| - (error "comprehension syntax with `:` ranges has been removed")) |
1990 |
| - (expand-forms `(call (top collect) (generator ,(cadr e) ,@(cddr e))))) |
| 2003 | + (if (length> e 2) |
| 2004 | + ;; backwards compat for macros that generate :comprehension exprs |
| 2005 | + (expand-forms `(comprehension (generator ,@(cdr e)))) |
| 2006 | + (begin (if (and (eq? (caadr e) 'generator) |
| 2007 | + (any (lambda (x) (eq? x ':)) (cddr (cadr e)))) |
| 2008 | + (error "comprehension syntax with `:` ranges has been removed")) |
| 2009 | + (expand-forms `(call (top collect) ,(cadr e)))))) |
1991 | 2010 |
|
1992 | 2011 | 'typed_comprehension
|
1993 | 2012 | (lambda (e)
|
1994 |
| - (if (any (lambda (x) (eq? x ':)) (cdddr e)) |
1995 |
| - (error "comprehension syntax with `:` ranges has been removed")) |
1996 |
| - (expand-forms (lower-comprehension (cadr e) (caddr e) (cdddr e)))) |
| 2013 | + (expand-forms |
| 2014 | + (or (and (eq? (caaddr e) 'generator) |
| 2015 | + (let ((ranges (cddr (caddr e)))) |
| 2016 | + (if (any (lambda (x) (eq? x ':)) ranges) |
| 2017 | + (error "comprehension syntax with `:` ranges has been removed")) |
| 2018 | + (and (every (lambda (x) (and (pair? x) (eq? (car x) '=) |
| 2019 | + (pair? (caddr x)) (eq? (car (caddr x)) ':))) |
| 2020 | + ranges) |
| 2021 | + ;; TODO: this is a hack to lower simple comprehensions to loops very |
| 2022 | + ;; early, to greatly reduce the # of functions and load on the compiler |
| 2023 | + (lower-comprehension (cadr e) (cadr (caddr e)) ranges)))) |
| 2024 | + `(call (top collect) ,(cadr e) ,(caddr e))))) |
1997 | 2025 |
|
1998 | 2026 | 'dict_comprehension
|
1999 | 2027 | (lambda (e)
|
2000 | 2028 | (syntax-deprecation #f "[a=>b for (a,b) in c]" "Dict(a=>b for (a,b) in c)")
|
2001 |
| - (expand-forms `(call (top Dict) (generator ,(cadr e) ,@(cddr e))))) |
| 2029 | + (expand-forms `(call (top Dict) ,(cadr e)))) |
2002 | 2030 |
|
2003 | 2031 | 'typed_dict_comprehension
|
2004 | 2032 | (lambda (e) (expand-forms
|
2005 | 2033 | `(call (call (core apply_type) (top Dict) ,@(cdr (cadr e)))
|
2006 |
| - (generator ,(caddr e) ,@(cdddr e))))))) |
| 2034 | + ,(caddr e)))))) |
2007 | 2035 |
|
2008 | 2036 | (define (lower-comprehension atype expr ranges)
|
2009 | 2037 | (let ((result (make-ssavalue))
|
|
0 commit comments