...
svn: r1816
This commit is contained in:
parent
2ab94a5bf3
commit
634d76c5af
|
@ -277,8 +277,8 @@
|
||||||
(define (result-value-break vals-list)
|
(define (result-value-break vals-list)
|
||||||
(break (current-continuation-marks) 'result-value-break vals-list))
|
(break (current-continuation-marks) 'result-value-break vals-list))
|
||||||
|
|
||||||
(define (result-value-break/begin vals-list)
|
(define (normal-break/values vals-list)
|
||||||
(break (current-continuation-marks) 'result-value-break/begin vals-list))
|
(break (current-continuation-marks) 'normal-break/values vals-list))
|
||||||
|
|
||||||
(define (exp-finished-break info-list)
|
(define (exp-finished-break info-list)
|
||||||
(break #f 'expr-finished-break info-list))
|
(break #f 'expr-finished-break info-list))
|
||||||
|
@ -312,14 +312,13 @@
|
||||||
(apply values args)))))
|
(apply values args)))))
|
||||||
|
|
||||||
;; wrap a return-value-break around exp
|
;; wrap a return-value-break around exp
|
||||||
(define return-value-wrap
|
(define return-value-wrap
|
||||||
(return-value-wrap-maker result-value-break))
|
(return-value-wrap-maker result-value-break))
|
||||||
|
|
||||||
;; wrap a return-value-break/begin around exp
|
;; wrap a normal-break/values around exp
|
||||||
(define return-value-wrap/begin
|
(define normal-break/values-wrap
|
||||||
(return-value-wrap-maker result-value-break/begin))
|
(return-value-wrap-maker normal-break/values))
|
||||||
|
|
||||||
|
|
||||||
(define (make-define-struct-break exp)
|
(define (make-define-struct-break exp)
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(break #f 'expr-finished-break (list (list (lambda () exp)
|
(break #f 'expr-finished-break (list (list (lambda () exp)
|
||||||
|
@ -410,19 +409,19 @@
|
||||||
|
|
||||||
;; no pre-break, tail w.r.t. new bindings:
|
;; no pre-break, tail w.r.t. new bindings:
|
||||||
[let-body-recur/single
|
[let-body-recur/single
|
||||||
(lambda (exp bindings)
|
(lambda (exp bindings)
|
||||||
(annotate/inner exp (binding-set-union (list tail-bound bindings)) #f procedure-name-info))]
|
(annotate/inner exp (binding-set-union (list tail-bound bindings)) #f procedure-name-info))]
|
||||||
|
|
||||||
;; no pre-break, non-tail w.r.t. new bindings
|
;; no pre-break, non-tail w.r.t. new bindings
|
||||||
[let-body-recur/first
|
[let-body-recur/first
|
||||||
(lambda (exp)
|
(lambda (exp)
|
||||||
(return-value-wrap/begin
|
(normal-break/values-wrap
|
||||||
(non-tail-recur exp)))]
|
(non-tail-recur exp)))]
|
||||||
|
|
||||||
;; yes pre-break, non-tail w.r.t. new bindings
|
;; yes pre-break, non-tail w.r.t. new bindings
|
||||||
[let-body-recur/middle
|
[let-body-recur/middle
|
||||||
(lambda (exp)
|
(lambda (exp)
|
||||||
(return-value-wrap/begin
|
(normal-break/values-wrap
|
||||||
(annotate/inner exp null #t #f)))]
|
(annotate/inner exp null #t #f)))]
|
||||||
|
|
||||||
;; yes pre-break, tail w.r.t. new bindings:
|
;; yes pre-break, tail w.r.t. new bindings:
|
||||||
|
@ -430,6 +429,8 @@
|
||||||
(lambda (exp bindings)
|
(lambda (exp bindings)
|
||||||
(annotate/inner exp (binding-set-union (list tail-bound bindings)) #f procedure-name-info))]
|
(annotate/inner exp (binding-set-union (list tail-bound bindings)) #f procedure-name-info))]
|
||||||
|
|
||||||
|
;; different flavors of make-debug-info allow users to provide only the needed fields:
|
||||||
|
|
||||||
[make-debug-info-normal (lambda (free-bindings)
|
[make-debug-info-normal (lambda (free-bindings)
|
||||||
(make-debug-info exp tail-bound free-bindings 'none #t))]
|
(make-debug-info exp tail-bound free-bindings 'none #t))]
|
||||||
[make-debug-info-app (lambda (tail-bound free-bindings label)
|
[make-debug-info-app (lambda (tail-bound free-bindings label)
|
||||||
|
@ -456,6 +457,17 @@
|
||||||
annotated)
|
annotated)
|
||||||
free-vars))]
|
free-vars))]
|
||||||
|
|
||||||
|
|
||||||
|
; @@ @@ @@
|
||||||
|
; @ @ @
|
||||||
|
; @ $@$: @@+-$: @-@$ $@:@ $@$:
|
||||||
|
; @ -@ @+@$@ @+ *$ $* *@ -@
|
||||||
|
; @ -$@$@ @ @ @ @ @ @ @ -$@$@
|
||||||
|
; @ $* @ @ @ @ @ @ @ @ $* @
|
||||||
|
; @ @- *@ @ @ @ @ +$ $* *@ @- *@
|
||||||
|
; @@@@@ -$$-@@@@@@@@@@@+@$ $@:@@ -$$-@@
|
||||||
|
;
|
||||||
|
|
||||||
[lambda-clause-abstraction
|
[lambda-clause-abstraction
|
||||||
(lambda (clause)
|
(lambda (clause)
|
||||||
(with-syntax ([(args-stx . bodies) clause])
|
(with-syntax ([(args-stx . bodies) clause])
|
||||||
|
@ -503,6 +515,17 @@
|
||||||
|
|
||||||
(normal-bundle free-varrefs captured)))]
|
(normal-bundle free-varrefs captured)))]
|
||||||
|
|
||||||
|
|
||||||
|
; @@
|
||||||
|
; @ @
|
||||||
|
; @ -@@$ @@@@@
|
||||||
|
; @ $ -$ @
|
||||||
|
; @ @@@@@ @
|
||||||
|
; @ $ @
|
||||||
|
; @ +: @: :$
|
||||||
|
; @@@@@ $@@+ :@@$-
|
||||||
|
|
||||||
|
|
||||||
; The let transformation is complicated.
|
; The let transformation is complicated.
|
||||||
; here's a sample transformation (not including 'break's):
|
; here's a sample transformation (not including 'break's):
|
||||||
;(let-values ([(a b c) e1] [(d e) e2]) e3)
|
;(let-values ([(a b c) e1] [(d e) e2]) e3)
|
||||||
|
@ -635,7 +658,7 @@
|
||||||
|
|
||||||
;; pulling out begin abstraction!
|
;; pulling out begin abstraction!
|
||||||
;;; bLECCh! I think I can do this with a MAP, rather than a fold.
|
;;; bLECCh! I think I can do this with a MAP, rather than a fold.
|
||||||
[begin-abstraction
|
#;[begin-abstraction
|
||||||
(lambda (bodies)
|
(lambda (bodies)
|
||||||
|
|
||||||
(if
|
(if
|
||||||
|
@ -679,12 +702,24 @@
|
||||||
|
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
|
||||||
|
; @ :@@$
|
||||||
|
; @:
|
||||||
|
; -@@ @@@@@
|
||||||
|
; @ @
|
||||||
|
; @ @
|
||||||
|
; @ @
|
||||||
|
; @ @
|
||||||
|
; @@@@@ @@@@@
|
||||||
|
|
||||||
; if-abstraction: (-> syntax? syntax? (union false/c syntax?) (values syntax? varref-set?))
|
; if-abstraction: (-> syntax? syntax? (union false/c syntax?) (values syntax? varref-set?))
|
||||||
[if-abstraction
|
[if-abstraction
|
||||||
(lambda (test then else)
|
(lambda (test then else)
|
||||||
(let*-2vals
|
(let*-2vals
|
||||||
([(annotated-test free-varrefs-test)
|
([(annotated-test free-varrefs-test)
|
||||||
(non-tail-recur test)]
|
(non-tail-recur test)]
|
||||||
|
[test-with-break
|
||||||
|
(normal-break/values-wrap annotated-test)]
|
||||||
[(annotated-then free-varrefs-then)
|
[(annotated-then free-varrefs-then)
|
||||||
(tail-recur then)]
|
(tail-recur then)]
|
||||||
[(annotated-else free-varrefs-else)
|
[(annotated-else free-varrefs-else)
|
||||||
|
@ -695,22 +730,24 @@
|
||||||
free-varrefs-then
|
free-varrefs-then
|
||||||
free-varrefs-else))]
|
free-varrefs-else))]
|
||||||
[annotated-if
|
[annotated-if
|
||||||
#`(begin (set! #,if-temp #,annotated-test)
|
(if else
|
||||||
(#,normal-break)
|
(quasisyntax/loc exp (if #,test-with-break #,annotated-then #,annotated-else))
|
||||||
#,(if else
|
(quasisyntax/loc exp (if #,test-with-break #,annotated-then)))])
|
||||||
(quasisyntax/loc exp (if #,if-temp #,annotated-then #,annotated-else))
|
|
||||||
(quasisyntax/loc exp (if #,if-temp #,annotated-then))))]
|
|
||||||
[wrapped (outer-wcm-wrap (make-debug-info-app (binding-set-union (list tail-bound (list if-temp)))
|
|
||||||
(varref-set-union (list free-varrefs (list if-temp)))
|
|
||||||
'none)
|
|
||||||
annotated-if)])
|
|
||||||
(2vals
|
(2vals
|
||||||
(with-syntax ([test-var if-temp]
|
(outer-wcm-wrap (make-debug-info-normal free-varrefs) annotated-if)
|
||||||
[wrapped-stx wrapped]
|
|
||||||
[unevaluated-stx *unevaluated*])
|
|
||||||
(syntax/loc exp (let ([test-var unevaluated-stx]) wrapped-stx)))
|
|
||||||
free-varrefs)))]
|
free-varrefs)))]
|
||||||
|
|
||||||
|
|
||||||
|
; :@@$
|
||||||
|
; @:
|
||||||
|
; @@@ @@@ $@$: @@-$+ @@-$+ -@@$ @@@@@
|
||||||
|
; $ $ -@ @$ : @$ : $ -$ @
|
||||||
|
; +: ++ -$@$@ @ @ @@@@@ @
|
||||||
|
; $ $ $* @ @ @ $ @
|
||||||
|
; $:+ @- *@ @ @ +: @
|
||||||
|
; :@ -$$-@@ @@@@@ @@@@@ $@@+ @@@@@
|
||||||
|
|
||||||
|
|
||||||
[varref-abstraction
|
[varref-abstraction
|
||||||
(lambda (var)
|
(lambda (var)
|
||||||
(let*-2vals ([free-varrefs (list var)]
|
(let*-2vals ([free-varrefs (list var)]
|
||||||
|
@ -787,7 +824,7 @@
|
||||||
[(begin . bodies-stx)
|
[(begin . bodies-stx)
|
||||||
(begin
|
(begin
|
||||||
(error 'annotate-inner "nothing expands into begin! : ~v" (syntax-object->datum exp))
|
(error 'annotate-inner "nothing expands into begin! : ~v" (syntax-object->datum exp))
|
||||||
(begin-abstraction (syntax->list #`bodies-stx)))]
|
#;(begin-abstraction (syntax->list #`bodies-stx)))]
|
||||||
|
|
||||||
[(begin0 . bodies-stx)
|
[(begin0 . bodies-stx)
|
||||||
(let*-2vals
|
(let*-2vals
|
||||||
|
@ -817,36 +854,57 @@
|
||||||
#`letrec-values
|
#`letrec-values
|
||||||
(lambda (bindings) (map (lambda (b) #`#,b) bindings)))]
|
(lambda (bindings) (map (lambda (b) #`#,b) bindings)))]
|
||||||
|
|
||||||
|
|
||||||
|
; $
|
||||||
|
; @ @
|
||||||
|
; :@@+@ -@@$ @@@@@ @
|
||||||
|
; @$ -@ $ -$ @ @
|
||||||
|
; :@@$- @@@@@ @ @
|
||||||
|
; *@ $ @
|
||||||
|
; @ :@ +: @: :$
|
||||||
|
; $+@@: $@@+ :@@$- $
|
||||||
|
|
||||||
|
|
||||||
[(set! var val)
|
[(set! var val)
|
||||||
(let*-2vals
|
(let*-2vals
|
||||||
([(annotated-val val-free-varrefs)
|
([(annotated-val val-free-varrefs)
|
||||||
(set!-rhs-recur (syntax val) (syntax-case (syntax var) (#%top)
|
(set!-rhs-recur (syntax val) (syntax-case (syntax var) (#%top)
|
||||||
[(#%top . real-var) (syntax-e (syntax real-var))]
|
[(#%top . real-var) (syntax-e (syntax real-var))]
|
||||||
[else (syntax var)]))]
|
[else (syntax var)]))]
|
||||||
[free-varrefs (varref-set-union (list val-free-varrefs (list #`var)))]
|
[free-varrefs (varref-set-union (list val-free-varrefs (list #`var)))]
|
||||||
[annotated-set!
|
[annotated-set!
|
||||||
#`(begin (set! #,set!-temp #,annotated-val)
|
(return-value-wrap
|
||||||
(#,normal-break)
|
(quasisyntax/loc exp (set! var #,(normal-break/values-wrap annotated-val))))])
|
||||||
#,(return-value-wrap
|
(2vals
|
||||||
(quasisyntax/loc exp (set! var #,set!-temp))))]
|
(outer-wcm-wrap (make-debug-info-normal free-varrefs) annotated-set!)
|
||||||
[wrapped (outer-wcm-wrap (make-debug-info-app (binding-set-union (list tail-bound (list set!-temp)))
|
free-varrefs))]
|
||||||
(varref-set-union (list free-varrefs (list set!-temp)))
|
|
||||||
'none)
|
|
||||||
annotated-set!)])
|
|
||||||
(2vals
|
|
||||||
(with-syntax ([test-var set!-temp]
|
|
||||||
[wrapped-stx wrapped]
|
|
||||||
[unevaluated-stx *unevaluated*])
|
|
||||||
(quasisyntax/loc exp (let ([test-var unevaluated-stx]) wrapped-stx)))
|
|
||||||
free-varrefs))]
|
|
||||||
|
|
||||||
|
|
||||||
|
; @
|
||||||
|
; $@-@@@@ @@ $@$ @@@@@ -@@$
|
||||||
|
; $- :@ @ @ $- -$ @ $ -$
|
||||||
|
; @ @ @ @ @ @ @ @@@@@
|
||||||
|
; @ @ @ @ @ @ @ $
|
||||||
|
; $- :@ @: +@ $- -$ @: :$ +:
|
||||||
|
; $@-@ :@$-@@ $@$ :@@$- $@@+
|
||||||
|
; @
|
||||||
|
; @@@
|
||||||
|
|
||||||
[(quote _)
|
[(quote _)
|
||||||
(normal-bundle null exp)]
|
(normal-bundle null exp)]
|
||||||
|
|
||||||
[(quote-syntax _)
|
[(quote-syntax _)
|
||||||
(normal-bundle null exp)]
|
(normal-bundle null exp)]
|
||||||
|
|
||||||
|
|
||||||
|
; @@@ @@@ $@+@ @@+-$:
|
||||||
|
; @ @ $+ -@ @+@$@
|
||||||
|
; $-@ @ @@@@@ @ @@@@@ @ @ @
|
||||||
|
; ++@+$ @ @ @ @
|
||||||
|
; :@@$+ $* -$ @ @ @
|
||||||
|
; -@$@* $@$- @@@@@@@
|
||||||
|
|
||||||
|
|
||||||
[(with-continuation-mark key mark body)
|
[(with-continuation-mark key mark body)
|
||||||
;(let*-2vals ([(annotated-key free-varrefs-key)
|
;(let*-2vals ([(annotated-key free-varrefs-key)
|
||||||
; (non-tail-recur (syntax key))]
|
; (non-tail-recur (syntax key))]
|
||||||
|
@ -861,6 +919,19 @@
|
||||||
;)
|
;)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
; @@ @ @
|
||||||
|
; @ @
|
||||||
|
; $@$: @@:@$- @@:@$- @ -@@ $@+@ $@$: @@@@@ -@@ $@$ @@:@@:
|
||||||
|
; -@ @: -$ @: -$ @ @ $+ -@ -@ @ @ $- -$ @+ :@
|
||||||
|
; -$@$@ @ @ @ @ @ @ @ -$@$@ @ @ @ @ @ @
|
||||||
|
; $* @ @ @ @ @ @ @ @ $* @ @ @ @ @ @ @
|
||||||
|
; @- *@ @: -$ @: -$ @ @ $* -$ @- *@ @: :$ @ $- -$ @ @
|
||||||
|
; -$$-@@ @-@$ @-@$ @@@@@ @@@@@ $@$- -$$-@@ :@@$- @@@@@ $@$ @@@ @@@
|
||||||
|
; @ @
|
||||||
|
; @@@ @@@
|
||||||
|
|
||||||
|
|
||||||
; [foot-wrap?
|
; [foot-wrap?
|
||||||
; (wcm-wrap debug-info annotated)])
|
; (wcm-wrap debug-info annotated)])
|
||||||
; free-bindings))]
|
; free-bindings))]
|
||||||
|
@ -928,7 +999,18 @@
|
||||||
#,(return-value-wrap app-term))))))])
|
#,(return-value-wrap app-term))))))])
|
||||||
#`(let-values #,let-clauses #,let-body))
|
#`(let-values #,let-clauses #,let-body))
|
||||||
;)
|
;)
|
||||||
free-varrefs))]
|
free-varrefs))]
|
||||||
|
|
||||||
|
|
||||||
|
; @@
|
||||||
|
; @ @
|
||||||
|
; $@:@ $@$: @@@@@ @@ @@ @@+-$:
|
||||||
|
; $* *@ -@ @ @ @ @+@$@
|
||||||
|
; @ @ -$@$@ @ @ @ @ @ @
|
||||||
|
; @ @ $* @ @ @ @ @ @ @
|
||||||
|
; $* *@ @- *@ @: :$ @: +@ @ @ @
|
||||||
|
; $@:@@ -$$-@@ :@@$- :@$-@@@@@@@@@
|
||||||
|
|
||||||
|
|
||||||
[(#%datum . _)
|
[(#%datum . _)
|
||||||
(normal-bundle null exp)]
|
(normal-bundle null exp)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user