Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2023
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.39 KB | None | 0 0
  1. (defun eval-expr (expr env)
  2. (cond
  3. ((numberp expr) expr)
  4. ((symbolp expr) (lookup-symbol-value expr env))
  5. ((listp expr)
  6. (case (first expr)
  7. ('+ (eval-sum expr env))
  8. ('- (eval-difference expr env))
  9. ('* (eval-product expr env))
  10. ('/ (eval-quotient expr env))
  11. ('def (eval-def expr env))
  12. ('if (eval-if expr env))
  13. (t (error "Unknown operator: ~a" (first expr)))))))
  14.  
  15. (defun eval-sum (expr env)
  16. (reduce #'+ (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
  17.  
  18. (defun eval-difference (expr env)
  19. (reduce #'- (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
  20.  
  21. (defun eval-product (expr env)
  22. (reduce #'* (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
  23.  
  24. (defun eval-quotient (expr env)
  25. (reduce #'/ (mapcar #'(lambda (x) (eval-expr x env)) (rest expr))))
  26.  
  27. (defun eval-def (expr env)
  28. (let ((var (second expr))
  29. (value (eval-expr (third expr) env)))
  30. (push (cons var value) env)
  31. value))
  32.  
  33. (defun eval-if (expr env)
  34. (if (eval-expr (second expr) env)
  35. (eval-expr (third expr) env)
  36. (eval-expr (fourth expr) env)))
  37.  
  38. (defun lookup-symbol-value (symbol env)
  39. (let ((binding (assoc symbol env)))
  40. (if binding
  41. (cdr binding)
  42. (error "Undefined symbol: ~a" symbol))))
  43.  
  44. (defun repl ()
  45. (let ((env '()))
  46. (loop
  47. (print (eval-expr (read) env)))))
  48.  
  49. (repl)
  50.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement