fix disappeared-binding information in a syntax-template expansion with a binding is used more than once
svn: r5947
This commit is contained in:
parent
a61b6bc4a2
commit
5d1f33670a
File diff suppressed because it is too large
Load Diff
|
@ -1330,9 +1330,13 @@
|
||||||
" #f"
|
" #f"
|
||||||
"(lambda(r)"
|
"(lambda(r)"
|
||||||
"(let((l(hash-table-get ht(syntax-e r) null)))"
|
"(let((l(hash-table-get ht(syntax-e r) null)))"
|
||||||
"(unless(and(pair? l)"
|
"(let((pr(and(pair? l)"
|
||||||
"(ormap(lambda(i)(bound-identifier=? i r)) l))"
|
"(ormap(lambda(i) "
|
||||||
"(hash-table-put! ht(syntax-e r)(cons r l)))))))))"
|
"(and(bound-identifier=?(car i) r) i))"
|
||||||
|
" l))))"
|
||||||
|
"(if pr"
|
||||||
|
"(set-cdr! pr(cons r(cdr pr)))"
|
||||||
|
"(hash-table-put! ht(syntax-e r)(cons(cons r(list r)) l))))))))))"
|
||||||
"(if proto-r"
|
"(if proto-r"
|
||||||
" `(lambda(r)"
|
" `(lambda(r)"
|
||||||
" ,(let((main(let((build(apply-to-r l)))"
|
" ,(let((main(let((build(apply-to-r l)))"
|
||||||
|
@ -1353,7 +1357,10 @@
|
||||||
"(quote ,p)"
|
"(quote ,p)"
|
||||||
"(quote-syntax ,(datum->syntax-object #f '... p)))"
|
"(quote-syntax ,(datum->syntax-object #f '... p)))"
|
||||||
" main)))"
|
" main)))"
|
||||||
"(apply append(hash-table-map ht(lambda(k v) v))))))"
|
"(let((l(apply append(hash-table-map ht(lambda(k v) v)))))"
|
||||||
|
"(values"
|
||||||
|
"(map car l)"
|
||||||
|
"(map cdr l))))))"
|
||||||
"(-define(apply-to-r rest)"
|
"(-define(apply-to-r rest)"
|
||||||
"(if(and(pair? rest)"
|
"(if(and(pair? rest)"
|
||||||
"(eq?(car rest) 'lambda)"
|
"(eq?(car rest) 'lambda)"
|
||||||
|
@ -1935,7 +1942,7 @@
|
||||||
"(datum->syntax-object"
|
"(datum->syntax-object"
|
||||||
" here-stx"
|
" here-stx"
|
||||||
"(let((pattern(stx-car(stx-cdr x))))"
|
"(let((pattern(stx-car(stx-cdr x))))"
|
||||||
"(let((unique-vars(make-pexpand pattern #f null #f)))"
|
"(let-values(((unique-vars all-varss)(make-pexpand pattern #f null #f)))"
|
||||||
"(let((var-bindings"
|
"(let((var-bindings"
|
||||||
"(map"
|
"(map"
|
||||||
"(lambda(var)"
|
"(lambda(var)"
|
||||||
|
@ -1970,7 +1977,7 @@
|
||||||
"(cons(car vars) rest)))))))"
|
"(cons(car vars) rest)))))))"
|
||||||
"(let((build-from-template"
|
"(let((build-from-template"
|
||||||
"(make-pexpand pattern proto-r non-pattern-vars pattern))"
|
"(make-pexpand pattern proto-r non-pattern-vars pattern))"
|
||||||
"(r(let loop((vars unique-vars)(bindings var-bindings))"
|
"(r(let loop((vars unique-vars)(bindings var-bindings)(all-varss all-varss))"
|
||||||
"(cond"
|
"(cond"
|
||||||
"((null? bindings) null)"
|
"((null? bindings) null)"
|
||||||
"((car bindings)"
|
"((car bindings)"
|
||||||
|
@ -1981,9 +1988,9 @@
|
||||||
"(syntax-e(syntax-mapping-valvar(car bindings)))"
|
"(syntax-e(syntax-mapping-valvar(car bindings)))"
|
||||||
" x)"
|
" x)"
|
||||||
" 'disappeared-use"
|
" 'disappeared-use"
|
||||||
"(car vars))"
|
"(car all-varss))"
|
||||||
"(loop(cdr vars)(cdr bindings))))"
|
"(loop(cdr vars)(cdr bindings)(cdr all-varss))))"
|
||||||
"(else(loop(cdr vars)(cdr bindings)))))))"
|
"(else(loop(cdr vars)(cdr bindings)(cdr all-varss)))))))"
|
||||||
"(if(identifier? pattern)"
|
"(if(identifier? pattern)"
|
||||||
"(car r)"
|
"(car r)"
|
||||||
"(list(datum->syntax-object"
|
"(list(datum->syntax-object"
|
||||||
|
|
|
@ -1554,9 +1554,13 @@
|
||||||
#f
|
#f
|
||||||
(lambda (r)
|
(lambda (r)
|
||||||
(let ([l (hash-table-get ht (syntax-e r) null)])
|
(let ([l (hash-table-get ht (syntax-e r) null)])
|
||||||
(unless (and (pair? l)
|
(let ([pr (and (pair? l)
|
||||||
(ormap (lambda (i) (bound-identifier=? i r)) l))
|
(ormap (lambda (i)
|
||||||
(hash-table-put! ht (syntax-e r) (cons r l)))))))])
|
(and (bound-identifier=? (car i) r) i))
|
||||||
|
l))])
|
||||||
|
(if pr
|
||||||
|
(set-cdr! pr (cons r (cdr pr)))
|
||||||
|
(hash-table-put! ht (syntax-e r) (cons (cons r (list r)) l))))))))])
|
||||||
(if proto-r
|
(if proto-r
|
||||||
`(lambda (r)
|
`(lambda (r)
|
||||||
,(let ([main (let ([build (apply-to-r l)])
|
,(let ([main (let ([build (apply-to-r l)])
|
||||||
|
@ -1578,8 +1582,12 @@
|
||||||
;; This is a trick to minimize the syntax structure we keep:
|
;; This is a trick to minimize the syntax structure we keep:
|
||||||
(quote-syntax ,(datum->syntax-object #f '... p)))
|
(quote-syntax ,(datum->syntax-object #f '... p)))
|
||||||
main)))
|
main)))
|
||||||
;; Get list of unique vars:
|
(let ([l (apply append (hash-table-map ht (lambda (k v) v)))])
|
||||||
(apply append (hash-table-map ht (lambda (k v) v))))))
|
(values
|
||||||
|
;; Get list of unique vars:
|
||||||
|
(map car l)
|
||||||
|
;; All ids, including duplicates:
|
||||||
|
(map cdr l))))))
|
||||||
|
|
||||||
;; apply-to-r creates an S-expression that applies
|
;; apply-to-r creates an S-expression that applies
|
||||||
;; rest to `r', but it also optimizes ((lambda (r) E) r)
|
;; rest to `r', but it also optimizes ((lambda (r) E) r)
|
||||||
|
@ -2244,7 +2252,7 @@
|
||||||
(datum->syntax-object
|
(datum->syntax-object
|
||||||
here-stx
|
here-stx
|
||||||
(let ([pattern (stx-car (stx-cdr x))])
|
(let ([pattern (stx-car (stx-cdr x))])
|
||||||
(let ([unique-vars (make-pexpand pattern #f null #f)])
|
(let-values ([(unique-vars all-varss) (make-pexpand pattern #f null #f)])
|
||||||
(let ([var-bindings
|
(let ([var-bindings
|
||||||
(map
|
(map
|
||||||
(lambda (var)
|
(lambda (var)
|
||||||
|
@ -2283,7 +2291,7 @@
|
||||||
;; Even if we don't use the builder, we need to check
|
;; Even if we don't use the builder, we need to check
|
||||||
;; for a well-formed pattern:
|
;; for a well-formed pattern:
|
||||||
(make-pexpand pattern proto-r non-pattern-vars pattern)]
|
(make-pexpand pattern proto-r non-pattern-vars pattern)]
|
||||||
[r (let loop ([vars unique-vars][bindings var-bindings])
|
[r (let loop ([vars unique-vars][bindings var-bindings][all-varss all-varss])
|
||||||
(cond
|
(cond
|
||||||
[(null? bindings) null]
|
[(null? bindings) null]
|
||||||
[(car bindings)
|
[(car bindings)
|
||||||
|
@ -2294,9 +2302,9 @@
|
||||||
(syntax-e (syntax-mapping-valvar (car bindings)))
|
(syntax-e (syntax-mapping-valvar (car bindings)))
|
||||||
x)
|
x)
|
||||||
'disappeared-use
|
'disappeared-use
|
||||||
(car vars))
|
(car all-varss))
|
||||||
(loop (cdr vars) (cdr bindings)))]
|
(loop (cdr vars) (cdr bindings) (cdr all-varss)))]
|
||||||
[else (loop (cdr vars) (cdr bindings))]))])
|
[else (loop (cdr vars) (cdr bindings) (cdr all-varss))]))])
|
||||||
(if (identifier? pattern)
|
(if (identifier? pattern)
|
||||||
;; Simple syntax-id lookup:
|
;; Simple syntax-id lookup:
|
||||||
(car r)
|
(car r)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user