I often have to manipulate keywords and symbols.  A symbol name needs
a string appended in a macro, a keyword uses underscores instead of
dashes.

In order to do this, I usually transform them into a string, do some
manipulation, and then turn the result back into a keyword/symbol.
This pattern shows up enough that I created the multimethod below

(defmulti modify (fn [& args] (class (second args))))

(defmethod modify clojure.lang.Keyword
  [f k] (keyword (f (name k))))

(defmethod modify clojure.lang.Symbol
  [f s] (symbol (f (name s))))

(defmethod modify :default
  [f s] (f s))

What this lets me do is use a string library to manipulate keywords/
symbols.  For example

;wraps .toLowerCase
user=>(downcase "ABC")
"abc"

;Expected behavior w/strings
user=>(modify downcase "ABC")
"abc"

user=>(modify downcase :ABC)
:abc

user=>(modify downcase 'ABC)
abc

As you can see, it works on both keywords & symbols without missing a
beat.  Now, let's take it a step further:

(defn super-downcase [input]
  (modify downcase input))

user=>(super-downcase "ABC")
"abc"

user=>(super-downcase :ABC)
:abc

user=>(super-downcase 'ABC)
abc

super-downcase works on all three types, and we now have a new layer
of abstraction in our string function.  Add some macro-fu, et voila -
a unified string/keyword/symbol library.

You can play with the code here:
http://github.com/francoisdevlin/devlinsf-clojure-utils

Check the lib.sfd.str-utils namespace.  Feel free to use the idea as
you see fit.

Hope this helps,
Sean

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

Reply via email to