(use sicp sicp-eval sicp-eval-anal sicp-streams test)
(test
"Draw-painter-as-svg"
""
(with-output-to-string
(lambda ()
(draw-painter-as-svg (segments->painter
(list (make-segment (make-vect 0.0 1.0)
(make-vect 1.0 0.0))))))))
(test
"Draw-painter-as-svg: beside"
""
(with-output-to-string
(lambda ()
(let ((painter (segments->painter
(list (make-segment (make-vect 0.0 1.0)
(make-vect 1.0 0.0))))))
(draw-painter-as-svg (beside painter painter))))))
(test
"Draw-painter-as-svg: image"
""
(with-output-to-string
(lambda ()
(let ((painter (image->painter "lena.png")))
(draw-painter-as-svg (beside painter painter))))))
(test "Numerical derivation" 1 (deriv '(+ x 3) 'x))
(test "Symbolic derivation" 'y (deriv '(* x y) 'x))
(test "Stream->list with all"
'(1 2 3)
(stream->list
(cons-stream 1 (cons-stream 2 (cons-stream 3 stream-null)))))
(test "Stream->list with 2"
'(1 2)
(stream->list
(cons-stream 1 (cons-stream 2 (cons-stream 3 stream-null)))
2))
(test "List->string"
'(1 2 3)
(stream->list (list->stream '(1 2 3))))
(test "The evaluator evaluates"
5
(parameterize ((primitive-procedures
(cons (list '+ +) (primitive-procedures))))
(eval* '(+ 2 3) (setup-environment))))
(call-with-values (lambda () (time+values (+ 2 2)))
(lambda (time value)
(test-assert "Time returns a number" (number? time))
(test "Values returns the value" 4 value)))
(test "The analyzing evaluator analyzes and evaluates"
5
(parameterize ((primitive-procedures
(cons (list '+ +) (primitive-procedures))))
(anal-eval* '(+ 2 3) (setup-environment))))
(use sicp-eval-lazy)
(with-primitive-procedures `((+ ,+)
(values ,values))
(lambda (env)
(eval* '(define count 0) env)
(eval* '(define (id x) (set! count (+ count 1)) x) env)
(eval* '(define w (id (id 10))) env)
(test "Id has been called once." 1 (eval* 'count env))
(test "W is 10." 10 (eval* '(values w) env))
(test "Id has been called twice." 2 (eval* 'count env))))
(use sicp-eval-amb)
(with-require `((+ ,+) (prime? ,prime?) (list ,list))
(lambda (env)
(ambeval* '(define (prime-sum-pair list1 list2)
(let ((a (an-element-of list1))
(b (an-element-of list2)))
(require (prime? (+ a b)))
(list a b))) env)
(test "Ambeval with prime-sum-pair"
'(3 20)
(ambeval-n '(prime-sum-pair '(1 3 5 8) '(20 35 110)) env 1))))
(test-exit)