(use sandbox) (define-syntax assert-error (syntax-rules () ((_ x) (handle-exceptions ex (begin (print-error-message ex) #t) x #f)))) (assert (= 123 (safe-eval 123))) ;--> 123 (assert-error (safe-eval 'abc)) ;--> error (define env (make-safe-environment)) (assert-error (safe-eval '(+ 3 4) environment: env)) ;--> error: environment is empty and has no parent (define env2 (make-safe-environment parent: default-safe-environment)) (assert (= 7 (safe-eval '(+ 3 4) environment: env2))) ;--> 7 (safe-eval '(define abc 99) environment: env2) (assert (= 99 (safe-eval 'abc environment: env2))) ;--> 99 (assert-error (safe-eval '(define abc 99) environment: (make-safe-environment extendable: #f))) ;--> error (assert-error (safe-eval '(define abc 99) environment: env2)) ;--> error (assert-error (safe-eval '(set! + 100))) ;--> error: binding not mutable (assert-error (safe-eval '(set! + 100) environment: env2)) ;--> error: the same (binding is inherited) (assert-error (safe-eval '(set! abc 100) environment: env2)) ;--> error ;(safe-eval '(let loop () (loop))) ;--> never terminates (assert-error (safe-eval '(let loop () (loop)) fuel: 1000)) ;--> signals error ("out of fuel") (assert (vector? (safe-eval '(make-vector 100)))) ;--> a 100-element vector (assert-error (safe-eval '(make-vector 100) allocation-limit: 100)) ;--> error ("allocation limit exceeded")