in lazy/lazy.rkt

- modify cond for stepper
- add support for multiple values in stepper
  - add inspector to multiple-values struct
  - hide split-values call in ~define-values

in tests/stepper/
- add tests for cond

in stepper/private/annotate.rkt
- in annotate/top-level, allow arbitrary top-level terms
  (no error in else case), otherwise exprs like let throws error

in stepper/private/
   reconstruct.rkt
   lazy-highlighting.rkt
- add support for eq? eqv? equal? lazy fns
This commit is contained in:
Stephen Chang 2011-04-05 20:01:03 -04:00
parent c0f8f1cdb2
commit e41ba9c77b
6 changed files with 110 additions and 18 deletions

View File

@ -192,10 +192,14 @@
;; used (spceifically, students never use them). So `values' is redefined to ;; used (spceifically, students never use them). So `values' is redefined to
;; produce a first-class tuple-holding struct, and `split-values' turns that ;; produce a first-class tuple-holding struct, and `split-values' turns that
;; into multiple values. ;; into multiple values.
(define-struct multiple-values (values)) ;; STC: add inspector for lazy stepper
(define-struct multiple-values (values) (make-inspector))
(define (split-values x) (define (split-values x)
(let ([x (! x)]) (let ([x (! x)])
(if (multiple-values? x) (apply values (multiple-values-values x)) x))) (if (multiple-values? x) (apply values (multiple-values-values x)) x)))
(define-syntax (hidden-split-values stx)
(syntax-case stx ()
[(_ arg) (stepper-hide-operator (syntax/loc stx (split-values arg)))]))
;; Force and split resulting values. ;; Force and split resulting values.
(define (!values x) (define (!values x)
(split-values (! x))) (split-values (! x)))
@ -211,7 +215,7 @@
;; Redefine multiple-value constructs so they split the results ;; Redefine multiple-value constructs so they split the results
(defsubst (~define-values (v ...) body) (defsubst (~define-values (v ...) body)
(define-values (v ...) (split-values body))) (define-values (v ...) (hidden-split-values body)))
(defsubst (~let-values ([(x ...) v] ...) body ...) (defsubst (~let-values ([(x ...) v] ...) body ...)
(let-values ([(x ...) (split-values v)] ...) (~begin body ...))) (let-values ([(x ...) (split-values v)] ...) (~begin body ...)))
(defsubst (~let*-values ([(x ...) v] ...) body ...) (defsubst (~let*-values ([(x ...) v] ...) body ...)
@ -382,16 +386,29 @@
(define* (~set-box! box val) (~ (set-box! (! box) val))) (define* (~set-box! box val) (~ (set-box! (! box) val)))
;; not much to do with these besides inserting strictness points and ~begin ;; not much to do with these besides inserting strictness points and ~begin
; for stepper: change else to #t test, add new error else branch
(define-syntax (~cond stx) (define-syntax (~cond stx)
(syntax-case stx () (syntax-case stx ()
[(_ [test body ...] ...) [(_ clause ...) ; stepper needs the loc of the full clause
(with-syntax ([(test ...) (with-syntax
;; avoid forcing an `else' keyword ([(new-clause ...)
(map (lambda (stx) (map
(syntax-case stx (else) (λ (c)
[else stx] [x #'(hidden-! x)])) (with-syntax ([(test body ...) c])
(syntax->list #'(test ...)))]) (with-syntax
#'(hidden-~ (cond [test (~begin body ...)] ...)))])) ([new-test
(syntax-case #'test (else)
[else ; for stepper
(stepper-syntax-property #'#t 'stepper-else #t)]
[x (syntax/loc #'x (hidden-! x))])])
(syntax/loc c (new-test (~begin body ...))))))
(syntax->list #'(clause ...)))]
[new-else-body (syntax/loc stx (error 'cond "should not get here"))])
#`(hidden-~
#,(syntax/loc stx
(cond
new-clause ...
[else new-else-body]))))]))
(defsubst (~case v [keys body ...] ...) (defsubst (~case v [keys body ...] ...)
(hidden-~ (case (hidden-! v) [keys (~begin body ...)] ...))) (hidden-~ (case (hidden-! v) [keys (~begin body ...)] ...)))

View File

@ -1191,9 +1191,8 @@
exp] exp]
; STC: for lazy, handle defines ; STC: for lazy, handle defines
[(define-values (ids ...) bodies) (annotate/module-top-level exp)] [(define-values (ids ...) bodies) (annotate/module-top-level exp)]
; STC: for lazy [else (annotate/module-top-level exp)]
[(#%plain-app . terms) (annotate/module-top-level exp)] #;[else
[else
(error `annotate/top-level "unexpected top-level expression: ~a\n" (error `annotate/top-level "unexpected top-level expression: ~a\n"
(syntax->datum exp)) (syntax->datum exp))
#;(annotate/module-top-level exp)]))) #;(annotate/module-top-level exp)])))

View File

@ -44,4 +44,7 @@
(sixth . 0) (sixth . 0)
(seventh . 0) (seventh . 0)
(eighth . 0) (eighth . 0)
(eq? . 0)
(eqv? . 0)
(equal? . 0)
))) )))

View File

@ -902,10 +902,11 @@
(cond [(eq? obj-name 'force) so-far] (cond [(eq? obj-name 'force) so-far]
[(ormap [(ormap
(lx (eq? obj-name _)) (lx (eq? obj-name _))
'(caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr '(caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar
caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr cdaaar cdaadr cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
cdadar cdaddr cddaar cddadr cdddar cddddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
first second third fourth fifth sixth seventh eighth take)) first second third fourth fifth sixth seventh eighth take
eq? eqv? equal?))
#`(#%plain-app . #,rectified-evaluated)] #`(#%plain-app . #,rectified-evaluated)]
[else [else
(datum->syntax #'here `(,#'#%plain-app ... ,so-far ...))]))) (datum->syntax #'here `(,#'#%plain-app ... ,so-far ...))])))

View File

@ -14,7 +14,7 @@
lazy-cddadr lazy-cdddar lazy-cddddr lazy-second lazy-third lazy-fourth lazy-cddadr lazy-cdddar lazy-cddddr lazy-second lazy-third lazy-fourth
lazy-fifth lazy-sixth lazy-seventh lazy-eighth lazy-fifth lazy-sixth lazy-seventh lazy-eighth
lazy-if1 lazy-if2 lazy-take-0 lazy-take lazy-take-impl lazy-if1 lazy-if2 lazy-take-0 lazy-take lazy-take-impl
lazy-unknown1 lazy-unknown2 lazy-inf-list1)) lazy-unknown1 lazy-unknown2 lazy-inf-list1 lazy-cond1 lazy-cond2))
(let ((outer-namespace (current-namespace))) (let ((outer-namespace (current-namespace)))
(parameterize ([display-only-errors #t] (parameterize ([display-only-errors #t]

View File

@ -1922,6 +1922,78 @@
-> ,add1-def ,nats-def-expanded {5} -> ,add1-def ,nats-def-expanded {5}
)) ))
; lazy-cond1, lazy-cond2
; (define (f x)
; (cond ((> 0 x) (/ 1 0))
; ((< 0 x) (* x 10))
; (else (+ x 10))))
; (f 0)
; (f 1)
(let* ([make-test1 (λ (x) `(> 0 ,x))]
[make-test2 (λ (x) `(< 0 ,x))]
[test1 (make-test1 0)]
[test2 (make-test2 0)]
[test12 (make-test1 2)]
[test22 (make-test2 2)]
[make-clause1 (λ (x) `(* ,x 10))]
[make-clause2 (λ (x) `(+ ,x 10))]
[clause1 (make-clause1 0)]
[clause2 (make-clause2 0)]
[clause12 (make-clause1 2)]
[clause22 (make-clause2 2)]
[cnd (λ (x) `(cond (,(make-test1 x) ,err)
(,(make-test2 x) ,(make-clause1 x))
(else ,(make-clause2 x))))]
[make-def (λ (x) `(define (f x) ,(cnd x)))]
[def (make-def 'x)]
[lam (λ (x) `(lambda (x) ,(cnd x)))])
(t 'lazy-cond1 m:lazy
,def (f 0)
:: ,def ({f} 0) -> ,def ({,(lam 'x)} 0)
:: ,def {(,(lam 'x ) 0)} -> ,def {,(cnd 0)}
:: ,def (cond ({,test1} ,err)
(,test2 ,clause1)
(else ,clause2))
-> ,def (cond ({false} ,err)
(,test2 ,clause1)
(else ,clause2))
:: ,def {(cond (false ,err)
(,test2 ,clause1)
(else ,clause2))}
-> ,def {(cond (,test2 ,clause1)
(else ,clause2))}
:: ,def (cond ({,test2} ,clause1)
(else ,clause2))
-> ,def (cond ({false} ,clause1)
(else ,clause2))
:: ,def {(cond (false ,clause1)
(else ,clause2))}
-> ,def {(cond (else ,clause2))}
-> ,def {,clause2} -> ,def {10})
(t 'lazy-cond2 m:lazy
,def (f 2)
:: ,def ({f} 2) -> ,def ({,(lam 'x)} 2)
:: ,def {(,(lam 'x ) 2)} -> ,def {,(cnd 2)}
:: ,def (cond ({,test12} ,err)
(,test22 ,clause12)
(else ,clause22))
-> ,def (cond ({false} ,err)
(,test22 ,clause12)
(else ,clause22))
:: ,def {(cond (false ,err)
(,test22 ,clause12)
(else ,clause22))}
-> ,def {(cond (,test22 ,clause12)
(else ,clause22))}
:: ,def (cond ({,test22} ,clause12)
(else ,clause22))
-> ,def (cond ({true} ,clause12)
(else ,clause22))
:: ,def {(cond (true ,clause12)
(else ,clause22))}
-> ,def {,clause12} -> ,def {20})
)
#; #;
(t1 'teachpack-callbacks (t1 'teachpack-callbacks
(test-teachpack-sequence (test-teachpack-sequence