Ruby's URI for Clojure

December 13, 2008

Ruby has a nice library for working with URIs:

$ irb --simple-prompt
>> require 'uri'
=> true
>> uri = URI.parse "http://www.google.com/search?q=clojure"
=> #<URI::HTTP:0x2adb22 URL:http://www.google.com/search?q=clojure>
>> uri.scheme
=> "http"
>> uri.host
=> "www.google.com"
>> uri.path
=> "/search"
>> uri.query
=> "q=clojure"

So how do we get this same functionality in Clojure? Well, turns out Java has a library that is functionally equivalent to Ruby's. The downsize is it entirely very Java-ish:

~/src/clojure $ java -jar clojure.jar
Clojure
user=> (def uri (java.net.URI. "http://www.google.com/search?q=clojure"))
#'user/uri
user=> (.getHost uri)
"www.google.com"

It would be nice to use this in a more idiomatic Clojure way, but one of the principals of Clojure is to provide access to all the Java libraries without having to write Clojure wrappers for all of them. So one way to accomplish this is with the clojure bean function. It takes a java bean and returns a Map with the values for all of the getters in the bean. We can use this to use the URI in an idiomatic way that looks more like the Ruby version:

user=> (def uri (bean uri))
#'user/uri
user=> (uri :scheme)
"http"
user=> (uri :host)
"www.google.com"
user=> (uri :path)
"/search"
user=> (uri :query)
"q=clojure" 

Posted in Technology | Tags Clojure

Comments Disabled