Hi !

You could rewrite the code like that :


    (defn get-percentage
      ([place total-count] (get-percentage :normal place total-count))
      ([mode place total-count]

       (let [mode-fn (case mode
                           :high    Math/ceil
                           :low     Math/floor
                           :normal  Math/round
                           (throw
(Exception. "ERROR: get-percentage [:high|:low|:normal] <PLACE>
<TOTAL_COUNT>")))]

         (-> place (* 100.0) (/ total-count) mode-fn int))))



I don't know if it's really better, it just removes duplicated code.

You can separate the function in two :

(defn to-mode-fn [mode]
  (if (keyword? mode)
    (case mode :high    Math/ceil
               :low     Math/floor
               :normal  Math/round
      (throw  (Exception. "ERROR: get-percentage [:high|:low|:normal]
<PLACE> <TOTAL_COUNT>")))
    mode))


(defn get-percentage
  ([place total-count] (get-percentage :normal place total-count))
  ([mode-fn place total-count]
     (-> place (* 100.) (/ total-count) (to-mode-fn mode-fn) int)))


;usage
(get-percentage :normal 10 100)

(get-percentage Math/floor 10 100)




Have a nice day,
Jon




On Thu, Feb 12, 2015 at 3:20 AM, Matching Socks <phill.w...@gmail.com>
wrote:

>
> There was also some discussion of this back in November, where Fluid
> Dynamics suggested higher-order functions, and tbc++, multimethods(!).
>
> The main source of complexity in get-percentage has to do with
> selecting what it should do.  Also, both percentage computation and
> rounding could potentially be useful on their own without the other.
> Those considerations recommend higher order functions.  Using
> higher-order functions can make the code shorter, clearer, and more
> flexible.
>
> First, there's the essential computation:
>
> (defn pct [p t] (/ (* p 100.0) t))
>
> Second, various general-purpose ways to round floating-point numbers:
>
> (defn round-up [x]   (int (Math/ceil x)))
> (defn round-down [x] (int (Math/floor x)))
> (defn round [x]      (int (Math/round x)))
>
> To put them together, get-percentage took a hint about the rounding
> function, dispatched on the hint, and took upon itself responsibility
> for detecting a bogus hint.  Instead of a hint from a closed set, why
> not let the caller pass in the rounding function itself?  Now
> get-percentage is down to one line:
>
> (defn get-percentage* [f p t] (f (pct p t)))
>
> For example
>
> (get-percentage* round-up 4 30)
> 14
> (get-percentage* round-down 4 30)
> 13
>
> Alternatively, the standard function "comp" can produce your canned
> combinations, so you might not need get-percentage* itself anymore:
>
> (def get-percentage-high (comp round-up pct))
>
> For example:
>
> (get-percentage-high 4 30)
> 14
>
>
>  --
> 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.
>

-- 
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.

Reply via email to