doc: fix evaluation order for parameterize

Closes #3211
This commit is contained in:
Matthew Flatt 2020-05-24 13:10:16 -06:00
parent f66fff1ca9
commit f0c79b6b16
2 changed files with 24 additions and 5 deletions

View File

@ -63,11 +63,12 @@ The result of a @racket[parameterize] expression is the result of the
last @racket[body]. The @racket[parameter-expr]s determine the
parameters to set, and the @racket[value-expr]s determine the
corresponding values to install while evaluating the
@racket[body-expr]s. All of the @racket[parameter-expr]s are evaluated
first (and checked with @racket[parameter?]), then all
@racket[value-expr]s are evaluated, and then the parameters are bound
in the continuation to preserved thread cells that contain the values
of the @racket[value-expr]s. The last @racket[body-expr] is in tail
@racket[body-expr]s. The @racket[parameter-expr]s and
@racket[value-expr]s are evaluated left-to-right (interleaved), and
then the parameters are bound in the continuation to preserved thread
cells that contain the values of the @racket[value-expr]s; the result
of each @racket[parameter-expr] is checked with @racket[parameter?]
just before it is bound. The last @racket[body-expr] is in tail
position with respect to the entire @racket[parameterize] form.
Outside the dynamic extent of a @racket[parameterize] expression,

View File

@ -1269,6 +1269,24 @@
(error-test #'(parameterize ([(lambda (a) 10) 10]) 8))
(error-test #'(parameterize ([(lambda (a b) 10) 10]) 8))
;; Check documented order of evaluation
(let ([str (let ([o (open-output-string)])
(define p1 (make-parameter 1 (λ (x) (displayln "p1" o) x)))
(define p2 (make-parameter 2 (λ (x) (displayln "p2" o) x)))
(parameterize ([(begin (displayln "b1" o) p1) (begin (displayln "a1" o) 4)]
[(begin (displayln "b2" o) p2) (begin (displayln "a2" o) 5)])
3)
(get-output-string o))])
(test "b1\na1\nb2\na2\np1\np2\n" values str))
(let ([str (let ([o (open-output-string)])
(define p1 (make-parameter 1 (λ (x) (displayln "p1" o) x)))
(err/rt-test/once
(parameterize ([(begin (displayln "b1" o) p1) (begin (displayln "a1" o) 4)]
[(begin (displayln "b2" o) 'no) (begin (displayln "a2" o) 5)])
3))
(get-output-string o))])
(test "b1\na1\nb2\na2\np1\n" values str))
(test 1 'time (time 1))
(test -1 'time (time (cons 1 2) -1))
(test-values '(-1 1) (lambda () (time (values -1 1))))