evaluate expression only once for eval:check

This commit is contained in:
Matthew Flatt 2015-12-10 08:06:41 -07:00
parent 904f83ecf3
commit f637b94a61

View File

@ -259,19 +259,19 @@
(map (current-print) v)) (map (current-print) v))
(close-output-port out) (close-output-port out)
in)))]))) in)))])))
(define (do-ev s) (define (do-ev/expect s expect)
(define-values (val render+output)
(with-handlers ([(lambda (x) (not (exn:break? x))) (with-handlers ([(lambda (x) (not (exn:break? x)))
(lambda (e) (lambda (e)
(cons ((scribble-exn->string) e) (cons ((scribble-exn->string) e)
(get-outputs)))]) (get-outputs)))])
(cons (render-value (do-plain-eval ev s #t)) (get-outputs)))) (define val (do-plain-eval ev s #t))
(define (do-ev/expect s expect) (values val (cons (render-value val) (get-outputs)))))
(when expect (when expect
(let ([r (do-plain-eval ev s #t)] (let ([expect (do-plain-eval ev (car expect) #t)])
[expect (do-plain-eval ev (car expect) #t)]) (unless (equal? val expect)
(unless (equal? r expect)
(raise-syntax-error 'eval "example result check failed" s)))) (raise-syntax-error 'eval "example result check failed" s))))
(do-ev s)) render+output)
(lambda (str) (lambda (str)
(if (eval-results? str) (if (eval-results? str)
(list (map formatted-result (eval-results-contents str)) (list (map formatted-result (eval-results-contents str))