From: Costas Delipetros
Subject: Extending an evaluator function - need help
Date: 
Message-ID: <331d8d25.670606@news.hol.gr>
Dear netters
On behalf of a friend, I stumbled across the following problem - to
extend the user defined function MY-EVAL to take an additional
environment represented as an alist, and to use this to evaluate all
variables within the form. Note that all recursive calls to the
evaluator will need to pass forward the same environment, so that
variables nested within deeper forms will also be evaluated with this
environment, e.g.

> (my-eval 'a '((a . 100) (b . 200)))
100
> (my-eval '(+ a (/ b a)) '((a . 100) (b . 200)))
102
> (my-eval '(+ a (/ c a)) '((a . 100) (b . 200)))
> Error: Unbound variable c
> While executing: MY-EVAL

(DEFUN ENVIRONMENT-BOUNDP (VARIABLE ENVIRONMENT)
	(COND ((EQ (CAR (CAR ENVIRONMENT)) VARIABLE)
	       'T)
	      ((EQ (CAR ENVIRONMENT) NIL)
	       'NIL)
	      (T (ENVIRONMENT-BOUNDP VARIABLE (CDR ENVIRONMENT)))))

(DEFUN ENVIRONMENT-SYMBOL-VALUE (VARIABLE ENVIRONMENT)
	(COND ((EQ (CAR (CAR ENVIRONMENT)) VARIABLE)
	       (CDR (CAR ENVIRONMENT)))
	      ((EQ (CAR ENVIRONMENT) NIL)
	       'NIL)
	      (T (ENVIRONMENT-SYMBOL-VALUE VARIABLE (CDR
ENVIRONMENT)))))
		
(DEFUN MY-EVAL (FORM)
	(IF (ATOM FORM)
	    (IF (SYMBOLP FORM)
		(IF (BOUNDP FORM)
	   	    (SYMBOL-VALUE FORM)
		    (ERROR "UNBOUND VARIABLE ~S IN FORM" FORM))
		FORM)
	(IF (FBOUNDP (CAR FORM))
	    (COND ((EQ (CAR FORM) 'QUOTE)
		   (SECOND FORM))
		  (T
		    (APPLY (CAR FORM)
			   (MAPCAR #'MY-EVAL (CDR FORM) ))))
	    (ERROR "UNDEFINED FUNCTION ~S IN " (CAR FORM))))

I would appreciate any help.