Advertisement
Guest User

Untitled

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