<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>brool &#187; clojure</title>
	<atom:link href="http://www.brool.com/index.php/category/coding/clojure-coding/feed" rel="self" type="application/rss+xml" />
	<link>http://www.brool.com</link>
	<description>brool \brool\ (n.) : a low roar; a deep murmur or humming</description>
	<lastBuildDate>Fri, 20 Jan 2012 07:58:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Hadoop Shim To Clojure</title>
		<link>http://www.brool.com/index.php/hadoop-shim-to-clojure</link>
		<comments>http://www.brool.com/index.php/hadoop-shim-to-clojure#comments</comments>
		<pubDate>Mon, 08 Nov 2010 09:47:12 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=452</guid>
		<description><![CDATA[I&#8217;ve been working with Hadoop a lot lately in order to do some exploratory data analysis on traffic logs. Hadoop is great; it makes things that were taking 30 minutes run 10x faster, which means that I can iterate a lot faster and experiment with more ways to slice the data. I wanted an easy [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working with Hadoop a lot lately in order to do some exploratory data analysis on traffic logs.  Hadoop is great;  it makes things that were taking 30 minutes run 10x faster, which means that I can iterate a lot faster and experiment with more ways to slice the data.</p>

<p>I wanted an easy way of running Clojure programs under Hadoop, and ended up writing a silly, simple little shim that would simply take a Clojure file with a mapper and reducer function.  It means that there is no .JAR building and no AOT compiling &#8212; just write your mapper and reducer function, bundle up the file, and go.  Note that the JAR is built for Hadoop 0.20 and later.</p>

<h2>Getting The Jar</h2>

<p>The quickest way of downloading the .JAR is to just <a href="http://images.brool.com/blog/files/coding/shim.jar">download it</a>.  </p>

<h2>Building The Jar</h2>

<p>Build the shim:</p>

<pre>javac -cp /usr/lib/hadoop/hadoop-core.jar:/usr/lib/hadoop/lib/*:lib/* -d classes Shim.java</pre>

<p>Create a lib directory and add the clojure classes:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1"><span class="kw2">mkdir</span> lib
<span class="kw2">cp</span> <span class="sy0">/</span>from<span class="sy0">/</span>wherever<span class="sy0">/</span>clojure-1.2.0.jar lib
<span class="kw2">cp</span> <span class="sy0">/</span>from<span class="sy0">/</span>wherever<span class="sy0">/</span>clojure-contrib-1.2.0.jar lib</pre></div></div></div></div></div></div></div>




<p>Bundle it together into one .JAR file:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1">jar <span class="re5">-cvf</span> shim.jar <span class="re5">-C</span> classes<span class="sy0">/</span> . lib<span class="sy0">/*</span></pre></div></div></div></div></div></div></div>




The directory of your .JAR should look something like this when you&#8217;ve finished:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1"><span class="br0">&#91;</span>~<span class="sy0">/</span>github<span class="sy0">/</span>hadoop-shim<span class="br0">&#93;</span> $ jar tf shim.jar
META-INF<span class="sy0">/</span>
META-INF<span class="sy0">/</span>MANIFEST.MF
com<span class="sy0">/</span>
com<span class="sy0">/</span>brool<span class="sy0">/</span>
com<span class="sy0">/</span>brool<span class="sy0">/</span>Shim.class
com<span class="sy0">/</span>brool<span class="sy0">/</span>Shim<span class="re1">$Reduce</span>.class
com<span class="sy0">/</span>brool<span class="sy0">/</span>Shim<span class="re1">$Map</span>.class
lib<span class="sy0">/</span>clojure-1.2.0.jar
lib<span class="sy0">/</span>clojure-contrib-1.2.0.jar</pre></div></div></div></div></div></div></div>




<h2>Using The Jar</h2>

<p>To run the example wordcount:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1">hadoop jar shim.jar com.brool.Shim <span class="re5">-files</span> wordcount.clj input-file output-file</pre></div></div></div></div></div></div></div>




<p>The output from the run will be in output-file/part-r-00000</p>

<h2>More Details</h2>

<p>The Clojure file that you provide should be in the user namespace, and must provide two functions named mapper and reducer.</p>

<h3>Mapper</h3>

<p>The mapper function takes a string representing one line in the input file and returns a list of [ key value ] pairs. A given input line can generate any number of map lines.</p>

<h3>Reducer</h3>

<p>The reducer is given a key and all values that were associated with that key. The reducer&#8217;s function is to consolidate all of that into one output line.</p>

<h2>Example</h2>

<p>Since word count is the canonical example, let&#8217;s do that. The mapper for word count is:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defn</span> mapper <span class="br0">&#91;</span>v<span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>words <span class="br0">&#40;</span><span class="kw1">enumeration-seq</span> <span class="br0">&#40;</span>StringTokenizer<span class="sy0">.</span> v<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
    <span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#40;</span><span class="kw1">do</span> <span class="br0">&#91;</span> <span class="sy0">%</span> <span class="st0">&quot;1&quot;</span> <span class="br0">&#93;</span> <span class="br0">&#41;</span> words<span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>As an example, for an input line of &#8220;This is a test, is it not?&#8221;, the following map will be generated:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="st0">&quot;This&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;is&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;a&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;test,&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;is&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;it&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;not?&quot;</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Before being given the reducer, the Hadoop system will group all like keys together, resulting in:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="st0">&quot;This&quot;</span> <span class="sy0">=&gt;</span> <span class="br0">&#91;</span> <span class="st0">&quot;1&quot;</span> <span class="br0">&#93;</span>
<span class="st0">&quot;is&quot;</span>     <span class="sy0">=&gt;</span> <span class="br0">&#91;</span> <span class="st0">&quot;1&quot;</span> <span class="st0">&quot;1&quot;</span> <span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>




<p>So on and so forth. The reducer is given the key and the list of all values that had that key, and then emits the final result &#8212; for a word count, the correct code would be:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defn</span> reducer <span class="br0">&#91;</span>k v<span class="br0">&#93;</span>
  <span class="br0">&#91;</span> k <span class="br0">&#40;</span><span class="kw1">reduce</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#40;</span>Integer<span class="sy0">/</span>parseInt <span class="sy0">%</span><span class="br0">&#41;</span> v<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>This simply adds up the counts.</p>

<h2>Testing</h2>

<p>In wordcount.clj there are two handy functions that allow for debugging of the mapper and reducer before submitting it to Hadoop.</p>

<p>Given a local file, the test-mapper will load the file and run it through the mapper; if your file is large you may just want to (take 20 (test-mapper &#8220;/my/filename&#8221;)).</p>

<p>The test-reducer function will load the file and run it through both the mapper and the reducer. Taking the example sentence above:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">user<span class="sy0">&gt;</span> <span class="br0">&#40;</span>test<span class="sy0">-</span>reducer <span class="st0">&quot;/tmp/one-sentence&quot;</span><span class="br0">&#41;</span>
<span class="br0">&#40;</span><span class="br0">&#91;</span><span class="st0">&quot;This&quot;</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;a&quot;</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;is&quot;</span> <span class="nu0">2</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;it&quot;</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;not?&quot;</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;test,&quot;</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<h2>Example #2</h3>

<p>As another example: let&#8217;s say that you have a collection of log entries, and would like to record the first and last log entry for every user. Assume that the files are in a CSV format, with the fields being in the order of timehit, userid. Example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1"><span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">13</span>:04:<span class="nu0">22</span>,<span class="nu0">112334</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">10</span>:04:<span class="nu0">22</span>,<span class="nu0">182994</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">10</span>:05:<span class="nu0">18</span>,<span class="nu0">182994</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">10</span>:07:<span class="nu0">19</span>,<span class="nu0">182994</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">13</span>:<span class="nu0">28</span>:<span class="nu0">41</span>,<span class="nu0">112334</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">10</span>:09:<span class="nu0">22</span>,<span class="nu0">182994</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">13</span>:<span class="nu0">56</span>:<span class="nu0">22</span>,<span class="nu0">112334</span>
<span class="nu0">2010</span>-<span class="nu0">10</span>-04 <span class="nu0">11</span>:<span class="nu0">30</span>:01,<span class="nu0">182994</span></pre></div></div></div></div></div></div></div>




<p>The mapper for this:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defn</span> mapper <span class="br0">&#91;</span>v<span class="br0">&#93;</span>
    <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>timehit userid<span class="br0">&#93;</span> <span class="br0">&#40;</span><span class="sy0">.</span>split v <span class="st0">&quot;,&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
        <span class="br0">&#91;</span> <span class="br0">&#91;</span> userid timehit <span class="br0">&#93;</span> <span class="br0">&#93;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>The reducer:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defn</span> reducer <span class="br0">&#91;</span>k v<span class="br0">&#93;</span>
<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>s <span class="br0">&#40;</span><span class="kw1">sort</span> v<span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span>k <span class="br0">&#40;</span><span class="kw1">str</span> <span class="br0">&#40;</span><span class="kw1">first</span> s<span class="br0">&#41;</span> <span class="st0">&quot;,&quot;</span> <span class="br0">&#40;</span>last s<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>The source is <a href="https://github.com/brool/hadoop-shim">all on Github</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/hadoop-shim-to-clojure/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Beaujiful Soup</title>
		<link>http://www.brool.com/index.php/beaujiful-soup</link>
		<comments>http://www.brool.com/index.php/beaujiful-soup#comments</comments>
		<pubDate>Thu, 28 Oct 2010 05:11:16 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[beautiful]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[soup]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=441</guid>
		<description><![CDATA[Horrible name, isn&#8217;t it? Beautiful Soup is a really nice Python library for extracting content from possibly-sloppy HTML, and I wanted some reasonably close Clojure equivalent. Unfortunately, the standard classes don&#8217;t work well with malformed HTML; as an example: =&#62; &#40;require '&#40;clojure &#91;xml :as xml&#93;&#41;&#41; =&#62; &#40;xml/parse &#34;http://www.google.com&#34;&#41; org.xml.sax.SAXParseException: The markup in the document preceding [...]]]></description>
			<content:encoded><![CDATA[<p>Horrible name, isn&#8217;t it? </p>

<p><a href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> is a really nice Python library for extracting content from possibly-sloppy HTML, and I wanted some reasonably close Clojure equivalent.  Unfortunately, the standard classes don&#8217;t work well with malformed HTML;  as an example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="sy0">=&gt;</span> <span class="br0">&#40;</span>require '<span class="br0">&#40;</span>clojure <span class="br0">&#91;</span>xml :<span class="me1">as</span> xml<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="sy0">=&gt;</span> <span class="br0">&#40;</span>xml<span class="sy0">/</span>parse <span class="st0">&quot;http://www.google.com&quot;</span><span class="br0">&#41;</span>
    org<span class="sy0">.</span>xml<span class="sy0">.</span>sax<span class="sy0">.</span>SAXParseException: <span class="me1">The</span> markup in the document preceding the root element must be well<span class="sy0">-</span>formed<span class="sy0">.</span> <span class="br0">&#40;</span>NO_SOURCE_FILE:<span class="nu0">0</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Fortunately, there is already a <a href="http://home.ccil.org/~cowan/XML/tagsoup/">TagSoup</a> library that can parse non-perfect HTML, and it is very <a href="http://markmail.org/message/2e7i72y4cg36wqdx">easy to integrate</a> TagSoup into xml/parse.  This module hardly does anything; it simply adds a few helper routines and brings the most-used calls into one amazingly bad namespace name.</p>

<h1>Examples</h1>

<p>Building your soup:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="br0">&#40;</span>use beaujiful<span class="sy0">-</span>soup<span class="sy0">.</span>core<span class="br0">&#41;</span>
&nbsp;
    <span class="co1">; build soup from URL</span>
    <span class="br0">&#40;</span><span class="kw1">def</span> t <span class="br0">&#40;</span>build<span class="sy0">-</span>soup <span class="st0">&quot;http://www.google.com&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1">; build soup from (deliberately malformed) string</span>
    <span class="br0">&#40;</span><span class="kw1">def</span> t2 <span class="br0">&#40;</span>build<span class="sy0">-</span>string<span class="sy0">-</span>soup <span class="st0">&quot;&lt;html&gt;&lt;body&gt;&lt;ul&gt;&lt;li&gt;One&lt;li&gt;Two&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Extracting information is done with the xml-> call. Oftentimes the last thing you do will be a node or text or (attr :attribute) call, in order to convert the results into a more workable type:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="co1">; you can &quot;walk&quot; down the tree with successive tag names.  For</span>
    <span class="co1">; example, get every list item inside the unordered list</span>
    <span class="co1">; immediately inside the body.</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t2 :<span class="me1">body</span> :<span class="me1">ul</span> :<span class="me1">li</span> node<span class="br0">&#41;</span>
    <span class="co1">; =&gt; ({:tag :li, :attrs nil, :content [&quot;One&quot;]} {:tag :li, :attrs nil, :content [&quot;Two&quot;]})</span>
&nbsp;
    <span class="co1">; get the text for the list items</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t2 :<span class="me1">body</span> :<span class="me1">ul</span> :<span class="me1">li</span> text<span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;One&quot; &quot;Two&quot;)</span>
&nbsp;
    <span class="co1">; Get textareas immediately inside the body.</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t :<span class="me1">body</span> :<span class="me1">textarea</span> node<span class="br0">&#41;</span>
    <span class="co1">; =&gt; ({:tag :textarea, :attrs {:id &quot;csi&quot;, :style &quot;display:none&quot;}, :content nil})</span>
&nbsp;
    <span class="co1">; use descendants to iterate through all nodes, not just the immediate children.</span>
    <span class="co1">; Get the text from all &lt;a&gt; tags anywhere in the body.</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants :<span class="me1">a</span> text<span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;Images&quot; &quot;Videos&quot; &quot;Maps&quot; ...)</span>
&nbsp;
    <span class="co1">;  Get the href attribute from all tags</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants :<span class="me1">a</span> <span class="br0">&#40;</span>attr :<span class="me1">href</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;http://www.google.com/imghp?hl=en&amp;tab=wi&quot; ... )</span></pre></div></div></div></div></div></div></div>




<p>Use the (attr=) predicate to match an attribute value:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="co1">; find invisible stuff</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t2 descendants <span class="br0">&#40;</span>attr<span class="sy0">=</span> :<span class="me1">style</span> <span class="st0">&quot;display:none&quot;</span><span class="br0">&#41;</span> tag<span class="br0">&#41;</span>
    <span class="co1">; =&gt; (:textarea :iframe)</span></pre></div></div></div></div></div></div></div>




<p>Strings match the text inside nodes:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="co1">; find the link for the &lt;a&gt; that has &quot;Videos&quot; for content</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants :<span class="me1">a</span> <span class="st0">&quot;Videos&quot;</span> <span class="br0">&#40;</span>attr :<span class="me1">href</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;http://video.google.com/?hl=en&amp;tab=wv&quot;)</span></pre></div></div></div></div></div></div></div>




<p>Arbitrary predicates can be used as well.  They will take a loc (location), and are usually converted to a node before being used:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="co1">; find any :p or :div</span>
    <span class="br0">&#40;</span><span class="kw1">defn</span> p<span class="sy0">-</span>or<span class="sy0">-</span>div <span class="br0">&#91;</span>loc<span class="br0">&#93;</span> <span class="br0">&#40;</span>contains? #<span class="br0">&#123;</span>:<span class="me1">p</span> :<span class="me1">div</span><span class="br0">&#125;</span> <span class="br0">&#40;</span>:<span class="me1">tag</span> <span class="br0">&#40;</span>node loc<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants p<span class="sy0">-</span>or<span class="sy0">-</span>div tag<span class="br0">&#41;</span>
    <span class="co1">; =&gt; (:div :div :div :div :div :div :div :div :div :div :div :p :div :div)</span>
&nbsp;
    <span class="co1">; find the link for &lt;a&gt; that has case-insensitive &quot;Videos&quot; for content</span>
    <span class="br0">&#40;</span>require 'clojure<span class="sy0">.</span>string<span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">defn</span> f <span class="br0">&#91;</span>loc<span class="br0">&#93;</span> 
      <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>n <span class="br0">&#40;</span>node loc<span class="br0">&#41;</span><span class="br0">&#93;</span>
       <span class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span>:<span class="me1">tag</span> n<span class="br0">&#41;</span> :<span class="me1">a</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span>clojure<span class="sy0">.</span>string<span class="sy0">/</span>upper<span class="sy0">-</span>case <span class="br0">&#40;</span><span class="kw1">first</span> <span class="br0">&#40;</span>:<span class="me1">content</span> n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="st0">&quot;VIDEOS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants f <span class="br0">&#40;</span>attr :<span class="me1">href</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;http://video.google.com/?hl=en&amp;tab=wv&quot;)</span></pre></div></div></div></div></div></div></div>




<p>Fundamentally, the xml-> call returns a list of locations, and you can apply arbitrary transforms as necessary.  For example, let&#8217;s say that you want to build a map of text => hrefs for all of the links:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="br0">&#40;</span><span class="kw1">defn</span> loc<span class="sy0">-</span>to<span class="sy0">-</span>pair <span class="br0">&#91;</span>loc<span class="br0">&#93;</span>
        <span class="br0">&#91;</span> <span class="br0">&#40;</span>attr loc :<span class="me1">href</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>text loc<span class="br0">&#41;</span> <span class="br0">&#93;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">apply</span> <span class="kw1">hash-map</span> <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants :<span class="me1">a</span> loc<span class="sy0">-</span>to<span class="sy0">-</span>pair<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="co1">; =&gt; {&quot;/services/&quot; &quot;Business Solutions&quot;,  ... }</span></pre></div></div></div></div></div></div></div>




<p>Having a vector in the chain applies all the predicates within the vector, and filters out anything that doesn&#8217;t match.  It acts a little like a lookahead in a regex.  For example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="co1">; Find the IDs of all divs that contain an href immediately within them</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants :<span class="me1">div</span> <span class="br0">&#91;</span> :<span class="me1">a</span> <span class="br0">&#93;</span> <span class="br0">&#40;</span>attr :<span class="me1">id</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;fll&quot;)</span>
&nbsp;
    <span class="co1">; Find the IDs of all divs that contains an href anywhere within them</span>
    <span class="br0">&#40;</span>xml<span class="sy0">-&gt;</span> t descendants :<span class="me1">div</span> <span class="br0">&#91;</span> descendants :<span class="me1">a</span> <span class="br0">&#93;</span> <span class="br0">&#40;</span>attr :<span class="me1">id</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="co1">; =&gt; (&quot;ghead&quot; &quot;gbar&quot; &quot;guser&quot; &quot;fll&quot;)</span></pre></div></div></div></div></div></div></div>




<h1>Source</h1>

<a href="https://github.com/brool/beaujiful-soup">It&#8217;s all on Github</a>.]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/beaujiful-soup/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Setting Up Incanter and MySQL</title>
		<link>http://www.brool.com/index.php/setting-up-incanter-and-mysql</link>
		<comments>http://www.brool.com/index.php/setting-up-incanter-and-mysql#comments</comments>
		<pubDate>Thu, 21 Jan 2010 19:16:02 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=420</guid>
		<description><![CDATA[Okay, Lein really does make stuff pretty easy. Rather than wrestling with eleventybillion classpaths, just install Lein. Create a new project directory with lein new mydirectory Change the project.clj file that is autogenerated with: &#40;defproject mydirectory &#34;1.0.0-SNAPSHOT&#34; :description &#34;FIXME: write&#34; :dependencies &#91;&#91;org.clojure/clojure &#34;1.1.0-alpha-SNAPSHOT&#34;&#93; &#91;org.clojure/clojure-contrib &#34;1.0-SNAPSHOT&#34;&#93; &#91;mysql/mysql-connector-java &#34;5.1.6&#34;&#93; &#91;incanter/incanter &#34;1.0-master-SNAPSHOT&#34;&#93;&#93;&#41; (that is, add the mysql and [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, Lein really does make stuff pretty easy.  Rather than wrestling with eleventybillion classpaths, just <a href="http://github.com/technomancy/leiningen">install Lein</a>.</p>

Create a new project directory with <code>lein new mydirectory</code>

Change the project.clj file that is autogenerated with:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>defproject mydirectory <span class="st0">&quot;1.0.0-SNAPSHOT&quot;</span> :<span class="me1">description</span> <span class="st0">&quot;FIXME: write&quot;</span> 
  :<span class="me1">dependencies</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>org<span class="sy0">.</span>clojure<span class="sy0">/</span>clojure <span class="st0">&quot;1.1.0-alpha-SNAPSHOT&quot;</span><span class="br0">&#93;</span> 
    <span class="br0">&#91;</span>org<span class="sy0">.</span>clojure<span class="sy0">/</span>clojure<span class="sy0">-</span>contrib <span class="st0">&quot;1.0-SNAPSHOT&quot;</span><span class="br0">&#93;</span>
    <span class="br0">&#91;</span>mysql<span class="sy0">/</span>mysql<span class="sy0">-</span>connector<span class="sy0">-</span>java <span class="st0">&quot;5.1.6&quot;</span><span class="br0">&#93;</span>
    <span class="br0">&#91;</span>incanter<span class="sy0">/</span>incanter <span class="st0">&quot;1.0-master-SNAPSHOT&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>(that is, add the mysql and incanter dependencies).</p>

<p>Download all the dependencies with <code>lein deps</code></p>

<p>Start up a REPL with <i>everything in the classpath</i> by just using <code>lein repl</code></p>

<p>Wow, that&#8217;s kind of nice.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/setting-up-incanter-and-mysql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Modest Proposal</title>
		<link>http://www.brool.com/index.php/a-modest-proposal</link>
		<comments>http://www.brool.com/index.php/a-modest-proposal#comments</comments>
		<pubDate>Tue, 01 Sep 2009 16:21:25 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[clojure compojure php]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=373</guid>
		<description><![CDATA[Warning: a very rambling article; less a solid proposal than me just exploring an idea that may lead to a dead end in a week or two after I&#8217;ve thought about it. I really enjoy Clojure. Everything seems so well thought out and well designed; in a lot of ways it reminds me of Python, [...]]]></description>
			<content:encoded><![CDATA[<p><i>Warning: a very rambling article; less a solid proposal than me just exploring an idea that may lead to a dead end in a week or two after I&#8217;ve thought about it.</i></p>

<p>I really enjoy Clojure. Everything seems so well thought out and well designed; in a lot of ways it reminds me of Python, which is three ways to ironic because back in the day I started using Python because it was very Lispy. The cycle of life turns even on computer languages.</p>

<p>But unfortunately, I get the sense that there&#8217;s probably only room for one JVM language to make it big.  As much as I like Clojure, I think that Scala will probably be the one that succeeds.  It&#8217;s got the static typing, it&#8217;s got the Java-like performance, and it&#8217;s got a syntax that&#8217;s close-ish to Java, so it fills the niche that Java fills so well: a programming language that is ideal for large groups of developers.</p>

<p>However, it&#8217;s early enough in the development of Clojure that there&#8217;s the sense that maybe individual efforts could make a difference.  (As a counterexample, Haskell is too far along &mdash; it seems like everything has been done already, or anything that needs to be done requires a deep knowledge of category theory and the latest functional design papers.)</p>

<p>Assuming that I would want to help out Clojure, what could be done?</p>

<p>Donate? Actually, I did that. I figured that I got as many hours of enjoyment out of Clojure as I did out of a typical game, so I contributed the price of a game.</p>

<p>Libraries?  Well, I&#8217;ve written one or two.  Will probably write more.</p>

<p>If Clojure is going to succeed, it needs a <i>niche</i>, an area in which it performs so well that it blows everything else away.  Concurrent programming is one possibility, but there is a lot of competition there.</p>

<p>I have a modest proposal:</p>

<p>Clojure should be more like PHP.</p>

<p>Yes, yes, I know that programming in PHP is socially reprehensible, just one step above people that shop without their shirt while in Walmart and car salesmen.</p>

<p>But what if we were to give Clojure the trappings that make starting developers try it?  Metaphorically, it&#8217;s like <i>Gulliver&#8217;s Travels</i>; it <i>looks</i> like a humorous, light-hearted adventure story, but underneath it&#8217;s biting political satire and deep thoughts.  We lure developers in with the possibility of an easy, light-hearted way to write web sites&#8230; and then once they&#8217;re in there, once they&#8217;ve progressed from manipulating web sites and start to realize the benefits of advanced languages, they can deal with a sane language, built on top of the JVM and with the full power of a Lisp.</p>

<p>So call this Gulliver.</p>

<h2>Why Did PHP Succeed?</h2>

<p>My impression, based on absolutely no citations or hard evidence, is that PHP became popular primarily because it is:</p>

<ul>
<li>Easy to start trying &mdash; start with an HTML page, and just add one statement to start playing around with PHP itself</li>
<li>Easy to access data &mdash; typically, with MySQL</li>
<li>Easy to deploy &mdash; just upload a file and go</li>
</ul>

<p>So, continuing the gedankenexperiment: if we were designing something that would be very approachable and very easy to use, what would it look like?</p>

<h2>Making Compojure More Approachable</h2>

<p>Compojure is an excellent base to start with, but it strays away from templates, and instead tries to do everything with compojure.html, a library that allows you to form everything with vectors and lists:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lisp"><pre class="de1"><span class="br0">&#40;</span>html <span class="br0">&#91;</span><span class="sy0">:</span><span class="me1">p</span> <span class="st0">&quot;2 + 2 = &quot;</span> <span class="br0">&#40;</span>+ <span class="nu0">2</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Handy? Yes, if you&#8217;re a developer. But if a web designer is doing your HTML, or if you&#8217;re just starting out programming and you already know HTML, though, it seems an additional barrier to entry.  So what if we turn it inside out and do it like PHP does it?</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html4strict"><pre class="de1"><span class="sc2">&lt;<span class="kw2">p</span>&gt;</span>2 + 2 = <span class="sc2">&lt;?<span class="sy0">=</span> <span class="br0">&#40;</span>+ <span class="nu0">2</span> <span class="nu0">2</span><span class="br0">&#41;</span> ?&gt;</span></pre></div></div></div></div></div></div></div>




<p>Trying something more complicated, in compojure.html this:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lisp"><pre class="de1"><span class="br0">&#40;</span>html <span class="br0">&#91;</span><span class="sy0">:</span><span class="me1">ul</span> <span class="br0">&#40;</span>map <span class="br0">&#40;</span>fn <span class="br0">&#91;</span>x<span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="sy0">:</span><span class="me1">li</span> x<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>range <span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




becomes:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html4strict"><pre class="de1"><span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span>
  <span class="sc2">&lt;? <span class="br0">&#40;</span>dotimes <span class="br0">&#91;</span>x <span class="nu0">10</span><span class="br0">&#93;</span> ?&gt;</span>
  <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;?<span class="sy0">=</span> x ?&gt;</span>
  <span class="sc2">&lt;? <span class="br0">&#41;</span> ?&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span></pre></div></div></div></div></div></div></div>




<p>A little bit longer, but treating it as HTML makes it conceptually easier for beginning programmers to understand, especially if you want to do something like changing the id or class with every row so your CSS can make it all pretty:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html4strict"><pre class="de1"><span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span>
  <span class="sc2">&lt;? <span class="br0">&#40;</span>dotimes <span class="br0">&#91;</span>x <span class="nu0">10</span><span class="br0">&#93;</span> ?&gt;</span>
  <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;list-&lt;?= x ?&gt;</span></span>&quot; class=&quot;<span class="sc2">&lt;?<span class="sy0">=</span> <span class="br0">&#40;</span>if <span class="br0">&#40;</span>even? x<span class="br0">&#41;</span> <span class="st0">&quot;even&quot;</span> <span class="st0">&quot;odd&quot;</span><span class="br0">&#41;</span> ?&gt;</span>&quot;&gt;<span class="sc2">&lt;?<span class="sy0">=</span> x ?&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
  <span class="sc2">&lt;? <span class="br0">&#41;</span> ?&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span></pre></div></div></div></div></div></div></div>




<p>Doing this is compojure.html is trickier:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lisp"><pre class="de1"><span class="br0">&#40;</span>html 
  <span class="br0">&#91;</span><span class="sy0">:</span><span class="me1">ul</span> 
    <span class="br0">&#40;</span>map <span class="br0">&#40;</span>fn <span class="br0">&#91;</span>x<span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="sy0">:</span><span class="me1">li</span> <span class="br0">&#123;</span><span class="sy0">:</span><span class="me1">id</span> <span class="br0">&#40;</span>str <span class="st0">&quot;list-&quot;</span> x<span class="br0">&#41;</span> <span class="sy0">:</span><span class="me1">class</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>even? x<span class="br0">&#41;</span> <span class="st0">&quot;even&quot;</span> <span class="st0">&quot;odd&quot;</span><span class="br0">&#41;</span><span class="br0">&#125;</span> x<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>range <span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>So, let&#8217;s lure people in with easy to use, and they can pick up vectors and S-exprs and notational convenience later.  Converting a template file into the basic code is easy:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lisp"><pre class="de1"><span class="br0">&#40;</span>defn- transform-string
  <span class="st0">&quot;Internal.  Transform a string into the appropriate echo statement.
An empty string translates into a single space.&quot;</span>  
  <span class="br0">&#91;</span>s<span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">&gt;</span> <span class="br0">&#40;</span><span class="sy0">.</span><span class="kw1">length</span> s<span class="br0">&#41;</span> <span class="nu0">0</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>format <span class="st0">&quot;(gulliver/echo %s)&quot;</span> <span class="br0">&#40;</span>pr-str s<span class="br0">&#41;</span><span class="br0">&#41;</span>
  <span class="st0">&quot; &quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span>defn- transform-code
  <span class="st0">&quot;Internal.  Transform code so that it can run as a render routine.&quot;</span>
  <span class="br0">&#91;</span>s<span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span>first s<span class="br0">&#41;</span> \<span class="sy0">=</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>format <span class="st0">&quot;(gulliver/echo %s)&quot;</span> <span class="br0">&#40;</span><span class="sy0">.</span>substring s <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    s<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span>defn- convert* 
  <span class="st0">&quot;Internal.  Given a string that represents a Clojure template,
produce a flat list of the statements necessary to produce that template.&quot;</span>
  <span class="br0">&#91;</span>s<span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>m <span class="br0">&#40;</span>re-matcher #<span class="st0">&quot;(?s)(.*?)&lt;<span class="es0">\?</span>(.+?)<span class="es0">\?</span>&gt;|(.+?)$&quot;</span> s<span class="br0">&#41;</span><span class="br0">&#93;</span>
    <span class="br0">&#40;</span>loop <span class="br0">&#91;</span>next <span class="br0">&#40;</span>re-find m<span class="br0">&#41;</span> buffer <span class="br0">&#91;</span><span class="st0">&quot;'(&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span>
      <span class="br0">&#40;</span><span class="kw1">cond</span>
       <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span><span class="kw1">nil</span>? <span class="br0">&#40;</span><span class="kw1">nth</span> next <span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
           <span class="br0">&#40;</span><span class="kw1">eval</span> <span class="br0">&#40;</span>read-string <span class="br0">&#40;</span><span class="kw1">apply</span> str <span class="br0">&#40;</span>conj buffer <span class="br0">&#40;</span>transform-string <span class="br0">&#40;</span><span class="kw1">nth</span> next <span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="st0">&quot;)&quot;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
       <span class="sy0">:</span><span class="me1">otherwise</span> <span class="br0">&#40;</span>recur 
                   <span class="br0">&#40;</span>re-find m<span class="br0">&#41;</span> 
                   <span class="br0">&#40;</span>conj buffer 
                         <span class="br0">&#40;</span>transform-string <span class="br0">&#40;</span><span class="kw1">nth</span> next <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
                         <span class="br0">&#40;</span>transform-code <span class="br0">&#40;</span><span class="kw1">nth</span> next <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Resulting in&#8230;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lisp"><pre class="de1"><span class="sy0">==&gt;</span> <span class="br0">&#40;</span>convert* <span class="st0">&quot;&lt;ul&gt;&lt;? (dotimes [x 10] ?&gt;&lt;li&gt;&lt;?= x ?&gt;&lt;/li&gt;&lt;? ) ?&gt;&lt;/ul&gt;&quot;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="br0">&#40;</span>gulliver/echo <span class="st0">&quot;&lt;ul&gt;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">dotimes</span> <span class="br0">&#91;</span>x <span class="nu0">10</span><span class="br0">&#93;</span> <span class="br0">&#40;</span>gulliver/echo <span class="st0">&quot;&lt;li&gt;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>gulliver/echo x<span class="br0">&#41;</span> <span class="br0">&#40;</span>gulliver/echo <span class="st0">&quot;&lt;/li&gt;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>gulliver/echo <span class="st0">&quot;&lt;/ul&gt;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Once you have the basic code generation, it&#8217;s easy enough to hook it up to a default servlet that automatically invokes it when necessary. There&#8217;s a fair bit of handwaving going on here &mdash; regexes are questionable for this, there are some interesting issues with namespaces, and it would require some method of resolving dependencies between files, but heck, it&#8217;s only 100 lines of code;  it was really quick to put together and gives us a sense of whether this can work out.</p>

<p>So, with the <a href="http://github.com/brool/gulliver/tree/master">source on github</a>, your basic server becomes&#8230;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>use 'gulliver<span class="br0">&#41;</span>
<span class="br0">&#40;</span>defserver web<span class="sy0">-</span>server
  <span class="br0">&#123;</span>:<span class="me1">port</span> <span class="nu0">8080</span><span class="br0">&#125;</span>
  <span class="st0">&quot;/*&quot;</span>  <span class="br0">&#40;</span>servlet gulliver<span class="sy0">/</span>template<span class="sy0">-</span>servlet<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Easy!  As an test, an example file:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="sy0">&lt;</span>?
<span class="br0">&#40;</span><span class="kw1">import</span> 'java<span class="sy0">.</span>util<span class="sy0">.</span>Date<span class="br0">&#41;</span>
?<span class="sy0">&gt;</span>
&nbsp;
<span class="sy0">&lt;</span>html<span class="sy0">&gt;</span>
  <span class="sy0">&lt;</span>body<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>h1<span class="sy0">&gt;</span>Delivered via Gulliver<span class="sy0">&lt;/</span>h1<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>p<span class="sy0">&gt;</span>Expressions at work: <span class="sy0">&lt;</span>?<span class="sy0">=</span> <span class="br0">&#40;</span><span class="sy0">+</span> <span class="nu0">2</span> <span class="nu0">2</span><span class="br0">&#41;</span> ?<span class="sy0">&gt;&lt;/</span>p<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>p<span class="sy0">&gt;</span>Looping:<span class="sy0">&lt;/</span>p<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>ul<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>? <span class="br0">&#40;</span><span class="kw1">dotimes</span> <span class="br0">&#91;</span>x <span class="nu0">10</span><span class="br0">&#93;</span> ?<span class="sy0">&gt;</span>
      <span class="sy0">&lt;</span>li<span class="sy0">&gt;&lt;</span>?<span class="sy0">=</span> x ?<span class="sy0">&gt;&lt;/</span>li<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>? <span class="br0">&#41;</span> ?<span class="sy0">&gt;</span>
    <span class="sy0">&lt;/</span>ul<span class="sy0">&gt;</span>
&nbsp;
    <span class="sy0">&lt;</span>p<span class="sy0">&gt;</span>Here's a date:  <span class="sy0">&lt;</span>?<span class="sy0">=</span> <span class="br0">&#40;</span>Date<span class="sy0">.</span><span class="br0">&#41;</span> ?<span class="sy0">&gt;&lt;/</span>p<span class="sy0">&gt;</span>
  <span class="sy0">&lt;/</span>body<span class="sy0">&gt;</span>
<span class="sy0">&lt;/</span>html<span class="sy0">&gt;</span></pre></div></div></div></div></div></div></div>




<p>&#8230; does the right thing. How about a time test?</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="sy0">&lt;</span>html<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>body<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>h1<span class="sy0">&gt;</span>Starting <span class="kw1">time</span> test<span class="sy0">...&lt;/</span>h1<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>? <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span> start <span class="br0">&#40;</span>System<span class="sy0">/</span>currentTimeMillis<span class="br0">&#41;</span> <span class="br0">&#93;</span> ?<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>p<span class="sy0">&gt;</span>Adding <span class="nu0">1</span><span class="sy0">..</span><span class="nu0">100000</span>:  <span class="sy0">&lt;</span>?<span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">reduce</span> <span class="sy0">+</span> <span class="nu0">0</span> <span class="br0">&#40;</span><span class="kw1">range</span> <span class="nu0">1</span> <span class="nu0">1000001</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ?<span class="sy0">&gt;&lt;/</span>p<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>p<span class="sy0">&gt;</span><span class="br0">&#40;</span>took <span class="sy0">&lt;</span>?<span class="sy0">=</span> <span class="br0">&#40;</span><span class="sy0">-</span> <span class="br0">&#40;</span>System<span class="sy0">/</span>currentTimeMillis<span class="br0">&#41;</span> start<span class="br0">&#41;</span> ?<span class="sy0">&gt;</span> ms<span class="br0">&#41;</span><span class="sy0">&lt;/</span>p<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>? <span class="br0">&#41;</span> ?<span class="sy0">&gt;</span> 
    <span class="sy0">&lt;/</span>body<span class="sy0">&gt;</span>
<span class="sy0">&lt;/</span>html<span class="sy0">&gt;</span></pre></div></div></div></div></div></div></div>




<p>&#8230; runs in about 50ms.  PHP takes about 130ms on the same sequence on my laptop, so, while there are tons of optimizations we could do (like not doing a stat on the file every time the page is rendered (!)), it nonetheless performs well enough that maybe this is a viable option. Finally, as a special bonus, a stupid eval trick that evaluates Clojure code:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="sy0">&lt;</span>html<span class="sy0">&gt;</span>
    <span class="sy0">&lt;</span>body<span class="sy0">&gt;</span>
        <span class="sy0">&lt;</span>? <span class="br0">&#40;</span><span class="kw1">when</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>request :<span class="me1">params</span><span class="br0">&#41;</span> :<span class="me1">code</span><span class="br0">&#41;</span> ?<span class="sy0">&gt;</span>
        <span class="sy0">&lt;</span>pre style<span class="sy0">=</span><span class="st0">&quot;border: 1px dotted&quot;</span><span class="sy0">&gt;</span>
        <span class="sy0">&lt;</span>?<span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">str</span> <span class="br0">&#40;</span>eval <span class="br0">&#40;</span>read<span class="sy0">-</span>string <span class="br0">&#40;</span><span class="br0">&#40;</span>request :<span class="me1">params</span><span class="br0">&#41;</span> :<span class="me1">code</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ?<span class="sy0">&gt;</span>
        <span class="sy0">&lt;/</span>pre<span class="sy0">&gt;</span>
        <span class="sy0">&lt;</span>? <span class="br0">&#41;</span> ?<span class="sy0">&gt;</span>
        <span class="sy0">&lt;</span>form method<span class="sy0">=</span><span class="st0">&quot;post&quot;</span><span class="sy0">&gt;</span>
        <span class="sy0">&lt;</span>textarea name<span class="sy0">=</span><span class="st0">&quot;code&quot;</span> rows<span class="sy0">=</span><span class="nu0">10</span> cols<span class="sy0">=</span><span class="nu0">80</span><span class="sy0">&gt;&lt;/</span>textarea<span class="sy0">&gt;&lt;</span>br<span class="sy0">/&gt;</span>
        <span class="sy0">&lt;</span>input type<span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> value<span class="sy0">=</span><span class="st0">&quot;Evaluate&quot;</span> <span class="sy0">/&gt;</span>
        <span class="sy0">&lt;/</span>form<span class="sy0">&gt;</span>
    <span class="sy0">&lt;/</span>body<span class="sy0">&gt;</span>
<span class="sy0">&lt;/</span>html<span class="sy0">&gt;</span></pre></div></div></div></div></div></div></div>




<p>Take that, non-dynamic languages!</p>

<p><a href="http://github.com/brool/gulliver/tree/master">Github copy of the source</a></p>.

<p>Next part:  Schema-ing Against MySQL</p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/a-modest-proposal/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Snippet: Automatic Proxy Creation in Clojure</title>
		<link>http://www.brool.com/index.php/snippet-automatic-proxy-creation-in-clojure</link>
		<comments>http://www.brool.com/index.php/snippet-automatic-proxy-creation-in-clojure#comments</comments>
		<pubDate>Fri, 21 Aug 2009 22:20:42 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=366</guid>
		<description><![CDATA[The proxy function makes it easy for Clojure to interface with the Java layer, but I was dealing with an interface (the AIM Java API) that had an punitive number of things that needed to be overridden&#8230; public void OnIdleStateChange&#40;AccSession arg0, int arg1&#41; &#123; &#125; &#160; public void OnInstanceChange&#40;AccSession arg0, AccInstance arg1, AccInstance arg2, AccInstanceProp [...]]]></description>
			<content:encoded><![CDATA[<p>The proxy function makes it easy for Clojure to interface with the Java layer, but I was dealing with an interface (the AIM Java API) that had an punitive number of things that needed to be overridden&#8230;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> OnIdleStateChange<span class="br0">&#40;</span>AccSession arg0, <span class="kw4">int</span> arg1<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> OnInstanceChange<span class="br0">&#40;</span>AccSession arg0, AccInstance arg1, AccInstance arg2, AccInstanceProp arg3<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> OnLookupUsersResult<span class="br0">&#40;</span>AccSession arg0, <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> arg1, <span class="kw4">int</span> arg2, AccResult arg3, AccUser<span class="br0">&#91;</span><span class="br0">&#93;</span> arg4<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> OnSearchDirectoryResult<span class="br0">&#40;</span>AccSession arg0, <span class="kw4">int</span> arg1, AccResult arg2, AccDirEntry arg3<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// ... go on like this for pages</span></pre></div></div></div></div></div></div></div>




<p>The Java code is <a href="http://dev.aol.com/aimclient/OpenAIM182/samples/accjsample/AccJSample.java">here</a>, if you&#8217;re interested in the entire set of calls.  Now, I didn&#8217;t care about most of those events, but I had to override them, since they didn&#8217;t have a default implementation.  What made this seem painful was that I was really only interested in two of the callbacks.  So I started to record an Emacs macro to convert the Java code to the equivalent Clojure proxy statement, and then I realized that I didn&#8217;t have to &mdash; <i>I was using a Lisp</i>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defmacro</span> auto<span class="sy0">-</span><span class="kw1">proxy</span> <span class="br0">&#91;</span>interfaces variables <span class="sy0">&amp;</span> args<span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>defined <span class="br0">&#40;</span><span class="kw1">set</span> <span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#40;</span><span class="kw1">str</span> <span class="br0">&#40;</span><span class="kw1">first</span> <span class="sy0">%</span><span class="br0">&#41;</span><span class="br0">&#41;</span> args<span class="br0">&#41;</span><span class="br0">&#41;</span>
        names <span class="br0">&#40;</span><span class="kw1">fn</span> <span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#40;</span><span class="sy0">.</span>getName <span class="sy0">%</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">.</span>getMethods i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        all<span class="sy0">-</span>names <span class="br0">&#40;</span><span class="kw1">into</span> #<span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="br0">&#40;</span><span class="kw1">apply</span> <span class="kw1">concat</span> <span class="br0">&#40;</span><span class="kw1">map</span> names <span class="br0">&#40;</span><span class="kw1">map</span> resolve interfaces<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        undefined <span class="br0">&#40;</span>difference all<span class="sy0">-</span>names defined<span class="br0">&#41;</span> 
        auto<span class="sy0">-</span>gen <span class="br0">&#40;</span><span class="kw1">map</span> <span class="br0">&#40;</span><span class="kw1">fn</span> <span class="br0">&#91;</span>x<span class="br0">&#93;</span> `<span class="br0">&#40;</span>~<span class="br0">&#40;</span>symbol x<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="sy0">&amp;</span> ~'args<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> undefined<span class="br0">&#41;</span><span class="br0">&#93;</span>
    `<span class="br0">&#40;</span><span class="kw1">proxy</span> ~interfaces ~variables ~@args ~@auto<span class="sy0">-</span>gen<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Auto-proxy works just like proxy, but it makes an empty implementation for any call that wasn&#8217;t defined.  So, suddenly, what would have been a bunch of lines collapsed into just:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defn</span> create<span class="sy0">-</span>aim<span class="sy0">-</span><span class="kw1">proxy</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
  <span class="br0">&#40;</span>auto<span class="sy0">-</span><span class="kw1">proxy</span> <span class="br0">&#91;</span>com<span class="sy0">.</span>aol<span class="sy0">.</span>acc<span class="sy0">.</span>AccEvents<span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
     <span class="br0">&#40;</span>OnImReceived <span class="br0">&#91;</span>session imSession participant im<span class="br0">&#93;</span> 
        <span class="br0">&#40;</span>handle<span class="sy0">-</span>im session imSession participant im<span class="br0">&#41;</span><span class="br0">&#41;</span>
     <span class="br0">&#40;</span>OnStateChange <span class="br0">&#91;</span>arg0 arg1 arg2<span class="br0">&#93;</span>
        <span class="br0">&#40;</span>handle<span class="sy0">-</span>state<span class="sy0">-</span>change arg0 arg1 arg2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Macros ftw.  The nice thing about Clojure/Lisp is that it makes coding up this kind of reusable framework stuff really easy.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/snippet-automatic-proxy-creation-in-clojure/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Pattern Matching In Clojure</title>
		<link>http://www.brool.com/index.php/pattern-matching-in-clojure</link>
		<comments>http://www.brool.com/index.php/pattern-matching-in-clojure#comments</comments>
		<pubDate>Wed, 12 Aug 2009 09:38:57 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[matching]]></category>
		<category><![CDATA[ocaml]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=351</guid>
		<description><![CDATA[Updated: Note that this is available as a clojars module. Clojure code density seems to be pretty good. There are a fair number of convenient shortforms in the language; for example, associative datatypes all act as a function &#8212; so given a hash map you can reference it with (my-hashmap :key). The base language itself [...]]]></description>
			<content:encoded><![CDATA[<p><b>Updated</b>:  Note that this is available as a <a href="http://clojars.org/pattern-match">clojars module</a>.</p>

<p>Clojure code density seems to be pretty good. There are a fair number of convenient shortforms in the language; for example, associative datatypes all act as a function &mdash; so given a hash map you can reference it with (my-hashmap :key).  The base language itself is probably about as expressive as Python (or a bit better), but you have the added advantage of being able to use macros as needed to really get the code density up.</p>

<p>Nonetheless, I really wanted something like Ocaml&#8217;s / Haskell&#8217;s pattern matching; it makes some code wonderfully concise.</p>

<p>Accordingly, I hacked something up, based on Clojure&#8217;s built-in destructuring. Some examples:</p>

<p>Literal values match against the same value, while _ matches against any non-nil value (and nil matches against any nil one).  Additionally, :when clauses can be used for conditional checks.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">; simple recursive evaluator</span>
<span class="br0">&#40;</span><span class="kw1">defn</span> arithmetic <span class="br0">&#91;</span>lst<span class="br0">&#93;</span>
  <span class="br0">&#40;</span>match lst
    v  :<span class="kw1">when</span> <span class="br0">&#40;</span>number? v<span class="br0">&#41;</span>  v
    <span class="br0">&#91;</span> _ <span class="st0">&quot;error&quot;</span> _<span class="br0">&#93;</span>     <span class="st0">&quot;error&quot;</span>
    <span class="br0">&#91;</span> _ _ <span class="st0">&quot;error&quot;</span><span class="br0">&#93;</span>     <span class="st0">&quot;error&quot;</span>
    <span class="br0">&#91;</span> <span class="st0">&quot;add&quot;</span> a b <span class="br0">&#93;</span>      <span class="br0">&#40;</span><span class="sy0">+</span> <span class="br0">&#40;</span>arithmetic a<span class="br0">&#41;</span> <span class="br0">&#40;</span>arithmetic b<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#91;</span> <span class="st0">&quot;sub&quot;</span> a b <span class="br0">&#93;</span>      <span class="br0">&#40;</span><span class="sy0">-</span> <span class="br0">&#40;</span>arithmetic a<span class="br0">&#41;</span> <span class="br0">&#40;</span>arithmetic b<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#91;</span> <span class="st0">&quot;mul&quot;</span> a b <span class="br0">&#93;</span>      <span class="br0">&#40;</span><span class="sy0">*</span> <span class="br0">&#40;</span>arithmetic a<span class="br0">&#41;</span> <span class="br0">&#40;</span>arithmetic b<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#91;</span> <span class="st0">&quot;div&quot;</span> a b <span class="br0">&#93;</span>      <span class="br0">&#40;</span><span class="sy0">/</span> <span class="br0">&#40;</span>arithmetic a<span class="br0">&#41;</span> <span class="br0">&#40;</span>arithmetic b<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#91;</span> <span class="st0">&quot;squared&quot;</span> a <span class="br0">&#93;</span>    <span class="br0">&#40;</span>arithmetic <span class="br0">&#91;</span><span class="st0">&quot;mul&quot;</span> <span class="br0">&#40;</span>arithmetic a<span class="br0">&#41;</span> <span class="br0">&#40;</span>arithmetic a<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
    _                  <span class="st0">&quot;error&quot;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Both collections and single values can be used:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">;; return signum fr a number</span>
<span class="br0">&#40;</span><span class="kw1">defn</span> signum <span class="br0">&#91;</span>x<span class="br0">&#93;</span>
  <span class="br0">&#40;</span>match x 
     <span class="nu0">0</span> <span class="nu0">0</span>
     n :<span class="kw1">when</span> <span class="br0">&#40;</span><span class="sy0">&lt;</span> n <span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">-</span><span class="nu0">1</span>
     _ <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>The pattern matching is stricter than the typical destructure;  whereas [ a b ] will destructure against a list of any number of elements, [ a b ] will pattern match only against a list of two elements.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>match x 
    <span class="br0">&#91;</span><span class="br0">&#93;</span>    <span class="st0">&quot;empty&quot;</span>
    <span class="br0">&#91;</span>_<span class="br0">&#93;</span>   <span class="st0">&quot;one element&quot;</span>
    <span class="br0">&#91;</span>a a<span class="br0">&#93;</span> <span class="st0">&quot;two identical elements&quot;</span>
    <span class="br0">&#91;</span>_ _<span class="br0">&#93;</span> <span class="st0">&quot;two elements&quot;</span>
    _     <span class="st0">&quot;three or more&quot;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>If the same variable occurs in multiple locations in the parameter list, it will be checked for equality.  The &#038; tail form can be used to specify the rest of the list.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">;; count identical elements in the same location in two lists:</span>
<span class="br0">&#40;</span><span class="kw1">defn</span> <span class="kw1">count</span><span class="sy0">=</span> <span class="br0">&#91;</span> lst1 lst2 <span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">loop</span> <span class="br0">&#91;</span> a lst1 b lst2 <span class="kw1">count</span> <span class="nu0">0</span> <span class="br0">&#93;</span>
    <span class="br0">&#40;</span>match <span class="br0">&#91;</span>a b<span class="br0">&#93;</span>
      <span class="br0">&#91;</span><span class="br0">&#91;</span>e <span class="sy0">&amp;</span> at<span class="br0">&#93;</span> <span class="br0">&#91;</span>e <span class="sy0">&amp;</span> bt<span class="br0">&#93;</span><span class="br0">&#93;</span>  <span class="br0">&#40;</span><span class="kw1">recur</span> at bt <span class="br0">&#40;</span><span class="kw1">inc</span> <span class="kw1">count</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
      <span class="br0">&#91;</span><span class="br0">&#91;</span>_ <span class="sy0">&amp;</span> at<span class="br0">&#93;</span> <span class="br0">&#91;</span>_ <span class="sy0">&amp;</span> bt<span class="br0">&#93;</span><span class="br0">&#93;</span>  <span class="br0">&#40;</span><span class="kw1">recur</span> at bt <span class="kw1">count</span><span class="br0">&#41;</span>
      _                    <span class="kw1">count</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Note that this is slightly more flexible than Haskell / ML, in that a variable of the same name can be multiple places in the pattern.</p>

<h3>Defining</h3>

<p>You can use the defnp macro to define a function that is pattern matched; it defines a function that takes one argument and has an implicit match statement.  For example, the signum function can be written:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">    <span class="br0">&#40;</span>defnp signum
       <span class="nu0">0</span> <span class="nu0">0</span>
       n :<span class="kw1">when</span> <span class="br0">&#40;</span><span class="sy0">&lt;</span> n <span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">-</span><span class="nu0">1</span>
       _ <span class="nu0">1</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>(Thanks to <a href="http://infolace.blogspot.com/">Tom Faulhaber</a> for suggesting this)</p>

<h3>Gotchas</h3>

<p>The Clojure destructuring will cause an exception if you try to destructure a collection type with a value.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>a b<span class="br0">&#93;</span> <span class="nu0">10</span><span class="br0">&#93;</span> a<span class="br0">&#41;</span>
java<span class="sy0">.</span>lang<span class="sy0">.</span>UnsupportedOperationException: <span class="me1">nth</span> <span class="kw1">not</span> supported on this type: <span class="me1">Integer</span> <span class="br0">&#40;</span>NO_SOURCE_FILE:<span class="nu0">0</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>&#8230; so be sure to check such cases early in your match statement, if they are possible.</p>

<h3>How It Works</h3>

<p>The pattern matcher uses the built-in Clojure destructuring as the main mechanism, but adorns it so that the pattern can be verified.  For example, the code:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>match x <span class="br0">&#91;</span>a a<span class="br0">&#93;</span> <span class="st0">&quot;two identical&quot;</span> <span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




turns into essentially the following:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span> <span class="br0">&#91;</span> a g0001 <span class="sy0">&amp;</span> g0002 <span class="br0">&#93;</span> x <span class="br0">&#93;</span> 
     <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span><span class="kw1">nil?</span> a<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">=</span> g0001 a<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">nil?</span> g0002<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="st0">&quot;two identical&quot;</span> nil<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>That is, the destructuring is done, but then the two variables are checked to make sure that they are equal, and the list is checked to make sure it is only two elements long.</p>

<h3>Source</h3>

<a href="http://github.com/brool/clojure-misc/tree">It&#8217;s all on Github</a>.]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/pattern-matching-in-clojure/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>aset is Faster Than aset-int</title>
		<link>http://www.brool.com/index.php/aset-is-faster-than-aset-int</link>
		<comments>http://www.brool.com/index.php/aset-is-faster-than-aset-int#comments</comments>
		<pubDate>Sat, 08 Aug 2009 21:51:13 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=345</guid>
		<description><![CDATA[Clojure isn&#8217;t the fastest functional lanuage &#8212; that title seems to go to Haskell these days, at least for the stuff that I do &#8212; but it nonetheless is usually fast enough. It&#8217;s a dynamic language, so is perhaps cursed to be somewhat slower always, but nonetheless for the things that I do, it seems [...]]]></description>
			<content:encoded><![CDATA[<p>Clojure isn&#8217;t the fastest functional lanuage &#8212; that title seems to go to Haskell these days, at least for the stuff that I do &#8212; but it nonetheless is usually fast enough.  It&#8217;s a dynamic language, so is perhaps cursed to be somewhat slower always, but nonetheless for the things that I do, it seems to be about 2-4x slower than Ocaml/Haskell and substantially faster than Python.</p>

<p>Nonetheless, I ran into a situation where it seemed to be 100x slower than Java because of an erroneous assumption on my part. After stripping out and profiling and removing everything extraneous, it finally came down to array access. Ignoring the uselessness of this snippet for a while, the issue is how to translate something like the following code:</p>

[code language="java"]
int v[] = new int[1000];
java.util.Arrays.fill(v, 0);
for (int i = 0; i < 100000; i++)
    for (int ix = 0; ix < 1000; ix++) {
        v[ix]++;
        v[ix]--;
}
[/code]

<p>... which runs in about 350ms on my Macbook.  My pass at the Clojure equivalent, with the type hinting:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">;; this is 100x slower than the equivalent in Java</span>
<span class="br0">&#40;</span><span class="kw1">defn</span> useless<span class="sy0">-</span>array<span class="sy0">-</span>manipulation <span class="br0">&#91;</span><span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>v <span class="br0">&#40;</span>int<span class="sy0">-</span>array <span class="nu0">1000</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
    <span class="br0">&#40;</span>java<span class="sy0">.</span>util<span class="sy0">.</span>Arrays<span class="sy0">/</span>fill v <span class="nu0">0</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">dotimes</span> <span class="br0">&#91;</span>_ <span class="br0">&#40;</span>int <span class="nu0">100000</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
      <span class="br0">&#40;</span><span class="kw1">dotimes</span> <span class="br0">&#91;</span>ix <span class="br0">&#40;</span>int <span class="nu0">1000</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
        <span class="br0">&#40;</span>aset<span class="sy0">-</span>int v ix <span class="br0">&#40;</span>unchecked<span class="sy0">-</span>add <span class="br0">&#40;</span>int <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">aget</span> v ix<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span>aset<span class="sy0">-</span>int v ix <span class="br0">&#40;</span>unchecked<span class="sy0">-</span>subtract <span class="br0">&#40;</span>int <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">aget</span> v ix<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>... which takes about 40692ms -- more than 100x slower.  What the hell?  After many hours of Googling, I finally discovered from <a href="http://www.fatvat.co.uk/2009/01/ray-tracing-in-clojure-part-ii.html">the comments on this blog post</a> that aset-int is slower than aset, which I don't recall seeing anywhere else. Does it really make a difference?</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">;; much faster</span>
<span class="br0">&#40;</span><span class="kw1">defn</span> useless<span class="sy0">-</span>array<span class="sy0">-</span>manipulation <span class="br0">&#91;</span><span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>v <span class="br0">&#40;</span>int<span class="sy0">-</span>array <span class="nu0">1000</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
    <span class="br0">&#40;</span>java<span class="sy0">.</span>util<span class="sy0">.</span>Arrays<span class="sy0">/</span>fill v <span class="nu0">0</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">dotimes</span> <span class="br0">&#91;</span>_ <span class="br0">&#40;</span>int <span class="nu0">100000</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
      <span class="br0">&#40;</span><span class="kw1">dotimes</span> <span class="br0">&#91;</span>ix <span class="br0">&#40;</span>int <span class="nu0">1000</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">&gt;</span>
        <span class="br0">&#40;</span><span class="kw1">aset</span> v ix <span class="br0">&#40;</span>unchecked<span class="sy0">-</span>add <span class="br0">&#40;</span><span class="kw1">aget</span> v ix<span class="br0">&#41;</span> <span class="br0">&#40;</span>int <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span><span class="kw1">aset</span> v ix <span class="br0">&#40;</span>unchecked<span class="sy0">-</span>subtract <span class="br0">&#40;</span><span class="kw1">aget</span> v ix<span class="br0">&#41;</span> <span class="br0">&#40;</span>int <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>... runs in about 1000ms, or about 3x slower than the Java variant, and is definitely something that I can live with. I had been assuming that aset-int was of course faster because it was more specific, but in fact (aset v ix (int val)) is <i>much faster</i> than (aset-int v ix val).</p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/aset-is-faster-than-aset-int/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tokyo Cabinet API for Clojure</title>
		<link>http://www.brool.com/index.php/tokyo-cabinet-api-for-clojure</link>
		<comments>http://www.brool.com/index.php/tokyo-cabinet-api-for-clojure#comments</comments>
		<pubDate>Fri, 07 Aug 2009 01:51:56 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[kvstore]]></category>
		<category><![CDATA[nonsql]]></category>
		<category><![CDATA[tokyo cabinet]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=333</guid>
		<description><![CDATA[I&#8217;ve been playing with Tokyo Cabinet and Clojure for a bit, and while I will go on about both of them in another blog post (or not), I have to mention that Clojure is such a well designed language that it&#8217;s a pleasure to play with. It has much of the same intrinsic power as [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing with Tokyo Cabinet and Clojure for a bit, and while I will go on about both of them in another blog post (or not), I have to mention that Clojure is such a well designed language that it&#8217;s a pleasure to play with.  It has much of the same intrinsic power as Haskell, but in a fashion that might be more approachable for people coming from Python or Ruby.</p>

<p>At any rate, I made a small, thin layer around the Tokyo Cabinet API, and <a href="http://github.com/brool/tokyo-cabinet/tree/master">put it on Github</a>.  Another thin wrapper can be found <a href="http://justin.harmonize.fm/index.php/tag/tokyo-cabinet/">at this blog</a>.</p>

<p>Copy of the README is below (the ultimate in lazy!).</p>

<h3>Introduction</h3>

<p>This is a simple interface to the Tokyo Cabinet libraries.  Tokyo Cabinet is a very cool, very high performing key-value store.  This library supports table mode, which essentially means that arbitrary hashmaps can be stored in the cabinet.</p>

<p>Note that this is appropriate for local storage only &#8212; if you&#8217;re looking to share a Tokyo Cabinet to multiple computers, you actually want Tokyo Tyrant.</p>

<h3>Basic Usage</h3>

<p>The with-cabinet call creates/opens a cabinet and allows the use of the various access routines within the scope of the call.  For example, here&#8217;s how to create a cabinet with three entries.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">ns</span> user <span class="br0">&#40;</span>:<span class="me1">use</span> tokyo<span class="sy0">-</span>cabinet<span class="br0">&#41;</span><span class="br0">&#41;</span>  <span class="co1">;; bring into our namespace</span>
&nbsp;
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet <span class="br0">&#123;</span> :<span class="me1">filename</span> <span class="st0">&quot;test.tokyo&quot;</span> :<span class="me1">mode</span> <span class="br0">&#40;</span><span class="sy0">+</span> OWRITER OCREAT<span class="br0">&#41;</span> <span class="br0">&#125;</span> 
    <span class="br0">&#40;</span><span class="kw1">doseq</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>name val<span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="br0">&#91;</span><span class="st0">&quot;1&quot;</span> <span class="st0">&quot;one&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;2&quot;</span> <span class="st0">&quot;two&quot;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="st0">&quot;3&quot;</span> <span class="st0">&quot;three&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#93;</span>
        <span class="br0">&#40;</span>put<span class="sy0">-</span>value name val<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>This creates a Tokyo Cabinet <i>hash table</i>, which allows one value per key.  Now query an entry:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet <span class="br0">&#123;</span> :<span class="me1">filename</span> <span class="st0">&quot;test.tokyo&quot;</span> :<span class="me1">mode</span> OREADER <span class="br0">&#125;</span> 
    <span class="br0">&#40;</span>get<span class="sy0">-</span>value <span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="st0">&quot;one&quot;</span></pre></div></div></div></div></div></div></div>




<h3>Tables</h3>

<p>A <i>table</i> in Tokyo Cabinet can be used to store arbitrary hash maps.  For example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">def</span> params <span class="br0">&#123;</span> :<span class="me1">filename</span> <span class="st0">&quot;test-table.tokyo&quot;</span> :<span class="me1">mode</span> <span class="br0">&#40;</span><span class="sy0">+</span> OWRITER OCREAT<span class="br0">&#41;</span> :<span class="me1">type</span> :<span class="me1">table</span> <span class="br0">&#125;</span> <span class="br0">&#41;</span>
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params
    <span class="br0">&#40;</span>put<span class="sy0">-</span>value nil <span class="br0">&#123;</span> :<span class="me1">name</span> <span class="st0">&quot;John Doe&quot;</span> :<span class="me1">hobbies</span> <span class="st0">&quot;rowing fishing skiing&quot;</span> :<span class="me1">age</span> <span class="nu0">28</span> :<span class="me1">gender</span> <span class="st0">&quot;M&quot;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>put<span class="sy0">-</span>value nil <span class="br0">&#123;</span> :<span class="me1">name</span> <span class="st0">&quot;Melissa Swift&quot;</span> :<span class="me1">hobbies</span> <span class="st0">&quot;soccer tennis books&quot;</span> :<span class="me1">age</span> <span class="nu0">33</span> :<span class="me1">gender</span> <span class="st0">&quot;F&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>put<span class="sy0">-</span>value nil <span class="br0">&#123;</span> :<span class="me1">name</span> <span class="st0">&quot;Tom Swift&quot;</span> :<span class="me1">hobbies</span> <span class="st0">&quot;inventing exploring&quot;</span> :<span class="me1">gender</span> <span class="st0">&quot;M&quot;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>put<span class="sy0">-</span>value nil <span class="br0">&#123;</span> :<span class="me1">name</span> <span class="st0">&quot;Harry Potter&quot;</span> :<span class="me1">hobbies</span> <span class="st0">&quot;magic quidditch flying&quot;</span> :<span class="me1">gender</span> <span class="st0">&quot;M&quot;</span> :<span class="me1">age</span> <span class="nu0">9</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<h3>Queries</h3>

<p>Queries can be run, and you can use (hint) to take a look at how the query is being performed:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">; show a hint and all rows matching</span>
<span class="br0">&#40;</span><span class="kw1">defn</span> showrows <span class="br0">&#91;</span>query<span class="br0">&#93;</span>
    <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>showhint <span class="br0">&#40;</span>atom false<span class="br0">&#41;</span><span class="br0">&#93;</span> 
        <span class="br0">&#40;</span>with<span class="sy0">-</span>query<span class="sy0">-</span>results row query
            <span class="br0">&#40;</span><span class="kw1">when</span> <span class="br0">&#40;</span>compare<span class="sy0">-</span>and<span class="sy0">-</span><span class="kw1">set</span><span class="sy0">!</span> showhint false true<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>println <span class="st0">&quot;Query: &quot;</span> query<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>println <span class="st0">&quot;Hint: &quot;</span> <span class="br0">&#40;</span>hint<span class="br0">&#41;</span><span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>println <span class="st0">&quot;Results:&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
            <span class="br0">&#40;</span>println row<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span>println<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params
    <span class="br0">&#40;</span>showrows <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">age</span> <span class="st0">&quot;&gt;=&quot;</span> <span class="nu0">30</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>showrows <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">hobbies</span> <span class="st0">&quot;any-token&quot;</span> <span class="st0">&quot;soccer&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Leads to the following output:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">Query:  <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">age</span> <span class="sy0">&gt;=</span> <span class="nu0">30</span><span class="br0">&#93;</span><span class="br0">&#93;</span>
Hint:  <span class="me1">scanning</span> the whole table
result <span class="kw1">set</span> size: <span class="nu0">1</span>
leaving the natural order
&nbsp;
Results:
<span class="br0">&#123;</span>:<span class="me1">gender</span> F, :<span class="me1">hobbies</span> soccer tennis books, :<span class="me1">name</span> Melissa Swift, :<span class="me1">age</span> <span class="nu0">33</span><span class="br0">&#125;</span>
&nbsp;
Query:  <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">hobbies</span> any<span class="sy0">-</span>token soccer<span class="br0">&#93;</span><span class="br0">&#93;</span>
Hint:  <span class="me1">scanning</span> the whole table
result <span class="kw1">set</span> size: <span class="nu0">1</span>
leaving the natural order
&nbsp;
Results:
<span class="br0">&#123;</span>:<span class="me1">gender</span> F, :<span class="me1">hobbies</span> soccer tennis books, :<span class="me1">name</span> Melissa Swift, :<span class="me1">age</span> <span class="nu0">33</span><span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>




<h3>Indexes</h3>

<p>Indexes can be added with create-index (and removed with delete-index), which help optimize particular queries.</p>

<p>The different index types:</p>

<ul>
<li>INDEX-DECIMAL</li>
<li>INDEX-LEXICAL</li>
<li>INDEX-QGRAM</li>
</ul>

<p>With some optional specifiers that can be added / ored in:</p>

<ul>
<li>INDEX-KEEP &#8212; keep the index if it already exists</li>
<li>INDEX-OPTIMIZE</li>
</ul>

<p>Running the queries again, with indexes:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="co1">; indexes are persistent</span>
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params
    <span class="br0">&#40;</span>create<span class="sy0">-</span>index :<span class="me1">hobbies</span> INDEX<span class="sy0">-</span>TOKEN<span class="br0">&#41;</span>
    <span class="br0">&#40;</span>create<span class="sy0">-</span>index :<span class="me1">age</span> INDEX<span class="sy0">-</span>DECIMAL<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1">; try the queries again with the indexes in place</span>
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params
    <span class="br0">&#40;</span>showrows <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">age</span> <span class="st0">&quot;&gt;=&quot;</span> <span class="nu0">30</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>showrows <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">hobbies</span> <span class="st0">&quot;any-token&quot;</span> <span class="st0">&quot;soccer&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Gets the following hint:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1">Query:  <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">age</span> <span class="sy0">&gt;=</span> <span class="nu0">30</span><span class="br0">&#93;</span><span class="br0">&#93;</span>
Hint:  <span class="me1">using</span> an index: <span class="st0">&quot;:age&quot;</span> asc <span class="br0">&#40;</span>NUMGT<span class="sy0">/</span>NUMGE<span class="br0">&#41;</span>
result <span class="kw1">set</span> size: <span class="nu0">1</span>
leaving the natural order
&nbsp;
Results:
<span class="br0">&#123;</span>:<span class="me1">gender</span> F, :<span class="me1">hobbies</span> soccer tennis books, :<span class="me1">name</span> Melissa Swift, :<span class="me1">age</span> <span class="nu0">33</span><span class="br0">&#125;</span>
&nbsp;
Query:  <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="me1">hobbies</span> any<span class="sy0">-</span>token soccer<span class="br0">&#93;</span><span class="br0">&#93;</span>
Hint:  <span class="me1">using</span> an index: <span class="st0">&quot;:hobbies&quot;</span> inverted <span class="br0">&#40;</span>STROR<span class="br0">&#41;</span>
token occurrence: <span class="st0">&quot;soccer&quot;</span> <span class="nu0">1</span>
result <span class="kw1">set</span> size: <span class="nu0">1</span>
leaving the natural order
&nbsp;
Results:
<span class="br0">&#123;</span>:<span class="me1">gender</span> F, :<span class="me1">hobbies</span> soccer tennis books, :<span class="me1">name</span> Melissa Swift, :<span class="me1">age</span> <span class="nu0">33</span><span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>




<h3>Optional Search Parameters</h3>

<p>You can further control what&#8217;s fetched by using a number of optional specifiers in the query:</p>

<ul>
<li>:limit nnn &#8212; limits the number of rows returned</li>
<li>:skip  nnn &#8212; skips the first nnn rows</li>
<li>:sort  fieldname &#8212; sorts by the given field</li>
<li>:order val &#8212; the specific ordering, one of SORT-NUM-ASC, SORT-NUM-DESC, SORT-TEXT-ASC, or SORT-TEXT-DESC</li>
</ul>

<p>For example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params <span class="br0">&#40;</span>with<span class="sy0">-</span>query<span class="sy0">-</span>results row <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#40;</span>println <span class="br0">&#40;</span>:<span class="me1">name</span> row<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>    
John Doe
Melissa Swift
Tom Swift
Harry Potter
&nbsp;
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params <span class="br0">&#40;</span>with<span class="sy0">-</span>query<span class="sy0">-</span>results row <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="kw1">sort</span> :<span class="me1">name</span><span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="br0">&#40;</span>println <span class="br0">&#40;</span>:<span class="me1">name</span> row<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
Harry Potter
John Doe
Melissa Swift
Tom Swift
&nbsp;
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params <span class="br0">&#40;</span>with<span class="sy0">-</span>query<span class="sy0">-</span>results row <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="kw1">sort</span> :<span class="me1">name</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>:<span class="me1">order</span> SORT<span class="sy0">-</span>TEXT<span class="sy0">-</span>DESC<span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="br0">&#40;</span>println <span class="br0">&#40;</span>:<span class="me1">name</span> row<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
Tom Swift
Melissa Swift
John Doe
Harry Potter
&nbsp;
<span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet params <span class="br0">&#40;</span>with<span class="sy0">-</span>query<span class="sy0">-</span>results row <span class="br0">&#91;</span><span class="br0">&#91;</span>:<span class="kw1">sort</span> :<span class="me1">name</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>:<span class="me1">order</span> SORT<span class="sy0">-</span>TEXT<span class="sy0">-</span>DESC<span class="br0">&#93;</span> <span class="br0">&#91;</span>:<span class="me1">limit</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="br0">&#40;</span>println <span class="br0">&#40;</span>:<span class="me1">name</span> row<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
Tom Swift</pre></div></div></div></div></div></div></div>




<h3>Lower Level</h3>

<p>Depending on your application, it might not be convenient to have to bracket everything with with-cabinet, since that means an open and close of the cabinet.  You can also use the lower level open-cabinet and close-cabinet calls, along with the &#8220;with&#8221; statement.  This is also an easier way to use it at the command line.  For example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">def</span> test<span class="sy0">-</span>database <span class="br0">&#40;</span>open<span class="sy0">-</span>cabinet <span class="br0">&#123;</span> :<span class="me1">filename</span> <span class="st0">&quot;test-open.tokyo&quot;</span> :<span class="me1">mode</span> <span class="br0">&#40;</span><span class="sy0">+</span> OWRITER OCREAT<span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#40;</span>with test<span class="sy0">-</span>database <span class="br0">&#40;</span>put<span class="sy0">-</span>value <span class="st0">&quot;1&quot;</span> <span class="st0">&quot;one&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#40;</span>with test<span class="sy0">-</span>database <span class="br0">&#40;</span>get<span class="sy0">-</span>value <span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#40;</span>with test<span class="sy0">-</span>database <span class="br0">&#40;</span><span class="kw1">print</span> <span class="br0">&#40;</span>primary<span class="sy0">-</span><span class="kw1">keys</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#40;</span>close<span class="sy0">-</span>cabinet test<span class="sy0">-</span>database<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<h3>Miscellaneous</h3>

<p>Use (primary-keys) to return a lazy list of primary keys.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span>with<span class="sy0">-</span>cabinet <span class="br0">&#123;</span> :<span class="me1">filename</span> <span class="st0">&quot;test.tokyo&quot;</span> :<span class="me1">mode</span> <span class="br0">&#40;</span><span class="sy0">+</span> OWRITER OCREATE<span class="br0">&#41;</span> :<span class="me1">type</span> :<span class="me1">table</span> <span class="br0">&#125;</span>
    <span class="br0">&#40;</span><span class="kw1">print</span> <span class="br0">&#40;</span>primary<span class="sy0">-</span><span class="kw1">keys</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<h3>Links</h3>

<ul>
<li><a href="http://tokyocabinet.sourceforge.net/">Tokyo Cabinet</a></li>
<li><a href="http://tokyocabinet.sourceforge.net/javadoc/">Tokyo Cabinet / Java API</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/tokyo-cabinet-api-for-clojure/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

