Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun eval-expr (expr env)
- (cond
- ((numberp expr) expr)
- ((symbolp expr) (lookup-symbol-value expr env))
- ((listp expr)
- (case (first expr)
- ('+ (eval-sum expr env))
- ('- (eval-difference expr env))
- ('* (eval-product expr env))
- ('/ (eval-quotient expr env))
- ('def (eval-def expr env))
- ('if (eval-if expr env))
- (t (error "Unknown operator: ~a" (first expr)))))))
- (defun eval-sum (expr env)
- (reduce #'+ (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
- (defun eval-difference (expr env)
- (reduce #'- (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
- (defun eval-product (expr env)
- (reduce #'* (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
- (defun eval-quotient (expr env)
- (reduce #'/ (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
- (defun eval-def (expr env)
- (let ((var (second expr))
- (value (eval-expr (third expr) env)))
- (push (cons var value) env)
- value))
- (defun eval-if (expr env)
- (if (eval-expr (second expr) env)
- (eval-expr (third expr) env)
- (eval-expr (fourth expr) env)))
- (defun lookup-symbol-value (symbol env)
- (let ((binding (assoc symbol env)))
- (if binding
- (cdr binding)
- (error "Undefined symbol: ~a" symbol))))
- (defun repl ()
- (let ((env '()))
- (loop
- (print (eval-expr (read) env)))))
- (repl)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement