fork download
  1. (ns calc.core
  2. (:require [clojure.string :as s])
  3. (:use [clojure.core.match :only (match)]
  4. [instaparse.core :only (parser)]
  5. [clojure.math.numeric-tower]))
  6.  
  7. (def calc-parse
  8. (parser
  9. "S = E
  10. E = ('-'|eps) T (('+'|'-') T)*
  11. T = P (('*'|'/') P)*
  12. P = F ('^' F)*
  13. F = N | '(' E ')'
  14. N = C+ ('.'C*|eps)
  15. C = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' "))
  16.  
  17. (defn calc-eval [expr]
  18. (match [expr]
  19. [[:S exp]] (calc-eval exp)
  20. [[:E "-" & rest]] (- (calc-eval (into [:E] rest)))
  21. [[:E term]] (calc-eval term)
  22. [[:E term "+" & rest]] (+ (calc-eval term) (calc-eval (into [:E] rest)))
  23. [[:E term "-" & rest]] (- (calc-eval term) (calc-eval (into [:E] rest)))
  24. [[:T pow]] (calc-eval pow)
  25. [[:T pow "*" & rest]] (* (calc-eval pow) (calc-eval (into [:T] rest)))
  26. [[:T pow "/" & rest]] (/ (calc-eval pow) (calc-eval (into [:T] rest)))
  27. [[:P form]] (calc-eval form)
  28. [[:P form "^" & rest]] (expt (calc-eval form) (calc-eval (into [:P] rest)))
  29. [[:F "(" exp ")"]] (calc-eval exp)
  30. [[:F [:N & digs]]] (calc-eval (into [:N] digs))
  31. [[:N & digs]] (->> digs
  32. (map #(match [%] [[:C c]] c :else %))
  33. (s/join "")
  34. (read-string))
  35. :else (str "Invalid expression: " expr)))
  36.  
  37. (defn calc [str]
  38. (-> str
  39. (s/replace #" " "")
  40. (calc-parse)
  41. (calc-eval)))
Runtime error #stdin #stdout #stderr 1.35s 389120KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Exception in thread "main" java.io.FileNotFoundException: Could not locate clojure/core/match__init.class or clojure/core/match.clj on classpath: 
	at clojure.lang.RT.load(RT.java:434)
	at clojure.lang.RT.load(RT.java:402)
	at clojure.core$load$fn__5039.invoke(core.clj:5520)
	at clojure.core$load.doInvoke(core.clj:5519)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invoke(core.clj:5326)
	at clojure.core$load_lib$fn__4988.invoke(core.clj:5365)
	at clojure.core$load_lib.doInvoke(core.clj:5364)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invoke(core.clj:619)
	at clojure.core$load_libs.doInvoke(core.clj:5403)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invoke(core.clj:621)
	at clojure.core$use.doInvoke(core.clj:5497)
	at clojure.lang.RestFn.invoke(RestFn.java:436)
	at calc.core$eval3$loading__4931__auto____4.invoke(prog.clj:1)
	at calc.core$eval3.invoke(prog.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:6618)
	at clojure.lang.Compiler.eval(Compiler.java:6607)
	at clojure.lang.Compiler.load(Compiler.java:7062)
	at clojure.lang.Compiler.loadFile(Compiler.java:7019)
	at clojure.main$load_script.invoke(main.clj:286)
	at clojure.main$script_opt.invoke(main.clj:348)
	at clojure.main$main$fn__6676.invoke(main.clj:432)
	at clojure.main$main.doInvoke(main.clj:429)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.lang.Var.invoke(Var.java:415)
	at clojure.lang.AFn.applyToHelper(AFn.java:161)
	at clojure.lang.Var.applyTo(Var.java:532)
	at clojure.main.main(main.java:37)