While still learning clojure, I often times need a function and am not
sure if it already exists or where to look for it.  I thought it would
be useful to be able to give a return value and arguments and search
all functions for ones which return the given value when called with
the given arguments.  Here's what I came up with:

(defn test-for
  "Tests to see if a given function called with given arguments
results
  in given value, catching any exceptions that occur"
  [v f & args]
  (try (= v (apply f args))
    (catch Exception e nil)))

(defn find-func
  "Given a value and arguments, searches all public functions in all
namespaces"
  [v & args]
  (map key
       (mapcat
         (fn [ns_]
           (filter
             #(binding [*out* nil *in* nil]
                (apply test-for v (val %) args))
             (ns-publics (the-ns ns_))))
         (all-ns))))

Binding *in* and *out* stops any IO functions from messing up the
search.  There's probably still ways this could be dangerous though,
depending on the given args.  Hope someone finds this useful or
improves upon it.

-Mitch
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to