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