From 9a6970043a0a208e12dbf05d40ef8bbc41834082 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Tue, 6 May 2014 16:38:11 -0500 Subject: [PATCH] fix contract-random-generate so it picks the generation method randomly during generation, not randomly up-front, before generation --- .../racket/contract/private/generate.rkt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/racket/collects/racket/contract/private/generate.rkt b/racket/collects/racket/contract/private/generate.rkt index 226cbb38d8..53c1273b7d 100644 --- a/racket/collects/racket/contract/private/generate.rkt +++ b/racket/collects/racket/contract/private/generate.rkt @@ -53,14 +53,16 @@ ; Iterates through generation methods until failure. Returns ; #f if no value could be generated (define (generate/choose ctc fuel) - (let loop ([options (permute (list generate/direct generate/env))]) - (cond - [(empty? options) - #f] - [else - (define option (car options)) - (define gen (option ctc fuel)) - (or gen (loop (cdr options)))]))) + (define direct (generate/direct ctc fuel)) + (define env (generate/env ctc fuel)) + (cond + [(and direct env) + (λ () + (if (zero? (rand 2)) + (direct) + (env)))] + [else + (or direct env)])) ; generate/direct :: contract nonnegative-int -> (or/c #f (-> val)) ;; generate directly via the contract's built-in generator, if possible