...
svn: r3711
This commit is contained in:
parent
dc28270d5d
commit
1c302a2902
|
@ -377,13 +377,13 @@
|
|||
(let* ([free-vars-captured #f] ; this will be set!'ed
|
||||
;[dont-care (printf "expr: ~a\nskipto: ~a\n" expr (syntax-property expr 'stepper-skipto))]
|
||||
; WARNING! I depend on the order of evaluation in application arguments here:
|
||||
[annotated (skipto-annotate
|
||||
(syntax-property exp 'stepper-skipto)
|
||||
exp
|
||||
[annotated (skipto/auto
|
||||
exp
|
||||
'rebuild
|
||||
(lambda (subterm)
|
||||
(let*-2vals ([(stx free-vars) (annotate/inner subterm tail-bound pre-break? procedure-name-info offset-counter)])
|
||||
(set! free-vars-captured free-vars)
|
||||
stx)))])
|
||||
(set! free-vars-captured free-vars)
|
||||
stx)))])
|
||||
(2vals (wcm-wrap
|
||||
skipto-mark
|
||||
annotated)
|
||||
|
@ -1103,7 +1103,7 @@
|
|||
#`(begin #,exp
|
||||
(#,(make-define-struct-break exp)))]
|
||||
[(syntax-property exp 'stepper-skipto)
|
||||
(skipto-annotate (syntax-property exp 'stepper-skipto) exp annotate/module-top-level)]
|
||||
(skipto/auto exp 'rebuild annotate/module-top-level)]
|
||||
[else
|
||||
(syntax-case exp (#%app call-with-values define-values define-syntaxes require require-for-syntax provide begin lambda)
|
||||
[(define-values (new-var ...) e)
|
||||
|
|
|
@ -205,12 +205,18 @@
|
|||
(struct-constructor-procedure? fun-val))))]
|
||||
[else #f])))))
|
||||
|
||||
;; find-special-value finds the value associated with the given name. Applications of functions
|
||||
;; like 'list' should not be shown as steps, because the before and after steps will be the same.
|
||||
;; it might be easier simply to discover and discard these at display time.
|
||||
(define (find-special-value name valid-args)
|
||||
(let ([expanded (kernel:kernel-syntax-case (expand (cons name valid-args)) #f
|
||||
[(#%app fn . rest)
|
||||
#`fn]
|
||||
[else (error 'find-special-name "couldn't find expanded name for ~a" name)])])
|
||||
(eval expanded)))
|
||||
#f
|
||||
#;(let* ([expanded-application (expand (cons name valid-args))]
|
||||
[stepper-safe-expanded (skipto/auto expanded-application 'discard (lambda (x) x))]
|
||||
[just-the-fn (kernel:kernel-syntax-case stepper-safe-expanded #f
|
||||
[(#%app fn . rest)
|
||||
#`fn]
|
||||
[else (error 'find-special-name "couldn't find expanded name for ~a" name)])])
|
||||
(eval just-the-fn)))
|
||||
|
||||
(define (second-arg-is-list? mark-list)
|
||||
(let ([arg-val (lookup-binding mark-list (get-arg-var 2))])
|
||||
|
@ -287,12 +293,10 @@
|
|||
(define/contract recon-source-expr
|
||||
(-> syntax? mark-list? binding-set? binding-set? render-settings? syntax?)
|
||||
(lambda (expr mark-list dont-lookup use-lifted-names render-settings)
|
||||
(if (syntax-property expr 'stepper-skipto)
|
||||
(skipto-reconstruct
|
||||
(syntax-property expr 'stepper-skipto)
|
||||
expr
|
||||
(lambda (stx)
|
||||
(recon-source-expr stx mark-list dont-lookup use-lifted-names render-settings)))
|
||||
(skipto/auto
|
||||
expr
|
||||
'discard
|
||||
(lambda (expr)
|
||||
(if (syntax-property expr 'stepper-prim-name)
|
||||
(syntax-property expr 'stepper-prim-name)
|
||||
(let* ([recur (lambda (expr) (recon-source-expr expr mark-list dont-lookup use-lifted-names render-settings))]
|
||||
|
@ -424,7 +428,7 @@
|
|||
|
||||
[else
|
||||
(error 'recon-source "no matching clause for syntax: ~a" expr)])])
|
||||
(attach-info recon expr))))))
|
||||
(attach-info recon expr)))))))
|
||||
|
||||
;; reconstruct-set!-var
|
||||
|
||||
|
@ -502,28 +506,24 @@
|
|||
(syntax->list #`vars-stx)
|
||||
lifting-indices)])
|
||||
(vector (reconstruct-completed-define exp vars (vals-getter) render-settings) #f))])
|
||||
(let skipto-loop ([exp exp])
|
||||
(let ([exp (skipto/auto exp 'discard (lambda (exp) exp))])
|
||||
(cond
|
||||
[(syntax-property exp 'stepper-skipto) =>
|
||||
(lambda (skipto)
|
||||
(skipto-reconstruct skipto exp
|
||||
skipto-loop))]
|
||||
[(syntax-property exp 'stepper-define-struct-hint)
|
||||
;; the hint contains the original syntax
|
||||
(vector (syntax-property exp 'stepper-define-struct-hint) #t)]
|
||||
[else
|
||||
(vector
|
||||
(kernel:kernel-syntax-case exp #f
|
||||
[(define-values vars-stx body)
|
||||
(reconstruct-completed-define exp (syntax->list #`vars-stx) (vals-getter) render-settings)]
|
||||
[else
|
||||
(let* ([recon-vals (map (lambda (val)
|
||||
(recon-value val render-settings))
|
||||
(vals-getter))])
|
||||
(if (= (length recon-vals) 1)
|
||||
(attach-info (car recon-vals) exp)
|
||||
(attach-info #`(values #,@recon-vals) exp)))])
|
||||
#f)]))))
|
||||
(kernel:kernel-syntax-case exp #f
|
||||
[(define-values vars-stx body)
|
||||
(reconstruct-completed-define exp (syntax->list #`vars-stx) (vals-getter) render-settings)]
|
||||
[else
|
||||
(let* ([recon-vals (map (lambda (val)
|
||||
(recon-value val render-settings))
|
||||
(vals-getter))])
|
||||
(if (= (length recon-vals) 1)
|
||||
(attach-info (car recon-vals) exp)
|
||||
(attach-info #`(values #,@recon-vals) exp)))])
|
||||
#f)]))))
|
||||
|
||||
;; an abstraction lifted from reconstruct-completed
|
||||
(define (reconstruct-completed-define exp vars vals render-settings)
|
||||
|
@ -541,19 +541,16 @@
|
|||
|
||||
; : (-> syntax? syntax? syntax?)
|
||||
(define (reconstruct-top-level source reconstructed)
|
||||
(cond
|
||||
[(syntax-property source 'stepper-skipto) =>
|
||||
(lambda (skipto)
|
||||
(skipto-reconstruct skipto source
|
||||
(lambda (expr)
|
||||
(reconstruct-top-level expr reconstructed))))]
|
||||
[else
|
||||
(skipto/auto
|
||||
source
|
||||
'discard
|
||||
(lambda (source)
|
||||
(kernel:kernel-syntax-case source #f
|
||||
[(define-values vars-stx body)
|
||||
(attach-info #`(define-values vars-stx #,reconstructed)
|
||||
source)]
|
||||
[else
|
||||
reconstructed])]))
|
||||
[(define-values vars-stx body)
|
||||
(attach-info #`(define-values vars-stx #,reconstructed)
|
||||
source)]
|
||||
[else
|
||||
reconstructed]))))
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
(lib "contract.ss")
|
||||
(lib "list.ss")
|
||||
(lib "etc.ss")
|
||||
(lib "match.ss"))
|
||||
(lib "match.ss")
|
||||
(lib "26.ss" "srfi"))
|
||||
|
||||
; CONTRACTS
|
||||
|
||||
|
@ -24,16 +25,22 @@
|
|||
;[binding-set-varref-set-intersect (-> binding-set? varref-set? binding-set?)]
|
||||
;[binding-set-union (-> (listof binding-set?) binding-set?)]
|
||||
;[varref-set-union (-> (listof varref-set?) varref-set?)]
|
||||
[skipto-annotate (-> (listof procedure?) syntax? (-> syntax? syntax?) syntax?)]
|
||||
[skipto-reconstruct (-> (listof procedure?) syntax? (-> syntax? any/c) any/c)]
|
||||
[in-closure-table (-> any/c boolean?)]
|
||||
[sublist (-> number? number? list? list?)]
|
||||
[attach-info (-> syntax? syntax? syntax?)]
|
||||
[transfer-info (-> syntax? syntax? syntax?)]
|
||||
[arglist->ilist (-> arglist? any)]
|
||||
[arglist-flatten (-> arglist? (listof identifier?))])
|
||||
#;[skipto/auto (syntax? (symbols 'rebuild 'discard) (syntax? . -> . syntax?) . -> . syntax?)]
|
||||
#;[in-closure-table (-> any/c boolean?)]
|
||||
#;[sublist (-> number? number? list? list?)]
|
||||
#;[attach-info (-> syntax? syntax? syntax?)]
|
||||
#;[transfer-info (-> syntax? syntax? syntax?)]
|
||||
#;[arglist->ilist (-> arglist? any)]
|
||||
#;[arglist-flatten (-> arglist? (listof identifier?))])
|
||||
|
||||
(provide
|
||||
skipto/auto
|
||||
in-closure-table
|
||||
sublist
|
||||
attach-info
|
||||
transfer-info
|
||||
arglist->ilist
|
||||
arglist-flatten
|
||||
binding-set-union
|
||||
binding-set-pair-union
|
||||
varref-set-union
|
||||
|
@ -384,16 +391,29 @@
|
|||
[up (cadr (assq down (cadr (assq traversal up-mappings))))])
|
||||
(up val (update (cdr fn-list) (down val) fn traversal)))))
|
||||
|
||||
(define (skipto-annotate fn-list stx annotater)
|
||||
(update fn-list stx annotater 'rebuild))
|
||||
|
||||
; test cases
|
||||
; (equal? (syntax-object->datum (skipto-annotate (list syntax-e car syntax-e cdr cdr car) #'((a b c) (d e f) (g h i)) (lambda (dc) #'foo)))
|
||||
; '((a b foo) (d e f) (g h i)))
|
||||
|
||||
|
||||
(define (skipto-reconstruct fn-list stx reconstructer)
|
||||
(update fn-list stx reconstructer 'discard))
|
||||
;; skipto/auto : syntax-object? (symbols 'rebuild 'discard) (syntax-object? . -> . syntax-object?)
|
||||
;; "skips over" part of a tree to find a subtree indicated by the stepper-skipto property. If the
|
||||
;; traversal argument is 'rebuild, the result of transformation is embedded again in the same tree.
|
||||
;; if the traversal argument is 'discard, the result of the transformation is the result of this
|
||||
;; function
|
||||
(define (skipto/auto stx traversal transformer)
|
||||
(cond [(syntax-property stx 'stepper-skipto)
|
||||
=>
|
||||
(cut update <> stx (cut skipto/auto <> traversal transformer) traversal)]
|
||||
[else (transformer stx)]))
|
||||
|
||||
|
||||
; small test case:
|
||||
;(equal? (syntax-object->datum
|
||||
; (skipto/auto (syntax-property #`(a #,(syntax-property #`(b c)
|
||||
; 'stepper-skipto
|
||||
; (list syntax-e cdr car)))
|
||||
; 'stepper-skipto
|
||||
; (list syntax-e cdr car))
|
||||
; 'discard
|
||||
; (lambda (x) x)))
|
||||
; 'c)
|
||||
|
||||
|
||||
; BINDING-/VARREF-SET FUNCTIONS
|
||||
|
|
Loading…
Reference in New Issue
Block a user