Advertisement
Guest User

Untitled

a guest
May 5th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (def div (fn [a b] (/ (double a) b)))
  2.  
  3. (defn evaluate [this values]
  4.   ((:evaluate this) values))
  5.  
  6. (defn toString [this]
  7.   (:toString this))
  8.  
  9. (defn diff [this var]
  10.   ((:diff this) var))
  11.  
  12. (defn operation [op name diffFunc]
  13.   (fn [& operands]
  14.     {
  15.      :evaluate (fn [values] (apply op (map #((:evaluate %) values) operands)))
  16.      :toString (str "(" name " " (clojure.string/join " " (map #(:toString %) operands)) ")")
  17.      :diff     (fn [var] (if (= (count operands) 2)
  18.                            (diffFunc (nth operands 0) (nth operands 1) (diff (nth operands 0) var) (diff (nth operands 1) var))
  19.                            (diffFunc (nth operands 0) (diff (nth operands 0) var))))
  20.      }))
  21.  
  22. (declare zero)
  23.  
  24. (defn Constant [val]
  25.   {
  26.    :evaluate (constantly val)
  27.    :toString (format "%.1f" val)
  28.    :diff     (constantly zero)
  29.    })
  30.  
  31. (def zero (Constant 0.0))
  32. (def one (Constant 1.0))
  33. (def two (Constant 2.0))
  34.  
  35. (defn Variable [val]
  36.   {
  37.    :evaluate (fn [variables] (variables val))
  38.    :toString val
  39.    :diff     (fn [var] (if (= val var)
  40.                          one
  41.                          zero))
  42.    })
  43.  
  44. (def Add (operation + "+" (fn [_ _ da db] (Add da db))))
  45.  
  46. (def Subtract (operation - "-" (fn [_ _ da db] (Subtract da db))))
  47.  
  48. (def Multiply (operation * "*" (fn [a b da db] (Add
  49.                                                  (Multiply da b)
  50.                                                  (Multiply db a)))))
  51.  
  52. (def Divide (operation
  53.               div
  54.               "/"
  55.               (fn [a b da db] (Divide (Subtract (Multiply b da)
  56.                                                 (Multiply a db))
  57.                                       (Multiply b b)))))
  58.  
  59. (def Negate (operation - "negate" (fn [_ da] (Subtract da))))
  60.  
  61. (def ops
  62.   {
  63.    '+      Add,
  64.    '-      Subtract,
  65.    '*      Multiply,
  66.    '/      Divide,
  67.    'negate Negate
  68.    })
  69.  
  70. (defn parse [expr]
  71.   (cond
  72.     (number? expr) (Constant expr)
  73.     (symbol? expr) (Variable (str expr))
  74.     (list? expr) (apply (ops (first expr)) (map parse (rest expr)))))
  75.  
  76. (defn parseObject [expr] ((comp parse read-string) expr))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement