I'm trying to write a function that takes in a list (well, any expression actually), a list of symbols, and a list of values for those symbols, and then evaluates that list as an expression with those symbols assigned to those values. Perhaps my current attempt will explain this better than a description:

- Code: Select all
`(defun eval-expr (expr symbols assignments)`

(progv symbols assignments (eval expr)))

And then you could do something like:

- Code: Select all
`* (let ((expr '(and p q)))`

(eval-expr expr '(p q) '(t t)))

=> T

This works fairly well, but gives me warnings about undefined variables most of the time (not in the above instance). As I'm new to common lisp, I was wondering if there is a better way of doing this, one that wouldn't produce warnings.

The following gives me warnings (though still returns the correct value):

- Code: Select all
`* (let ((expr '(or p q)))`

(eval-expr expr '(p q) '(nil t)))

=> T

where the warnings are:

- Code: Select all
`; in: LAMBDA NIL`

; (LET ((#:G758 P))

; (IF #:G758 #:G758 (OR Q)))

;

; caught WARNING:

; undefined variable: P

; (OR Q)

;

; caught WARNING:

; undefined variable: Q

;

; caught WARNING:

; These variables are undefined:

; P Q

;

; compilation unit finished

; caught 3 WARNING conditions

Thanks!