On Wed, May 21, 2014 at 07:53:18PM -0700, David Gartner wrote:
> (defn div [x y]
>  (/ x y))
>
> (defn throw-catch [f]
>   [(try
>     (f)
>     (catch ArithmeticException e "No dividing by zero!")
>     (catch Exception e (str "You are so bad " (.getMessage e)))
>     (finally (println "returning... ")))])
>
> ...
>
> Can anyone enlighten me?

So, your issue is that your "div" function expects two arguments, while
your "throw-catch" function calls it (although with the name "f") with
zero arguments. Using an anonymous function like #(div 10 5) creates a
new function of zero arguments which then calls your "div" function with
its two arguments.

So, you should find that this will work for your "div" function:

  (defn throw-catch-2 [f a b]
    (try
      (f a b)
      (catch ArithmeticException e "No dividing by zero!")
      (catch Exception e (str "You are so bad " (.getMessage e)))
      (finally (println "returning... "))))
  (throw-catch-2 div 10 5)

To do this more generally, we can use clojure's rest arguments and
"apply" to make this work:

  (defn throw-catch-many [f & args]
    (try
      (apply f args)
      (catch ArithmeticException e "No dividing by zero!")
      (catch Exception e (str "You are so bad " (.getMessage e)))
      (finally (println "returning... "))))
  (throw-catch-many div 10 5)
  (throw-catch-many #(div 10 5))

You can even just use "/" as your function name now, if you'd like:

  (throw-catch-many / 10 5)
  (throw-catch-many / 10 0)

Attachment: signature.asc
Description: Digital signature

Reply via email to