eval difficult in Racket. According to the Racquet Guide, 15.1.2, you need to connect to the current namespace as follows
(define-namespace-anchor anc) (define ns (namespace-anchor->namespace anc))
and then add ns to each eval call:
(define (eval-clause clause state) (for ([x state]) (eval `(define ,(first x) ,(second x)) ns)) (eval (cons 'or (map (curryr eval ns) clause)) ns))
Note that this is not necessary in the REPL, as described in the document mentioned above.
However, it is probably best to create a specific namespace for your definitions so that they do not mix with your own module definitions:
(define my-eval (let ((ns (make-base-namespace))) (lambda (expr) (eval expr ns)))) (define *state* '((a #f) (b #t) (c #t) (d #f))) (define *clause* '(a (not b) c)) (define (eval-clause clause state) (for ([x state]) (my-eval `(define ,(first x) ,(second x)))) (my-eval (cons 'or (map my-eval clause)))) (displayln (eval-clause *clause* *state*))
or, if you want to continue using true and false from racket/bool , define my-eval as follows:
(define my-eval (let ((ns (make-base-namespace))) (parameterize ((current-namespace ns)) (namespace-require 'racket/bool)) (lambda (expr) (eval expr ns))))
source share