Phillip, I’d cry if it weren’t so funny; I’ve just begun to make my way through the lastest Read Eval Print λove and the first page or two dwells on reinvention. At least mine wasn’t intentional.
Edwin -- Edwin Watkeys * 917-324-2435 * http://poseur.com/ <http://poseur.com/> > On Dec 2, 2014, at 8:08 AM, Phillip Lord <phillip.l...@newcastle.ac.uk > <mailto:phillip.l...@newcastle.ac.uk>> wrote: > > > Looks nice. It's pretty similar to Robert Hooke though -- which is more > of an advice library than a hook library despite it's name. > > Edwin Watkeys <e...@poseur.com <mailto:e...@poseur.com>> writes: > >> Hello, >> >> Richelieu, a library for advising functions, is in something resembling >> announcement-worthy shape. It's available at the following URL: >> >> http://github.com/thunknyc/richelieu <http://github.com/thunknyc/richelieu> >> >> During my experience writing thunknyc/profile and the associated CIDER >> support, I realized that advising or decorating functions is something >> that's been getting reinvented over and over. I wanted to put an end to >> that. Richelieu supports advising functions as well as vars and namespaces. >> Multiple advise functions can be associated with a function, and advise >> functions have access to the underlying var or function this is being >> decorated. Below is an edited sample from the README that shows how to >> implement tracing advice using the library. >> >> I hope this may be useful to one or more people out there. I plan on >> modifying thunknyc/profile to use Richelieu as part of a push to implement >> additional profiling modalities. >> >> Regards, >> Edwin >> >> (require '[richelieu.core :refer [advice advise-ns >> *current-advised* >> defadvice]]) >> >> ;;; Here are some simple functions. >> (defn add [& xs] (apply + xs)) >> (defn mult [& xs] (apply * xs)) >> (defn sum-squares [& xs] >> (apply add (map #(mult % %) xs))) >> >> ;;; This tracing advice shows how to get the current advised object, >> ;;; which can either be a var or a function value, depending on the >> ;;; context in which the advice was added. >> (def ^:dynamic *trace-depth* 0) >> >> (defn- ^:unadvisable trace-indent [] >> (apply str (repeat *trace-depth* \space))) >> >> (defadvice trace >> "Writes passed arguments and passes them to underlying >> function. Writes resulting value before returning it as result." >> [f & args] >> (printf "%s> %s %s\n" (trace-indent) *current-advised* args) >> (let [res (binding [*trace-depth* (inc *trace-depth*)] >> (apply f args))] >> (printf "%s< %s %s\n" (trace-indent) *current-advised* res) >> res)) >> >> (advise-ns 'user trace) >> >> (sum-squares 1 2 3 4) >> ;;; The above invocation produces the following output: >> >> ;; > #'user/sum-squares (1 2 3 4) >> ;; > #'user/mult (1 1) >> ;; < #'user/mult 1 >> ;; > #'user/mult (2 2) >> ;; < #'user/mult 4 >> ;; > #'user/mult (3 3) >> ;; < #'user/mult 9 >> ;; > #'user/mult (4 4) >> ;; < #'user/mult 16 >> ;; > #'user/add (1 4 9 16) >> ;; < #'user/add 30 >> ;; < #'user/sum-squares 30 > > -- > Phillip Lord, Phone: +44 (0) 191 208 7827 > Lecturer in Bioinformatics, Email: phillip.l...@newcastle.ac.uk > <mailto:phillip.l...@newcastle.ac.uk> > School of Computing Science, > http://homepages.cs.ncl.ac.uk/phillip.lord > <http://homepages.cs.ncl.ac.uk/phillip.lord> > Room 914 Claremont Tower, skype: russet_apples > Newcastle University, twitter: phillord > NE1 7RU > > -- > 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 > <mailto: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 > <mailto:clojure+unsubscr...@googlegroups.com> > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > <http://groups.google.com/group/clojure?hl=en> > --- > You received this message because you are subscribed to a topic in the Google > Groups "Clojure" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/clojure/ycw4pZQBFfs/unsubscribe > <https://groups.google.com/d/topic/clojure/ycw4pZQBFfs/unsubscribe>. > To unsubscribe from this group and all its topics, send an email to > clojure+unsubscr...@googlegroups.com > <mailto:clojure+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <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.