anchor.diff:  ;;; Read-eval-print
   (defun revalp ()
   	(set-functions)
  +	(if (equal nil *envts*)
  +		(push *sym-table* *envts*))
   	(format t "~% -->")
   	(print (evall (read)))
   	(revalp))
  
positive.code: 		expr
  		(progn
  			(if (consp expr) ;; change which one is running depending on if a function call or variable
  				(multiple-value-setq (sym fl) (get-variable (car expr))) ;; to handle (f 3) for example 
  				(multiple-value-setq (sym fl) (get-variable expr)))
  			(if (eql t fl)
  				(if (not (consp sym))
  					sym ;; what the expr evaluates to
  
negative.code: ;;; (set! var 2)
  ;;; (set! var (lambda (x) (* x x))) for example
  ;;; TODO remove the seperate case for functions there shouldn't be a need for a seperate case
  ;;; envt is the current environment that the set needs to modify
  (defun set-eval (expr)
  	(print "set-eval")
  	(print (caddr expr))
  	(set-variable (cadr expr) (evall (caddr expr))))
  
  ;;; Sets up the starting environment
  (defvar *envts* ())
  	
  ;;; Hash table for holding user defined functions and variables 
  (defvar *sym-table* (make-hash-table :test #'equal))
  
  (defun set-variable (sym val)
  	(setf (gethash sym (car *envts*)) val))
  
  (defun get-variable (sym envts)
  	(if (equal nil envts)
  		(values nil nil)
  		(progn 
  			(multiple-value-setq (var flag) (gethash sym (car envts)))
  			(if (eql t flag)
  				(values var t)
  				(get-variable sym (cdr envts))))))
  
  (defvar *func-table* (make-hash-table :test #'equal))
  
  