From f0c79b6b169d91fc7a90b8f5d0d637362e6bfcc8 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 24 May 2020 13:10:16 -0600 Subject: [PATCH] doc: fix evaluation order for `parameterize` Closes #3211 --- .../scribblings/reference/parameters.scrbl | 11 ++++++----- pkgs/racket-test-core/tests/racket/syntax.rktl | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/pkgs/racket-doc/scribblings/reference/parameters.scrbl b/pkgs/racket-doc/scribblings/reference/parameters.scrbl index bd046053e9..6d4ff53a1b 100644 --- a/pkgs/racket-doc/scribblings/reference/parameters.scrbl +++ b/pkgs/racket-doc/scribblings/reference/parameters.scrbl @@ -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, diff --git a/pkgs/racket-test-core/tests/racket/syntax.rktl b/pkgs/racket-test-core/tests/racket/syntax.rktl index ae3d8f3c5d..bbd5cbd0b0 100644 --- a/pkgs/racket-test-core/tests/racket/syntax.rktl +++ b/pkgs/racket-test-core/tests/racket/syntax.rktl @@ -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))))