On Sat, Feb 14, 2015 at 6:08 PM, Cecil Westerhof <cldwester...@gmail.com> wrote:
> 2015-02-14 12:33 GMT+01:00 Cecil Westerhof <cldwester...@gmail.com>: > >> >> 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)) >>> >> I don't understand why you prefer this over Phill's suggestion (using comp and having 3 versions of get-percentage). Then you wouldn't need the extra arity (2 param one) too. Phill's version is 7 lines of code, 4 simple defn's & 3 def's. I'm just saying this in case it was overlooked. > (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. >> > > I have now something that is working OK I think. This is what it has > become: > (defmacro static-fn [f] `(fn [x#] (~f x#))) > > (defn round > ([x] (round :normal x)) > ([mode x] > (let [fn (case mode > :high (static-fn Math/ceil) > :low (static-fn Math/floor) > :normal (static-fn Math/round) > (throw (Exception. > "ERROR: round [:high|:low|:normal] <VALUE>")))] > (long (fn x))))) > > (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)))) > > > I made two other handy functions: > (defn round-precision [value precision] > (let [multiplier (Math/pow 10.0 precision)] > (/ (Math/round (* value multiplier)) multiplier))) > > > (defn round-div-precision [dividend divisor precision] > (round-precision (/ (float dividend) divisor) precision)) > > For example: > (round-div-precision 22000 7 3) > gives: > 3142.857 > > and: > (round-div-precision 22000 7 -3) > gives: > 3000.0 > > -- > 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. > -- Kind Regards, Atamert Ölçgen -+- --+ +++ www.muhuk.com -- 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.