test-external-mutation.rkt (3185B)
1 #lang typed/racket 2 (require delay-pure 3 typed/rackunit) 4 5 ;; This file checks that externally mutating a free variable on which a pure 6 ;; function or promise depends does not affect the function's result. 7 (check-equal? (let ([x 1]) 8 (define d (delay/pure/stateful (add1 x))) 9 (list (begin (set! x -10) (force d)) 10 (begin (set! x -11) (force d)))) 11 '(2 2)) 12 13 (check-equal? (let ([x 1]) 14 (define d (delay/pure/stateless (add1 x))) 15 (list (begin (set! x -10) (force d)) 16 (begin (set! x -11) (force d)))) 17 '(2 2)) 18 19 ;; pure/stateless and pure/stateful do not protect the expression from 20 ;; external mutations, so we are not testing this case here. 21 22 (check-equal? (let ([x 1]) 23 (define d (pure-thunk/stateless (λ () (add1 x)))) 24 (list (begin (set! x -10) (d)) 25 (begin (set! x -11) (d)))) 26 '(2 2)) 27 28 (check-equal? (let ([x 1]) 29 (define d (pure-thunk/stateless (λ () (add1 x)) #:check-result)) 30 (list (begin (set! x -10) (d)) 31 (begin (set! x -11) (d)))) 32 '(2 2)) 33 34 (check-equal? (let ([x 1]) 35 (define d (pure-thunk/stateful (λ () (add1 x)))) 36 (list (begin (set! x -10) (d)) 37 (begin (set! x -11) (d)))) 38 '(2 2)) 39 40 (check-equal? (let ([x 1]) 41 (define d (pure-thunk/stateful (λ () (add1 x)) #:check-result)) 42 (list (begin (set! x -10) (d)) 43 (begin (set! x -11) (d)))) 44 '(2 2)) 45 46 (check-equal? (let ([x 1]) 47 (define-pure/stateless (d) (add1 x)) 48 (list (begin (set! x -10) (d)) 49 (begin (set! x -11) (d)))) 50 '(2 2)) 51 52 (check-equal? (let ([x 1]) 53 (define-pure/stateless (d [opt : Number x]) (add1 opt)) 54 (list (begin (set! x -10) (d)) 55 (begin (set! x -11) (d)))) 56 '(2 2)) 57 58 (check-equal? (let ([x 1]) 59 (define-pure/stateless (d #:kw [opt : Number x]) (add1 opt)) 60 (list (begin (set! x -10) (d)) 61 (begin (set! x -11) (d)))) 62 '(2 2)) 63 64 (check-equal? (let ([x 1]) 65 (define-pure/stateful (d) (add1 x)) 66 (list (begin (set! x -10) (d)) 67 (begin (set! x -11) (d)))) 68 '(2 2)) 69 70 (check-equal? (let ([x 1]) 71 (define-pure/stateful (d [opt : Number x]) (add1 opt)) 72 (list (begin (set! x -10) (d)) 73 (begin (set! x -11) (d)))) 74 '(2 2)) 75 76 (check-equal? (let ([x 1]) 77 (define-pure/stateful (d #:kw [opt : Number x]) (add1 opt)) 78 (list (begin (set! x -10) (d)) 79 (begin (set! x -11) (d)))) 80 '(2 2)) 81 82 ;; Check that this doesn't cause a run-time error due to the internal use of 83 ;; unsafe-undefined in the expanded function with optional arguments (starting 84 ;; from Racket 6.90.0.29) 85 (define z 1) 86 (define-pure/stateless (d [opt : Number z]) (void)) 87 (d)