2015-02-11 8:32 GMT+01:00 Cecil Westerhof <cldwester...@gmail.com>: > > I needed a function to get the percentage as an int. Input is place and > total-count. > I want the normal definition (which is the default) and a high and low > variant. > > I came up with the following code: > (defn get-percentage > ([place total-count] (get-percentage :normal place total-count)) > ([mode place total-count] > (let [percentage > > (/ (* place 100.0) total-count)] > (condp = mode > :high (int (Math/ceil percentage)) > :low (int (Math/floor percentage)) > :normal (int (Math/round percentage)) > (throw (Exception. "ERROR: get-percentage [:high|:low|:normal] > <PLACE> <TOTAL_COUNT>")))))) > > Is this a good version, or could it be done better? >
Everyone thanks for the comments. I did the following. I made three round functions: (defn round [x] (int (Math/round x))) (defn round-high [x] (int (Math/ceil x))) (defn round-low [x] (int (Math/floor x))) And rewrote get-percentage to: (defn get-percentage ([place total-count] (get-percentage :normal place total-count)) ([mode place total-count] (let [mode-fn (case mode :high round-high :low round-low :normal round (throw (Exception. "ERROR: get-percentage [:high|:low|:normal] <PLACE> <TOTAL_COUNT>")))] (-> place (* 100.0) (/ total-count) mode-fn int)))) But I wanted to do it a little neater. I wrote a new round function: (defn round ([x] (round :normal x)) ([mode x] (println mode) (println x) (case mode :high (Math/ceil x) :low (Math/floor x) :normal (Math/round x) (throw (Exception. "ERROR: round [:high|:low|:normal] <VALUE>"))))) Then I tried to rewrite get-percentage: (defn get-percentage ([place total-count] (get-percentage :normal place total-count)) ([mode place total-count] (if-not (contains? #{:high :low :normal} mode) (throw (Exception. "ERROR: get-percentage [:high|:low|:normal] <PLACE> <TOTAL_COUNT>"))) (round mode (/ (* place 100.0) total-count)))) But this gives on the last line: CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, When I put before that statement: (println mode) (println place) (println total-count) (println (/ place total-count)) (println (/ (* place 100.0) total-count)) I get the same error on: (println (/ place total-count)) What is happening here? I am using Clojure 1.6.0 on Linux. -- Cecil Westerhof -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.