<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
 <title> Travis Vachon - combinate.us </title>
 
 <link href="http://combinate.us/" />
 <updated>2011-05-20T14:16:56+00:00</updated>
 <id>http://combinate.us/</id>
 <author>
   <name>Travis Vachon</name>
   <email>travis.vachon@gmail.com</email>
 </author>
 <icon>http://combinate.us/images/icon.jpg</icon>
 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/combinate" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="combinate" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>WeatherBill → Utah Street Labs</title>
   <link href="http://combinate.us/2011/05/20/weatherbill-utah-st/" />
   <updated>2011-05-20T00:00:00+00:00</updated>
   <id>http://combinate.us//2011/05/20/weatherbill-utah-st</id>
   <content type="html">&lt;p&gt;Today will be my last day at WeatherBill. It&amp;#8217;s said that it takes 10 years to become a good programmer and I dare say the last 2.5 have been well spent for me. I learned a couple entirely new domains - finance, agriculture - and worked with a great team building out an innovative, potentially world changing product. Weather related risk management is a huge, massively underserved market that affects literally everyone on the planet, and I&amp;#8217;m proud to say I played a key role in discovering how to build products that meet the needs of farmers across the American Midwest. Discovery is a hard, painful process in software engineering, forcing hard decisions about how to design and build systems without a clear picture of the true business needs, especially in a domain as complex as ours. This, of course, makes the experience that much more valuable. I&amp;#8217;m very excited about WeatherBill&amp;#8217;s product and potential, and I wish my friends and coworkers nothing but the best.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be taking a week off, imposing on the hospitality of a very good friend off the coast of Woods Hole. I&amp;#8217;d like to do a little fishing, a lot of reading and a huge amount of unwinding. I&amp;#8217;ll also be signing off the internet and telephony from Sunday evening until Wednesday, a pleasure I honestly can&amp;#8217;t remember ever indulging.&lt;/p&gt;

&lt;p&gt;After Memorial Day I&amp;#8217;ll be joining &lt;a href='http://utahstreetlabs.com/About%20.htm'&gt;Utah Street Labs&lt;/a&gt;. We think the way people buy and sell from each other in a post-Facebook world should be much more pleasant and I&amp;#8217;m very excited to spend the next couple years &lt;a href='http://copious.com/'&gt;finding out if we&amp;#8217;re right&lt;/a&gt;.&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>Hacking the Doomsday Machine</title>
   <link href="http://combinate.us/2011/03/20/hacking-the-doomsday-machine/" />
   <updated>2011-03-20T00:00:00+00:00</updated>
   <id>http://combinate.us//2011/03/20/hacking-the-doomsday-machine</id>
   <content type="html">&lt;p&gt;En route to Montreal to visit some friends a few weeks ago, my wife and I cut the boredom of the northern New York highway system by alternating reading Michael Lewis&amp;#8217;s &lt;a href='http://www.amazon.com/Big-Short-Inside-Doomsday-Machine/dp/0393072231'&gt;The Big Short&lt;/a&gt; out loud. Eventually the light faded enough that reading became impractical, so I pulled out my laptop, inspired to return to a piece published by Simon Peyton Jones and Jean-Marc Eber in the 2003 functional programming book &lt;a href='http://www.amazon.com/Fun-Programming-Cornerstones-Computing/dp/0333992857'&gt;The Fun of Programming&lt;/a&gt;. Based on an earlier research paper by Peyton Jones et al, &lt;a href='http://research.microsoft.com/en-us/um/people/simonpj/papers/financial-contracts/contracts-icfp.htm'&gt;&lt;em&gt;How to write a financial contract&lt;/em&gt;&lt;/a&gt; details a set of primitives for describing financial contracts. The authors build a simple model for determining the value of a contract over time and discuss the advantages of having a formal declarative model for financial contracts. It doesn&amp;#8217;t take too much imagination to see the utility of this kind of standard representation for regulators and others attempting to understand the reality of the risks in the financial markets, and indeed, proposals for tools to enable this in real world &lt;a href='http://jrvarma.wordpress.com/2010/04/16/the-sec-and-the-python/'&gt;exist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The system proposed by the authors is straightforward, and can be cleanly captured in Clojure using protocols, types and plain old functions.&lt;/p&gt;

&lt;h3 id='a_tight_core'&gt;A Tight Core&lt;/h3&gt;

&lt;p&gt;The core of the library is small - only 10 primitives - and can be implemented in Clojure using a custom &lt;code&gt;def&lt;/code&gt; form:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;zero&lt;/span&gt; &lt;span class='p'&gt;[]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to give nothing and receive nothing.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;one&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;currency&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to receive one unit of currency.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;give&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to give a counterparty a specific contract.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;and&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract-a&lt;/span&gt; &lt;span class='nv'&gt;contract-b&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to receive both contract-a and contract-b.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;or&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract-a&lt;/span&gt; &lt;span class='nv'&gt;contract-b&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract representing a choice between receiving contract-a and receiving contract-b.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='k'&gt;cond &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;condition&lt;/span&gt; &lt;span class='nv'&gt;contract-a&lt;/span&gt; &lt;span class='nv'&gt;contract-b&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to receive either contract-a or contract-b according to a conditional (that is, boolean) index.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;scale&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;index&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to receive a contract scaled up by the value of an index.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;when&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;index&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract to receive another contract at a particular time.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;anytime&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;index&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract granting the option to receive another contract any time during a particular period.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defcontract&lt;/span&gt; &lt;span class='nv'&gt;until&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;index&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;A contract granting the option to receive another contract until a particular time.&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Each &lt;code&gt;defcontract&lt;/code&gt; introduces a new type along with a helper function. The helper function isn&amp;#8217;t strictly necessary, but makes it easier to use higher order functional programming facilities when creating new contracts and provides a place to hang a docstring. To implement &lt;code&gt;defcontract&lt;/code&gt; we&amp;#8217;ll first write an example of the code we&amp;#8217;d like to generate and use that to create a simple template macro:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='c1'&gt;;; the code we&amp;#39;d like&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftype&lt;/span&gt; &lt;span class='nv'&gt;Zero&lt;/span&gt; &lt;span class='p'&gt;[])&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;zero&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;A contract representing 0&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;[])&lt;/span&gt;

&lt;span class='c1'&gt;;; the macro to do it&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defmacro &lt;/span&gt;&lt;span class='nv'&gt;defcontract&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;name&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt; &lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;comment&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;tname&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;symbol &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;s/capitalize&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;name&lt;/span&gt;&lt;span class='p'&gt;)))]&lt;/span&gt;
    &lt;span class='o'&gt;`&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;do&lt;/span&gt;
       &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftype&lt;/span&gt; &lt;span class='nv'&gt;~tname&lt;/span&gt; &lt;span class='nv'&gt;~args&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
       &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;~name&lt;/span&gt; &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;comment&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;~args&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;new &lt;/span&gt;&lt;span class='nv'&gt;~tname&lt;/span&gt; &lt;span class='nv'&gt;~@args&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We can use these primitives to formalize our $20 birthday contract with our Grandmother:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;when &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;at&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;DateTime&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='mi'&gt;2011&lt;/span&gt; &lt;span class='mi'&gt;7&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;give&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;scale&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;const&lt;/span&gt; &lt;span class='mi'&gt;20&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;one&lt;/span&gt; &lt;span class='nv'&gt;:usd&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In English, this contract says &amp;#8220;on July 5, 2011, give a counterparty $20.&amp;#8221; Once acquired, Gram can formally represent her obligation, and perhaps even write a computer program to automatically fulfill it.&lt;/p&gt;

&lt;h3 id='an_interface_with_the_world'&gt;An Interface With the World&lt;/h3&gt;

&lt;p&gt;Many of these contract primitives utilize &lt;em&gt;Observables&lt;/em&gt;. An Observable is an &amp;#8220;objective&amp;#8230; possibly time varying&amp;#8221; quantity whose true value may or may not be known at the time the contract is entered into. The Nasdaq, the value of the principal on a mortgage and the temperature outside our front door are all Observables, and it is easy to imagine writing contracts against each of them. We can define a simple protocol for Observables, declaring a &lt;code&gt;values&lt;/code&gt; function which, given a time series, should return a &lt;code&gt;seq&lt;/code&gt; of the value of the Observable corresponding to each point in the series:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defprotocol&lt;/span&gt; &lt;span class='nv'&gt;Observable&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable&lt;/span&gt; &lt;span class='nv'&gt;time-series&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Peyton Jones et al. describe a small number of primitive Observables, of which probably the most important is &lt;code&gt;lift&lt;/code&gt;. &lt;code&gt;lift&lt;/code&gt; is an Observable primitive which, given a function, will apply that function to each element of one or more other Observables. For example, to create an Observable representing the interest on 4.5% fixed rate loan we can apply the function&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;principal&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mf'&gt;0.045&lt;/span&gt; &lt;span class='nv'&gt;principal&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;to each element of an Observable representing the principal of that loan over time. I can use &lt;code&gt;lift&lt;/code&gt; for this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;interest-observable&lt;/span&gt; &lt;span class='p'&gt;[]&lt;/span&gt;
     &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;lift&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;principal&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mf'&gt;0.045&lt;/span&gt; &lt;span class='nv'&gt;principal&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt; &lt;span class='nv'&gt;principal-observable&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that &lt;code&gt;Observable&lt;/code&gt;s generally don&amp;#8217;t perform any computation on instantiation beyond what is required to set up a object in the JVM. Indeed, because an &lt;code&gt;Observable&lt;/code&gt; usually represents a continuous function, we don&amp;#8217;t have enough information to make it concrete until we know the granularity of the time series we will be evaluating it against. We can see this in the implementation of &lt;code&gt;Lift&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftype&lt;/span&gt; &lt;span class='nv'&gt;Lift&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;f&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='nv'&gt;Observable&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;map&lt;/span&gt; &lt;span class='nv'&gt;f&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;values&lt;/span&gt; &lt;span class='nv'&gt;%&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;lift&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;f&lt;/span&gt; &lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;Lift&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;f&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Upon instantiation, &lt;code&gt;Lift&lt;/code&gt; just stores a function and some arguments which are themselves &lt;code&gt;Observable&lt;/code&gt;s. When a client passes a time series along in the call to &lt;code&gt;values&lt;/code&gt; we can get the values of the underlying &lt;code&gt;Observable&lt;/code&gt;s and then apply the stored function to each set of values provided by the &lt;code&gt;Observable&lt;/code&gt;s to yield a single &lt;code&gt;seq&lt;/code&gt; of values. For example, we can lift the &lt;code&gt;+&lt;/code&gt; operation to &lt;code&gt;Observable&lt;/code&gt;s:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;+&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;lift&lt;/span&gt; &lt;span class='nv'&gt;clojure&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;core/+&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and use it to add together two constant value Observables:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;const&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;const&lt;/span&gt; &lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;11&lt;/span&gt; &lt;span class='mi'&gt;11&lt;/span&gt; &lt;span class='mi'&gt;11&lt;/span&gt; &lt;span class='mi'&gt;11&lt;/span&gt; &lt;span class='mi'&gt;11&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Observables can be arbitrarily complex under the surface, and can participate in this system by exposing their values via the &lt;code&gt;Observable&lt;/code&gt; protocol. Because we use a protocol for this, any Java object can be extended to participate in this system. As with Clojure &lt;code&gt;seq&lt;/code&gt;s themselves, it is good practice to formulate relatively simple underlying &lt;code&gt;Observable&lt;/code&gt;s and combine them using regular Clojure functions &lt;code&gt;lift&lt;/code&gt;ed to act on &lt;code&gt;Observable&lt;/code&gt;s.&lt;/p&gt;

&lt;h3 id='a_valuation_model'&gt;A Valuation Model&lt;/h3&gt;

&lt;p&gt;Now that we can represent contracts and the real world data underlying them we can formulate a model for determining the expected value of a particular contract. What we would really like is a sequence of values representing the expected value of a contract over time. For example, our $20 dollar birthday contract with Gram might have an expected value of less than $20 in January due to concerns about her ability to pay up in July - she might forget, or need the $20 for gas.&lt;/p&gt;

&lt;p&gt;This actually sounds a lot like what we already know how to do with &lt;code&gt;Observable&lt;/code&gt;s, and indeed, once we have determined the expected value of a contract we can use that expectation as an &lt;code&gt;Observable&lt;/code&gt; to formulate new contracts. It makes sense, then, to implement our valuation model by extending Observable to our primitive contract types. Of our 10 types, the &lt;code&gt;values&lt;/code&gt; functions for 6 are straightforward applications of standard Clojure constructs to our primitive types:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;extend-protocol&lt;/span&gt; &lt;span class='nv'&gt;Observable&lt;/span&gt;
  &lt;span class='nv'&gt;Zero&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;_&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;repeat &lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
  &lt;span class='nv'&gt;Give&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;*&lt;/span&gt; &lt;span class='mi'&gt;-1&lt;/span&gt; &lt;span class='nv'&gt;%&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='nv'&gt;And&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract-a&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract-b&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='nv'&gt;Or&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;max &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract-a&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract-b&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='nv'&gt;Cond&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;c&lt;/span&gt; &lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;if &lt;/span&gt;&lt;span class='nv'&gt;c&lt;/span&gt; &lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;condition&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract-a&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract-b&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='nv'&gt;Scale&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;o&lt;/span&gt; &lt;span class='nv'&gt;c&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;o&lt;/span&gt; &lt;span class='nv'&gt;c&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;observable&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                               &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Each of the other primitives in our model requires some additional work. The authors describe four functions (plus a constant) that capture the semantics of the remaining contract primitives:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;*currency*&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*exch*&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;Given a time series and a currency, return a seq of the exchange&lt;/span&gt;
&lt;span class='s'&gt;rate from currency to the model currency (*currency*) at each point&lt;/span&gt;
&lt;span class='s'&gt;in the time series&amp;quot;&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;currency&lt;/span&gt; &lt;span class='nv'&gt;time-series&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*discount*&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;Given a seq of observable values and a seq of contract values over&lt;/span&gt;
&lt;span class='s'&gt;time, return a seq of the &amp;#39;fair&amp;#39; contract values over time. This usually&lt;/span&gt;
&lt;span class='s'&gt;means adjusting contract values down to account for uncertainty about the&lt;/span&gt;
&lt;span class='s'&gt;observables underlying the contract values.&amp;quot;&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*snell*&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;Given a seq of observable values and a seq of contract values over&lt;/span&gt;
&lt;span class='s'&gt;time, calculate the &amp;#39;Snell envelope&amp;#39; of the contract values under the&lt;/span&gt;
&lt;span class='s'&gt;observable values. At a high level, the returned seq should reflect the&lt;/span&gt;
&lt;span class='s'&gt;adjustments to the contract values given that they may be realized&lt;/span&gt;
&lt;span class='s'&gt;any time the observable values are true.&amp;quot;&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*absorb*&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;Given a seq of observable values and a seq of contract values over time,&lt;/span&gt;
&lt;span class='s'&gt;return a seq of the &amp;#39;fair&amp;#39; contract values given that the contract values&lt;/span&gt;
&lt;span class='s'&gt;given that they may be realized until the first true value in the observable.&amp;quot;&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;extend-protocol&lt;/span&gt; &lt;span class='nv'&gt;Observable&lt;/span&gt;
  &lt;span class='nv'&gt;One&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;*exch*&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;currency&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
  &lt;span class='nv'&gt;When&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;*discount*&lt;/span&gt;
                        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;observable&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='nv'&gt;Anytime&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;*snell*&lt;/span&gt;
                           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;observable&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='nv'&gt;Until&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;*absorb*&lt;/span&gt;
                           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;observable&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;contract&lt;/span&gt; &lt;span class='nv'&gt;contract&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is the most complex and difficult to understand part of the paper, and a full explanation of these functions is beyond the scope of this piece - the authors themselves do not attempt a detailed exploration of them, but simply present them along with some material to give the reader an intuitive understanding of their semantics. With this complexity comes great power - by simply redefining these 4 functions, we can fundamentally change how we model our risk. To lay down a baseline we can make some simple assumptions that provide reasonable, easy to understand implementations of these functions. Our assumptions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the exchange rate between any two currencies is 1:1&lt;/li&gt;

&lt;li&gt;we have perfect information about the observables underlying a contract and therefore have no reason to discount contracts that rely on future events&lt;/li&gt;

&lt;li&gt;we will not be using &lt;code&gt;anytime&lt;/code&gt; and &lt;code&gt;until&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*exch&lt;/code&gt; will return a constant &lt;code&gt;seq&lt;/code&gt; of &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;*discount*&lt;/code&gt; will return a &lt;code&gt;seq&lt;/code&gt; that returns a constant value up until the first true value in the Observable, and then 0. The constant value will be the value of the Contract when the Observable is first true&lt;/li&gt;

&lt;li&gt;we can skip the implementation of &lt;code&gt;*absorb*&lt;/code&gt; and &lt;code&gt;*snell*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes our implementation of the model relatively simple:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;use-default-model&lt;/span&gt;
  &lt;span class='p'&gt;[]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;*currency*&lt;/span&gt; &lt;span class='nv'&gt;:usd&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*exch*&lt;/span&gt;
    &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;currency&lt;/span&gt; &lt;span class='nv'&gt;time-series&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;constantly &lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;time-series&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;

  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*discount*&lt;/span&gt;
    &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;value&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
          &lt;span class='c1'&gt;;; find the value of the contract the first time the&lt;/span&gt;
          &lt;span class='c1'&gt;;; observable is true&lt;/span&gt;
          &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;some &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;obs&lt;/span&gt; &lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;:as&lt;/span&gt; &lt;span class='nv'&gt;pair&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;if &lt;/span&gt;&lt;span class='nv'&gt;obs&lt;/span&gt; &lt;span class='nv'&gt;pair&lt;/span&gt; &lt;span class='nv'&gt;nil&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='nv'&gt;vector&lt;/span&gt; &lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
      &lt;span class='c1'&gt;;; return a seq that is constantly value until the first time&lt;/span&gt;
      &lt;span class='c1'&gt;;; the observable is true, and then is constantly 0&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;h&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;if &lt;/span&gt;&lt;span class='nv'&gt;h&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;or &lt;/span&gt;&lt;span class='nv'&gt;value&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;drop-last&lt;/span&gt;
            &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;reductions&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;h&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;obs&lt;/span&gt; &lt;span class='nv'&gt;_&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;and &lt;/span&gt;&lt;span class='nv'&gt;h&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;not &lt;/span&gt;&lt;span class='nv'&gt;obs&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
                        &lt;span class='nv'&gt;true&lt;/span&gt;
                        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='nv'&gt;vector&lt;/span&gt; &lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;))))))&lt;/span&gt;

  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*snell*&lt;/span&gt;
    &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;

  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;*absorb*&lt;/span&gt;
    &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;observable-values&lt;/span&gt; &lt;span class='nv'&gt;contract-values&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;These assumptions are clearly far too simple for production use, but they provide a base on which to build. More information on models and implementations for each can be found in the paper, and &lt;a href='http://arminstraub.com/mathematics/hiring-a-secretary'&gt;Armin Straub&lt;/a&gt; has some basic material on the Snell envelope. For a deeper understanding of all these concepts, you&amp;#8217;ll need to find your local financial engineer and buy him a few drinks.&lt;/p&gt;

&lt;h3 id='a_simple_bond'&gt;A Simple Bond&lt;/h3&gt;

&lt;p&gt;To get a better intuition for this library we&amp;#8217;ll work through the implementation of a very simple bond structure. A financial bond is &lt;a href='http://en.wikipedia.org/wiki/Bond_(finance'&gt;&amp;#8220;a formal contract to repay borrowed money with interest at fixed intervals.&amp;#8221;&lt;/a&gt;. We will model a $100 bond with a 4 part repayment schedule. There are 6 interesting points in time for the principal of this bond - the initial value, the value at each of the payment dates, and the final value. We model this as a map and turn it into an Observable by defining a new Observable primitive called &lt;code&gt;schedule&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defobservable&lt;/span&gt; &lt;span class='nv'&gt;schedule&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;sched&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;values&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='nv'&gt;sched&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;principal&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;schedule&lt;/span&gt;
                &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='nv'&gt;total&lt;/span&gt;
                 &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='nv'&gt;total&lt;/span&gt;
                 &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;total&lt;/span&gt; &lt;span class='nv'&gt;principal-payment&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                 &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;total&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;principal-payment&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                 &lt;span class='mi'&gt;4&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;total&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;principal-payment&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                 &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;total&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;principal-payment&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;))}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that this Observable will only work with fairly restrictive notion of time - time must be modeled as a series of integers from 0 to 5. It would be fairly straightforward to write a function that would support more sophisticated notions of time, and we leave this as an exercise to the reader.&lt;/p&gt;

&lt;p&gt;From this Observable we can build a library of more complex Observables and Contracts using the primitives we have already defined. In the following code we assume that the observable namespace has been aliased to &lt;code&gt;o&lt;/code&gt; and the contract namespace has been aliased to &lt;code&gt;c&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='c1'&gt;;; an observable of the interest payments on our bond&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;interest-payments&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/*&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/const&lt;/span&gt; &lt;span class='mf'&gt;0.015&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;principal&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;

&lt;span class='c1'&gt;;; an observable of the payments on our bond&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;payments&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/+&lt;/span&gt; &lt;span class='nv'&gt;interest-payments&lt;/span&gt; &lt;span class='nv'&gt;principal-payments&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;

&lt;span class='c1'&gt;;; a contract for the interest payment at a specific time&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;interest-payment-at&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;time&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/when&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/at&lt;/span&gt; &lt;span class='nv'&gt;time&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/scale&lt;/span&gt; &lt;span class='nv'&gt;payments&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/one&lt;/span&gt; &lt;span class='nv'&gt;:usd&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We can use this library to build our bond structure:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;four-payment-bond&lt;/span&gt;
     &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/and&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/when&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/at&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/scale&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/const&lt;/span&gt; &lt;span class='mi'&gt;100&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/one&lt;/span&gt; &lt;span class='nv'&gt;:usd&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
            &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/give&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/and&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;interest-payment-at&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/and&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;interest-payment-at&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                                  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/and&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;interest-payment-at&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                                         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;interest-payment-at&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;)))))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now for the moment of truth. We&amp;#8217;ll use &lt;code&gt;values&lt;/code&gt; to get the value of this contract at each point in our primitive timeline:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;covenant&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;bond&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;v/use-default-model&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;covenant&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;valuation/*absorb*&lt;/span&gt;
&lt;span class='nv'&gt;covenant&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;bond&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='nv'&gt;four-payment-bond&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;-3.75&lt;/span&gt; &lt;span class='mf'&gt;-103.75&lt;/span&gt; &lt;span class='mf'&gt;-77.25&lt;/span&gt; &lt;span class='mf'&gt;-51.125&lt;/span&gt; &lt;span class='mf'&gt;-25.375&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This looks right: at first, the expected value of this contract is the $100 we&amp;#8217;ll receive minus the four payments we&amp;#8217;ll make and interest. Interest comes out to $3.75, so we expect to lose that much over the lifetime of the contract. At time 1, the $100 has already been paid - if we were to acquire the contract at this point we&amp;#8217;d take on all of the interest payments, but none of the original payment. As interest payments are made, the expected loss from this contract goes to 0. We can model the other side of this transaction using &lt;code&gt;give&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;covenant&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;bond&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;o/values&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/give&lt;/span&gt; &lt;span class='nv'&gt;four-payment-bond&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;3.75&lt;/span&gt; &lt;span class='mf'&gt;103.75&lt;/span&gt; &lt;span class='mf'&gt;77.25&lt;/span&gt; &lt;span class='mf'&gt;51.125&lt;/span&gt; &lt;span class='mf'&gt;25.375&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='a_call_for_participation'&gt;A Call for Participation&lt;/h3&gt;

&lt;p&gt;The source for this library can be found on &lt;a href='https://github.com/travis/covenant'&gt;GitHub&lt;/a&gt;, alongside &lt;a href='http://fogus.me/fun/marginalia/'&gt;Marginalia&lt;/a&gt; generated &lt;a href='http://travis.github.com/covenant/'&gt;documentation&lt;/a&gt;. While the basics have been laid down, it needs additional work and expertise to be useful in a real world context. This work falls into a couple categories:&lt;/p&gt;

&lt;h4 id='models'&gt;Models&lt;/h4&gt;

&lt;p&gt;More sophisticated and complete models are needed to enable non-trivial usage of this library. Implementations of &lt;code&gt;*absorb*&lt;/code&gt; and &lt;code&gt;*snell*&lt;/code&gt; would be great, especially from statistically minded financial engineers.&lt;/p&gt;

&lt;h4 id='examples'&gt;Examples&lt;/h4&gt;

&lt;p&gt;The simple bond presented above is useful as a proof of concept, but more examples would help elucidate the power of this model. There are thousands of different financial instruments in the world, and it would be fun and interesting to start collecting a menagerie in a central location.&lt;/p&gt;

&lt;p&gt;The goal of this project is not to solve the problem of an impenetrably complex financial system - indeed, being able to formally represent contracts could easily make the problem worse, taking this complexity into entirely new realms. It is, however, built on the belief that formal models are useful, and can serve as the foundation for higher level tools to provide better insight into a complicated system. It is clear that the mavens at the heart of our financial system will continue dreaming up complicated financial instruments, and it is imperative that the rest of us have the tools to separate the wheat from the chaff. Patches welcome!&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>Advice to a Novice Programmer</title>
   <link href="http://combinate.us/2011/02/21/advice-to-a-novice-programmer/" />
   <updated>2011-02-21T00:00:00+00:00</updated>
   <id>http://combinate.us//2011/02/21/advice-to-a-novice-programmer</id>
   <content type="html">&lt;p&gt;A friend from Ithaca asked for advice on getting started with programming. Specifically, he asked how I started and whether I&amp;#8217;d recommend Java classes. Fortunately for him, this is a subject I can bloviate on for quite a while, and my response ended up being fairly long, at which point I realized it might hold the potential for some greater social value than it could achieve as part of a one to one conversation. With that in mind, I&amp;#8217;ve done some some minor editing and reproduced my message below.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;My story is that I started with an &lt;a href='http://www.cs.williams.edu/cs136.html'&gt;&amp;#8220;intro to computer science&amp;#8221; class&lt;/a&gt; in the spring of my sophomore year at Williams, and was able to use that experience to snag a &lt;a href='http://code.google.com/soc/'&gt;Google Summer of Code&lt;/a&gt; internship. The class was taught using Java, which IMHO only worked because it was a normal 10-15 hour/week class. I picked up &lt;a href='http://www.python.org/'&gt;Python&lt;/a&gt; on my own that summer and used it exclusively for the internship. I learned Python mainly from &lt;a href='http://oreilly.com/catalog/9780596001889'&gt;Python in a Nutshell&lt;/a&gt;, a path I think is absolutely perfect if a) you have the basics under your belt and b) you have a reasonably well defined project you&amp;#8217;d like to hack on for a couple months. I think it&amp;#8217;s important to note, however, that without these two things, picking up Python from PiaN would be pretty brutal - it&amp;#8217;s really more of a reference book with a technical but well written language overview at the front.&lt;/p&gt;

&lt;p&gt;The demand for programming skills right now is through the roof, and the vibrancy of open source software (spend some time browsing &lt;a href='https://github.com/'&gt;GitHub&lt;/a&gt;) means that even if I wasn&amp;#8217;t employed I could keep busy for the rest of my life behind a keyboard. One of the most valuable qualities a programmer can have is a deep familiarity with a particular non-programming domain coupled with solid baseline programming skills. Someone who can successfully apply &amp;#8220;computational thinking&amp;#8221; to a domain with a shortage of it can do pretty well.&lt;/p&gt;

&lt;p&gt;Interestingly, I know a lot of people in the industry who don&amp;#8217;t have a formal background in computer science. I think it&amp;#8217;s probably easiest to get baseline programming skills ramped up by going through a mix of formal classes and personal, unguided exploration, and I think that trying to learn this stuff with just one or the other is probably much less likely to be successful.&lt;/p&gt;

&lt;p&gt;My wife is actually starting down this same path - looking to augment her domain specific knowledge with some baseline programming skills - and I got her a book called &lt;a href='http://www.manning.com/sande/'&gt;Hello World!&lt;/a&gt;. It&amp;#8217;s designed for &amp;#8220;Kids and Other Beginners&amp;#8221; and is literally designed to be consumable by 12 year olds, but she has really loved its willingness and ability to explain basic concepts in clear, easy to understand language.&lt;/p&gt;

&lt;p&gt;I would definitely recommend programming classes. If you can find something taught in Python I&amp;#8217;d recommend it, but Java is the lingua franca these days and is not a bad alternative. Regardless of which &amp;#8220;formal education&amp;#8221; path you choose, I would strongly recommend picking up a side project that you think might be fun and engaging. You could try searching GitHub for a fun open source project and try to modify it to do something different, or even just work through a book like &amp;#8220;Hello World&amp;#8221; and find inspiration there. Here&amp;#8217;s a neat thread of ideas:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.daniweb.com/forums/thread32007.html'&gt;http://www.daniweb.com/forums/thread32007.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whichever path you choose make sure you&amp;#8217;re having fun!&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>Arduino and Clojure</title>
   <link href="http://combinate.us/2010/12/27/arduino-and-clojure/" />
   <updated>2010-12-27T00:00:00+00:00</updated>
   <id>http://combinate.us//2010/12/27/arduino-and-clojure</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.arduino.cc/'&gt;Arduino&lt;/a&gt; is the coolest toy I&amp;#8217;ve gotten for Christmas in a while. After working through the &lt;a href='http://makezine.com/getstartedarduino/'&gt;Make introductory guide&lt;/a&gt; I was excited to get it hooked up to a swank-clojure emacs buffer, and fortunately the hard work has already been done. &lt;a href='http://nakkaya.com/clodiuno.html'&gt;Cloduino&lt;/a&gt; takes care of the heavy lifting of talking to an Arduino board running &lt;a href='http://www.arduino.cc/playground/Interfacing/Firmata'&gt;Firmata&lt;/a&gt;, which means I can eval Clojure in an emacs buffer and see the board react instantly. It took a little more digging than the Cloduino page suggests to get things set up properly, but with that done it works like a charm. The tricky bits here are figuring out where to put various things, so some of the setup instructions are specific to Snow Leopard, specifically OS X 10.6.5.&lt;/p&gt;

&lt;h3 id='setup'&gt;Setup&lt;/h3&gt;

&lt;p&gt;First, download the &lt;a href='http://www.arduino.cc/en/Main/Software'&gt;Arduino IDE&lt;/a&gt; and drag it into your Applications folder. I still use the IDE for verifying and uploading Processing scripts to the Arduino board and I&amp;#8217;d strongly recommend working through some basic examples if this is your first foray into Arduino. Once you&amp;#8217;re ready to start playing with the board over the serial port, open up the IDE and load the appropriate Firmata sketch from &lt;code&gt;File &amp;gt; Examples&lt;/code&gt;. I used &lt;code&gt;StandardFirmata_2_2_forUNO_0_3&lt;/code&gt; because I have an Uno board, but YMMV. Whichever sketch you choose, make sure you have the right serial port selected from &lt;code&gt;Tools &amp;gt; Serial Port&lt;/code&gt; and upload it to the board.&lt;/p&gt;

&lt;p&gt;Next you&amp;#8217;ll need to copy some dependencies from the IDE to your Java extensions directory. On Snow Leopard this is &lt;code&gt;/Library/Java/Extensions&lt;/code&gt;, so this should look like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;cp /Applications/Arduino.app/Contents/Resources/Java/&lt;span class='o'&gt;{&lt;/span&gt;RXTXcomm.jar,librxtxSerial.jnilib&lt;span class='o'&gt;}&lt;/span&gt; &lt;span class='se'&gt;\&lt;/span&gt;
   /Library/Java/Extensions/
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now comes the fun part: head to wherever you like to develop code and create a new project with &lt;code&gt;lein&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;lein new arduino-sandbox
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now open up &lt;code&gt;arduino-sandbox/project.clj&lt;/code&gt; in your favorite editor and add &lt;code&gt;cloduino&lt;/code&gt;, &lt;code&gt;org.clojars.nakkaya/rxtx-macosx-native-deps&lt;/code&gt;, and &lt;code&gt;native-deps&lt;/code&gt;. Your dependencies section should look something like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;  &lt;span class='nv'&gt;:dependencies&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;org&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;clojure/clojure&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.2.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                 &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;org&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;clojure/clojure-contrib&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.2.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                 &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;clodiuno&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;0.0.2-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='nv'&gt;:native-dependencies&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;org&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;clojars&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;nakkaya/rxtx-macosx-native-deps&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;2.1.7&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='nv'&gt;:dev-dependencies&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;native-deps&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.0.5&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You&amp;#8217;ll also need to add &lt;code&gt;:jvm-opts [&amp;quot;-d32&amp;quot;]&lt;/code&gt; to your &lt;code&gt;defproject&lt;/code&gt; to ensure the JVM uses a 32 bit data model - this is required for compatibility with the native dependencies. Your &lt;code&gt;project.clj&lt;/code&gt; should now look like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defproject&lt;/span&gt; &lt;span class='nv'&gt;arduino-sandbox&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;
  &lt;span class='nv'&gt;:description&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;FIXME: write&amp;quot;&lt;/span&gt;
  &lt;span class='nv'&gt;:dependencies&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;org&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;clojure/clojure&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.2.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                 &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;org&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;clojure/clojure-contrib&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.2.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                 &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;clodiuno&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;0.0.2-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='nv'&gt;:native-dependencies&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;org&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;clojars&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;nakkaya/rxtx-macosx-native-deps&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;2.1.7&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='nv'&gt;:dev-dependencies&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;native-deps&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.0.5&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='nv'&gt;:jvm-opts&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-d32&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Finally, head back to the command line, &lt;code&gt;cd&lt;/code&gt; into your project and run &lt;code&gt;lein deps&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id='blink'&gt;Blink&lt;/h3&gt;

&lt;p&gt;To make sure everything is working, fire up a repl with &lt;code&gt;lein
repl&lt;/code&gt;. Pull &lt;code&gt;cloduino&lt;/code&gt; into the repl namespace with&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;use&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;clodiuno&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;core&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;clodiuno&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;firmata&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and initialize the board, assigning it to a var named &lt;code&gt;board&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;arduino&lt;/span&gt; &lt;span class='nv'&gt;:firmata&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/dev/tty.usbmodem621&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You may need to change &lt;code&gt;&amp;quot;/dev/tty.usbmodem621&amp;quot;&lt;/code&gt; to match the serial port Arduino uses on your system - it should have a similar name to the one you chose in the IDE. The board will take a few seconds to initialize, but once it returns it should be ready for interaction.&lt;/p&gt;

&lt;p&gt;The easiest way to interact with the board at this point is to control the builtin LED, which is tied to pin 13. To turn it on and off, first put the pin into OUTPUT mode:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;pin-mode&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;13&lt;/span&gt; &lt;span class='nv'&gt;OUTPUT&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You can now turn it on by writing &lt;code&gt;HIGH&lt;/code&gt; to the pin:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;digital-write&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;13&lt;/span&gt; &lt;span class='nv'&gt;HIGH&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You can turn it off by writing &lt;code&gt;LOW&lt;/code&gt; to the pin:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;digital-write&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;13&lt;/span&gt; &lt;span class='nv'&gt;LOW&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='analog'&gt;Analog&lt;/h3&gt;

&lt;p&gt;Of course, to do anything interesting you&amp;#8217;ll need to do a bit of hands on wiring. I built a sensor circuit attached to analog pin 0 (a light sensor works great) and an LED circuit attached to pin 9, both of which are described in the &lt;a href='http://makezine.com/getstartedarduino/'&gt;Make guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To set these pins up for this configuration, enter the following at the REPL:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;pin-mode&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt; &lt;span class='nv'&gt;PWM&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;enable-pin&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='nv'&gt;:analog&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To turn the LED on at a particular brightness, use &lt;code&gt;analog-write&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;analog-write&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt; &lt;span class='mi'&gt;250&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Try a variety of values between 0 and 255 to see it change.&lt;/p&gt;

&lt;p&gt;To get a reading from the sensor, use &lt;code&gt;analog-read&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;analog-read&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This means we can read from a physical input and write to a physical output using Clojure. Let&amp;#8217;s put these together in a tantalizing hint at what we might be able to do with these capabilities:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;map-int&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;x&lt;/span&gt; &lt;span class='nv'&gt;in-min&lt;/span&gt; &lt;span class='nv'&gt;in-max&lt;/span&gt; &lt;span class='nv'&gt;out-min&lt;/span&gt; &lt;span class='nv'&gt;out-max&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;int &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;x&lt;/span&gt; &lt;span class='nv'&gt;in-min&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;out-max&lt;/span&gt; &lt;span class='nv'&gt;out-min&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;in-max&lt;/span&gt; &lt;span class='nv'&gt;in-min&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='nv'&gt;out-min&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;while&lt;/span&gt; &lt;span class='nv'&gt;true&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;analog-write&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;9&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;map-int&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;analog-read&lt;/span&gt; &lt;span class='nv'&gt;board&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='mi'&gt;1023&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='mi'&gt;50&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If everything is working properly, this should give you an LED that reacts to the value of the sensor. Of course, you could do the same thing using pure Processing running on the Arduino board, so I recommend you start playing with something a bit more complex. Have fun tinkering!&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>resrc part 2: solidifying the abstraction</title>
   <link href="http://combinate.us/2010/10/19/resrc-part-2-solidifying-the-abstraction/" />
   <updated>2010-10-19T00:00:00+00:00</updated>
   <id>http://combinate.us//2010/10/19/resrc-part-2-solidifying-the-abstraction</id>
   <content type="html">&lt;p&gt;In our &lt;a href='/2010/10/17/resrc-part-1-bootstrapping-an-abstraction/'&gt;last installment&lt;/a&gt;, we laid out a core abstraction for RESTful resources. We also implemented a basic routing function to map identifiers to resources, and a content negotiation function that mapped a list of acceptable content types to particular representation of a resource. The result was a functional resource processing function, but lacked the ease of use and DRYness that a Clojure programmer can expect from a well written library. In this installment we look at ways to fix that. We&amp;#8217;ll also harvest some low hanging performance optimization fruit and begin to specialize our abstraction to take advantage of the power of &lt;a href='http://github.com/mmcgrana/ring'&gt;Ring&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='better'&gt;Better&lt;/h3&gt;

&lt;p&gt;We&amp;#8217;ll start once again with resources. We&amp;#8217;d like to be able to succinctly define a resource and associated representations. We first write down an example of how we&amp;#8217;d like this to work:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-resource&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;resource&lt;/span&gt;
                  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fuz &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;put&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text/html&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;+response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;representation&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)])]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fuz representation&amp;quot;&lt;/span&gt;
           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;process-request&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;get&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;foo representation&amp;quot;&lt;/span&gt;
           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;process-request&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;put&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;#8217;s unpack that. The &lt;code&gt;resource&lt;/code&gt; function we&amp;#8217;d like to define will need to take a set of method handlers and a list of representations. Because the signature for our method handlers will be repetitive and its parameters often discarded, we&amp;#8217;d like to be able to leave it out and give these handlers access to the parameters via special symbols prefixed with &lt;code&gt;+&lt;/code&gt;. We&amp;#8217;d like to be able to specify representations using a succinct content type syntax and use the same &amp;#8220;magic variable&amp;#8221; technique for making the response available in the representation function.&lt;/p&gt;

&lt;p&gt;Clojure&amp;#8217;s macros are just the tool for the job, but a macro like this needs to be carefully executed, as it looks like it could be fairly complicated. At a high level, we&amp;#8217;d like to transform code like&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;resource&lt;/span&gt;
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fuz &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;put&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
 &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text/html&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;+response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;representation&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;to code like&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;with-representations&lt;/span&gt;
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;reify&lt;/span&gt; &lt;span class='nv'&gt;Resource&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;+resource&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;fuz &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;put&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;+resource&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
 &lt;span class='p'&gt;[[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;+resource&lt;/span&gt; &lt;span class='nv'&gt;+response&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;+response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;representation&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))]])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Is this really all that complex? Looking closer, it appears that aside from some syntax massaging around the protocol method implementations and representation function, this is actually a fairly standard substitution macro. With that in mind, we&amp;#8217;ll tackle the syntax helpers in isolation by writing a couple functions that operate on quoted Clojure forms:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;emit-resource-handler&lt;/span&gt;
  &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;method&lt;/span&gt; &lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nv'&gt;forms&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='o'&gt;`&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;~method&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+resource&lt;/span&gt;  &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
            &lt;span class='nv'&gt;~@forms&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;split-type&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;[(&lt;/span&gt;&lt;span class='nb'&gt;keyword &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;namespace &lt;/span&gt;&lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;keyword &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;name &lt;/span&gt;&lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='p'&gt;))])&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;emit-representations&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;vector&lt;/span&gt;
         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;type&lt;/span&gt; &lt;span class='nv'&gt;representation&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='p'&gt;[(&lt;/span&gt;&lt;span class='nf'&gt;split-type&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                                          &lt;span class='o'&gt;`&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+resource&lt;/span&gt; &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+response&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;~representation&lt;/span&gt;&lt;span class='p'&gt;)])&lt;/span&gt;
         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;partition&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Both of these functions utilize a technique for avoiding Clojure&amp;#8217;s symbol capture safety mechanisms. Symbol capture like the kind we use in this macro is usually a subtle bug in macro code. In this case, however, we force symbol capture by unquoting and requoting a symbol like &lt;code&gt;~&amp;#39;+request&lt;/code&gt;. Whoever writes the form that will be passed in to &lt;code&gt;emit-representations&lt;/code&gt; will now be able to use &lt;code&gt;+resource&lt;/code&gt; and &lt;code&gt;+response&lt;/code&gt; without explicitly defining them.&lt;/p&gt;

&lt;p&gt;With these functions written, our macro is now straightforward:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defmacro &lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;representations&lt;/span&gt; &lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nv'&gt;specs&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;reverse &lt;/span&gt;&lt;span class='nv'&gt;args&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
    &lt;span class='o'&gt;`&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;with-representations&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;reify&lt;/span&gt; &lt;span class='nv'&gt;Resource&lt;/span&gt; &lt;span class='nv'&gt;~@&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='nv'&gt;emit-resource-handler&lt;/span&gt; &lt;span class='nv'&gt;specs&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
       &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;emit-representations&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We can use it to succinctly define a new resource:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;resource&lt;/span&gt;
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fuz &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;put&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
 &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text/html&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;+response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;representation&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)]))&lt;/span&gt;

&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[[[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;rep&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;representations&lt;/span&gt; &lt;span class='nv'&gt;r&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;rep&lt;/span&gt; &lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;fuz representation&amp;quot;&lt;/span&gt;

&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[[[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;rep&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;representations&lt;/span&gt; &lt;span class='nv'&gt;r&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;rep&lt;/span&gt; &lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;put&lt;/span&gt; &lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;foo representation&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='faster'&gt;Faster&lt;/h3&gt;

&lt;p&gt;The routing method we wrote last time took set of routes and a path as input and returned a tuple representing the matched resource and any parameters extracted from the path:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;resrc&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;core&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-resource&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/foo/:id&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;:bar&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/foo/10&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:bar&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;10&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Formulated this way, &lt;code&gt;find-resource&lt;/code&gt; must process the raw list of routes and resources every time it is invoked, even though the list may not have changed since the last invocation. It also forces consumers to have access to both the list of routes and the path of the request, and it would be nice to only require them to think about the request itself.&lt;/p&gt;

&lt;p&gt;We can fix both of these problems by splitting the computation into two pieces. We&amp;#8217;ll define a new function &lt;code&gt;compile-routes&lt;/code&gt; that will return a function of one argument, the request path. This returned function will be responsible for mapping a path to the resource-params tuple we are familiar with. Since we&amp;#8217;re doing performance optimization, lets get some baseline performance numbers so we can get a sense of what we&amp;#8217;re gaining:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;dotimes &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;time &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-resource&lt;/span&gt; &lt;span class='nv'&gt;bunch-of-routes&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar/10&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.774 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.694 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.461 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 2.743 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.588 msecs&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We&amp;#8217;ll start by thinking about what it means to compile a single route. We&amp;#8217;d like to turn a route into a function that takes a path and returns either a resource-params tuple or nil:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;compile-route&lt;/span&gt;
  &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;path-spec&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;when-let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;params&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;clout/route-matches&lt;/span&gt; &lt;span class='nv'&gt;path-spec&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
              &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;params&lt;/span&gt;&lt;span class='p'&gt;])))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Next, we can use this function to pre-compile our routes into a list of functions. Matching a path at runtime will now be a matter of evaluating functions until we find a match:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;compile-routes&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;routes&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;compiled-routes&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='nv'&gt;compile-route&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;partition&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;some &lt;/span&gt;&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;%&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;compiled-routes&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;#8217;s take a look at what we&amp;#8217;ve gained:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;compiled-routes&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;compile-routes&lt;/span&gt; &lt;span class='nv'&gt;bunch-of-routes&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;dotimes &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;time &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;compiled-routes&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar/10&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.712 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.38 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.504 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.662 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 1.193 msecs&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is an improvement, but it&amp;#8217;s not as dramatic as we might like. One optimization we didn&amp;#8217;t include was to use Clout to pre-compile path specifications into a format it is able to use more efficiently. We&amp;#8217;ve created a perfect place for this in &lt;code&gt;compile-route&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;compile-route&lt;/span&gt;
  &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;path-spec&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;compiled-path-spec&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;clout/route-compile&lt;/span&gt; &lt;span class='nv'&gt;path-spec&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;when-let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;params&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;clout/route-matches&lt;/span&gt; &lt;span class='nv'&gt;compiled-path-spec&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
                &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;params&lt;/span&gt;&lt;span class='p'&gt;]))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;#8217;s run our benchmarks again:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;compiled-routes&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;compile-routes&lt;/span&gt; &lt;span class='nv'&gt;bunch-of-routes&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;dotimes &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;time &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;compiled-routes&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar/10&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 0.219 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 0.102 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 0.091 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 0.095 msecs&amp;quot;&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 0.128 msecs&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s more like it! We&amp;#8217;ve gotten a solid performance boost by extracting repeated computation out using higher order functions.&lt;/p&gt;

&lt;h3 id='stronger'&gt;Stronger&lt;/h3&gt;

&lt;p&gt;Now that we&amp;#8217;ve explored two improvements to the core library, let&amp;#8217;s take a look at extending our abstraction to play nicely with Ring.&lt;/p&gt;

&lt;p&gt;Specializing our abstraction for Ring means that we can make a couple assumptions that were previously off limits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;requests and responses will be Clojure maps&lt;/li&gt;

&lt;li&gt;these maps will have certain keys and values as specifed in the &lt;a href='http://github.com/mmcgrana/ring/blob/master/SPEC'&gt;Ring spec&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First, we&amp;#8217;ll take advantage of this new information to write a cleaner version of the &lt;code&gt;process-request&lt;/code&gt; method we defined &lt;a href='/2010/10/17/resrc-part-1-bootstrapping-an-abstraction/'&gt;earlier&lt;/a&gt;. As usual, we&amp;#8217;ll write down how we&amp;#8217;d like it to work:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-process-request&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/resource&lt;/span&gt;
         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;c/get&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
         &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text/plain&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;+response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)])]&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;foo bar&amp;quot;&lt;/span&gt;
          &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;:body&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;process-request&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                                  &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;:method&lt;/span&gt; &lt;span class='nv'&gt;:get&lt;/span&gt;
                                   &lt;span class='nv'&gt;:uri&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt;
                                   &lt;span class='nv'&gt;:headers&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}}))))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This looks a lot like our previous &lt;code&gt;process-request&lt;/code&gt;, with most of the arguments to the original embedded within the Ring request. We can&amp;#8217;t quite use the original because it threw away path and response content type information, which we&amp;#8217;d now like to include in the request and response:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;process-request&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;method should be a method supported by Resource.&lt;/span&gt;

&lt;span class='s'&gt;Assumes representations are functions from [resource request &amp;amp; rest] to response.&amp;quot;&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;path&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;:uri&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;path-params&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;core/find-resource&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='nv'&gt;method&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;ns-resolve &lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;resrc&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;core&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;symbol &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;name &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;:method&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
        &lt;span class='nv'&gt;accepts-list&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;parse-accept&lt;/span&gt; &lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='nf'&gt;:headers&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;if-let &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;response-type&lt;/span&gt; &lt;span class='nv'&gt;representation&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
             &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;core/find-acceptable&lt;/span&gt; &lt;span class='nv'&gt;accepts-list&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;core/representations&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;add-content-type&lt;/span&gt;
       &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;representation&lt;/span&gt;
        &lt;span class='nv'&gt;resource&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;method&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;assoc &lt;/span&gt;&lt;span class='nv'&gt;request&lt;/span&gt; &lt;span class='nv'&gt;:path-params&lt;/span&gt; &lt;span class='nv'&gt;path-params&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
       &lt;span class='nv'&gt;response-type&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;:status&lt;/span&gt; &lt;span class='mi'&gt;405&lt;/span&gt; &lt;span class='nv'&gt;:headers&lt;/span&gt; &lt;span class='p'&gt;{}})))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This function depends on a new function &lt;code&gt;parse-accept&lt;/code&gt;. We&amp;#8217;ll write an example of how this should work:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-parse-accept&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;seq &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]])&lt;/span&gt;
         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;parse-accept&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;text/plain, text/html&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='c1'&gt;;; should sort by &amp;#39;q&amp;#39; param&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;seq &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]])&lt;/span&gt;
         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;parse-accept&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;text/html;q=0.5, text/plain;q=0.8&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
  &lt;span class='c1'&gt;;; q defaults to 1&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;seq &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]])&lt;/span&gt;
         &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;parse-accept&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;text/html;q=0.5, text/plain&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And finally, implement it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;parse-accept&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;accepts-string is a string like&lt;/span&gt;
&lt;span class='s'&gt;text/*, text/html, text/html;level=1, */*&amp;quot;&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;accept-string&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sort-by-q-value&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;parse-accept-component&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;s/trim&lt;/span&gt; &lt;span class='nv'&gt;%&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;s/split&lt;/span&gt; &lt;span class='nv'&gt;accept-string&lt;/span&gt; &lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We&amp;#8217;ll leave out the implementation of &lt;code&gt;parse-accept-component&lt;/code&gt; and &lt;code&gt;sort-by-q-value&lt;/code&gt; for now, but as usual they&amp;#8217;ll be available in the &lt;a href='http://github.com/travis/resrc/commit/d92acc0d8799fc1e8711c7012dbf771f8564ae9d'&gt;linked source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is one other improvement we can make to our library to make it easier to work with Ring. In our original &lt;code&gt;resource&lt;/code&gt; macro, only &lt;code&gt;+resource&lt;/code&gt; and &lt;code&gt;+request&lt;/code&gt; were made available to method handlers. This means that in practice, defining Ring resources would involve a lot of code like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;resource&lt;/span&gt;
 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[{&lt;/span&gt;&lt;span class='nv'&gt;body&lt;/span&gt; &lt;span class='nv'&gt;:body&lt;/span&gt; &lt;span class='nv'&gt;headers&lt;/span&gt; &lt;span class='nv'&gt;:headers&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='nv'&gt;+request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;headers&lt;/span&gt; &lt;span class='nv'&gt;body&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;let&lt;/code&gt;, used to destructure the Ring request, is boilerplate that obscures the actual meat of the handler. We can get rid of it by extending our implicit wrapping &lt;code&gt;let&lt;/code&gt; to include all keys defined in the Ring specification:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;emit-resource-handler&lt;/span&gt;
   &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;method&lt;/span&gt; &lt;span class='nv'&gt;&amp;amp;&lt;/span&gt; &lt;span class='nv'&gt;forms&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
   &lt;span class='o'&gt;`&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;~method&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+resource&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+server-port&lt;/span&gt; &lt;span class='nv'&gt;:server-port&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+server-name&lt;/span&gt; &lt;span class='nv'&gt;:server-name&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+remote-addr&lt;/span&gt; &lt;span class='nv'&gt;:remote-addr&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+uri&lt;/span&gt; &lt;span class='nv'&gt;:uri&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+query-string&lt;/span&gt; &lt;span class='nv'&gt;:query-string&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+scheme&lt;/span&gt; &lt;span class='nv'&gt;:scheme&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+request-method&lt;/span&gt; &lt;span class='nv'&gt;:request-method&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+content-type&lt;/span&gt; &lt;span class='nv'&gt;:content-type&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+content-length&lt;/span&gt; &lt;span class='nv'&gt;:content-length&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+character-encoding&lt;/span&gt; &lt;span class='nv'&gt;:character-encoding&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+headers&lt;/span&gt; &lt;span class='nv'&gt;:headers&lt;/span&gt;
                           &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+body&lt;/span&gt; &lt;span class='nv'&gt;:body&lt;/span&gt;
                           &lt;span class='nv'&gt;:as&lt;/span&gt; &lt;span class='nv'&gt;~&lt;/span&gt;&lt;span class='ss'&gt;&amp;#39;+request&lt;/span&gt;&lt;span class='p'&gt;}]&lt;/span&gt;
             &lt;span class='nv'&gt;~@forms&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Which gets the following test running:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-resource&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;resource&lt;/span&gt;
                  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='nv'&gt;+body&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:text/html&lt;/span&gt;  &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;:body&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;+response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;representation&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)}])]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;foo representation&amp;quot;&lt;/span&gt;
           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;:body&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;process-request&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                                   &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;:method&lt;/span&gt; &lt;span class='nv'&gt;:get&lt;/span&gt;
                                    &lt;span class='nv'&gt;:uri&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt;
                                    &lt;span class='nv'&gt;:headers&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
                                    &lt;span class='nv'&gt;:body&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}))))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='next_something_useful'&gt;Next: Something Useful&lt;/h3&gt;

&lt;p&gt;We&amp;#8217;ve developed a general purpose library for defining resources and making requests against them. Next time we&amp;#8217;ll refine this into something closer to a full fledged web development framework. We&amp;#8217;ll see how the underlying &lt;code&gt;Resource&lt;/code&gt; abstraction can be used to build a system that will feel familiar to modern web developers and is well suited to building powerful RESTful services.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(the code described in this post is available on &lt;a href='http://github.com/travis/resrc/commit/d92acc0d8799fc1e8711c7012dbf771f8564ae9d'&gt;GitHub&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>resrc part 1: bootstrapping an abstraction</title>
   <link href="http://combinate.us/2010/10/17/resrc-part-1-bootstrapping-an-abstraction/" />
   <updated>2010-10-17T00:00:00+00:00</updated>
   <id>http://combinate.us//2010/10/17/resrc-part-1-bootstrapping-an-abstraction</id>
   <content type="html">&lt;p&gt;&lt;a href='http://github.com/mmcgrana/ring'&gt;Ring&lt;/a&gt;, Clojure&amp;#8217;s answer to &lt;a href='http://www.wsgi.org/wsgi/'&gt;WSGI&lt;/a&gt; and &lt;a href='http://rack.rubyforge.org/'&gt;Rack&lt;/a&gt;, is a wonderfully simple implementation of the HTTP request/response and intermediary abstractions. This simplicity facilitates integration with components that interact with the networking stack and provides a solid base on which to build web focused abstractions, but by itself falls short of the capturing the full REST architectural style of the web. To ease development of applications that take advantage of the web ecosystem, it would be useful to have an abstraction that captures REST in a first class way. Let&amp;#8217;s take a look at how that might be implemented in Clojure.&lt;/p&gt;

&lt;h3 id='resource'&gt;Resource&lt;/h3&gt;

&lt;p&gt;Resources are the building block of the web, so it makes sense to tackle them first. A resource is &amp;#8221;&lt;a href='http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm'&gt;any information that can be named&lt;/a&gt;,&amp;#8221; and is accessed according to a uniform interface of 4-6 different methods. We&amp;#8217;ll start by writing down the core of this interface, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;put&lt;/code&gt;, &lt;code&gt;post&lt;/code&gt; and &lt;code&gt;delete&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;defprotocol&lt;/span&gt; &lt;span class='nv'&gt;Resource&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;put&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;delete&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;post&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As with all protocols, the first argument is the object itself. The second argument, &lt;code&gt;request&lt;/code&gt;, will probably be a Ring HTTP request map. Note, however, that this protocol doesn&amp;#8217;t specify that explicitly, and as a result may also be used to represent non-HTTP resources in any other system implemented in a RESTful style.&lt;/p&gt;

&lt;p&gt;Before we get too much further we should document this abstraction with examples of its use. We&amp;#8217;ll use &lt;code&gt;clojure.test&lt;/code&gt; to provide these examples in a way that can double as regression testing:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-Resource&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;reify&lt;/span&gt; &lt;span class='nv'&gt;Resource&lt;/span&gt;
                 &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;res&lt;/span&gt; &lt;span class='nv'&gt;req&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;fun&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fun&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='nv'&gt;r&lt;/span&gt; &lt;span class='nv'&gt;nil&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='identifier'&gt;Identifier&lt;/h3&gt;

&lt;p&gt;REST associates resources with resource identifiers. On the web these take the form of URIs. We&amp;#8217;d like to define a function that maps the path portion of a URI to a resource, so we&amp;#8217;ll first write some examples of how we&amp;#8217;d like it to work:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-find-resource&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/foo&amp;quot;&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
                &lt;span class='s'&gt;&amp;quot;/foo/:id&amp;quot;&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='p'&gt;{}]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-resource&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/foo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-resource&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/foo/bar&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='nv'&gt;nil&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-resource&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Given a path and vector of alternating path specifications and resources, we&amp;#8217;d like to iterate through the path specifications, at each iteration comparing the path against a specification. Once we find a match, we return a tuple containing the resource and a map of the parameters extracted from the path. If no matching specification is found we return &lt;code&gt;nil&lt;/code&gt;. The implementation of this is relatively simple using &lt;code&gt;partition&lt;/code&gt; and &lt;code&gt;some&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;find-resource&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;some &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;path-spec&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
          &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;when-let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;params&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;route-matches&lt;/span&gt; &lt;span class='nv'&gt;path-spec&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
            &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;params&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;partition&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='representation'&gt;Representation&lt;/h3&gt;

&lt;p&gt;A resource is an abstract concept that doesn&amp;#8217;t bind to any particular representation at definition time. Instead, consumers of a resource should be able to provide a list of representations they are able to handle at the time they perform a request against that resource. A given resource may have many representations, and should return the representation deemed &amp;#8220;most preferable&amp;#8221; by the client. So given two datastructures like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;representations&lt;/span&gt; &lt;span class='p'&gt;[[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;resource-1&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                       &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;resource-2&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                       &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:image&lt;/span&gt; &lt;span class='nv'&gt;:jpeg&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;resource-3&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
      &lt;span class='nv'&gt;accepts-list&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:*&lt;/span&gt; &lt;span class='nv'&gt;:*&lt;/span&gt;&lt;span class='p'&gt;]]])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We should be able to use &lt;code&gt;accepts-list&lt;/code&gt; to pick a representation. We&amp;#8217;ll write down some examples of how we&amp;#8217;d like this function to work:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-find-acceptable&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;representations&lt;/span&gt; &lt;span class='p'&gt;[[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                           &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
                           &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:image&lt;/span&gt; &lt;span class='nv'&gt;:jpeg&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;]]]&lt;/span&gt;

      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-acceptable&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:*&lt;/span&gt; &lt;span class='nv'&gt;:*&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-acceptable&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-acceptable&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:html&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:*&lt;/span&gt; &lt;span class='nv'&gt;:*&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:image&lt;/span&gt; &lt;span class='nv'&gt;:jpeg&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-acceptable&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:image&lt;/span&gt; &lt;span class='nv'&gt;:jpeg&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;:*&lt;/span&gt; &lt;span class='nv'&gt;:*&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And finally write the function definition down:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;find-acceptable&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;accepts-list&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;some &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;type&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-representation&lt;/span&gt; &lt;span class='nv'&gt;type&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
        &lt;span class='nv'&gt;accepts-list&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We&amp;#8217;ll leave out the details of &lt;code&gt;find-representation&lt;/code&gt; now, but they are available in the &lt;a href='http://github.com/travis/resrc/commit/5791222d62c1718c70df8b7bcb09b6a6bfeffd18'&gt;resrc source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Representation information, being metadata on a particular &amp;#8220;resource&amp;#8221;, will likely be associated with values as Clojure metadata. To encourage uniformity in metadata naming, we&amp;#8217;ll define a couple wrappers over the Clojure metadata functions to make this simple:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;*representations-key*&lt;/span&gt; &lt;span class='nv'&gt;:resrc-representations&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;with-representations&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;with-meta &lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;assoc &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;meta &lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;*representations-key*&lt;/span&gt; &lt;span class='nv'&gt;representations&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;representations&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;*representations-key*&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;meta &lt;/span&gt;&lt;span class='nv'&gt;obj&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='processing_requests'&gt;Processing Requests&lt;/h3&gt;

&lt;p&gt;All that remains is to assemble the pieces into a system:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;deftest&lt;/span&gt; &lt;span class='nv'&gt;test-process-request&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;with-representations&lt;/span&gt;
          &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;reify&lt;/span&gt; &lt;span class='nv'&gt;Resource&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;get &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;request&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;bar &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
          &lt;span class='p'&gt;[[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fn &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;response&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;str &lt;/span&gt;&lt;span class='nv'&gt;response&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;baz&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))]])]&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;is&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='s'&gt;&amp;quot;foo bar baz&amp;quot;&lt;/span&gt;
          &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;process-request&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='nv'&gt;get&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;:text&lt;/span&gt; &lt;span class='nv'&gt;:plain&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;process-request&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='nv'&gt;method&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt; &lt;span class='nv'&gt;accepts-list&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;_&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-resource&lt;/span&gt; &lt;span class='nv'&gt;routes&lt;/span&gt; &lt;span class='nv'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;if-let &lt;/span&gt;&lt;span class='p'&gt;[[&lt;/span&gt;&lt;span class='nv'&gt;_&lt;/span&gt; &lt;span class='nv'&gt;representation&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
             &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;find-acceptable&lt;/span&gt; &lt;span class='nv'&gt;accepts-list&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;representations&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;representation&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;method&lt;/span&gt; &lt;span class='nv'&gt;resource&lt;/span&gt; &lt;span class='nv'&gt;request&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
      &lt;span class='nv'&gt;:not-acceptable&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is a fairly generic implementation, which throws away path parameter and accepted content type information, so probably isn&amp;#8217;t very useful for real world applications. We&amp;#8217;ll address this later, as we specialize on Ring based applications.&lt;/p&gt;

&lt;h3 id='next_sweetness_and_light'&gt;Next: Sweetness and Light&lt;/h3&gt;

&lt;p&gt;Writing out the simplest code possible to capture this abstraction was definitely a good exercise, but it left us with an API that isn&amp;#8217;t very fun to use and does more work at request time than it really needs to. In our next installment we&amp;#8217;ll layer on some sugar to make it easier to use these abstractions. We&amp;#8217;ll also suck out some of the fat in the request processing path, and add some new functions specifically for working with Ring.&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>Clojure++</title>
   <link href="http://combinate.us/clojure/2010/09/27/clojure/" />
   <updated>2010-09-27T00:00:00+00:00</updated>
   <id>http://combinate.us//clojure/2010/09/27/clojure</id>
   <content type="html">&lt;p&gt;I was lucky enough to be able to make it to San Francisco last week, not for &lt;a href='http://www.oracle.com/us/javaonedevelop/index.html'&gt;you know what&lt;/a&gt; (who has two grand?), but to see coworkers and friends. It sure didn&amp;#8217;t hurt that JavaOne brought a lot of talent into the area, and I took advantage of that by attending Rich Hickey&amp;#8217;s talk at the &lt;a href='http://www.meetup.com/The-Bay-Area-Clojure-User-Group/calendar/14119983/'&gt;special edition&lt;/a&gt; of the Bay Area Clojure User Group meetup. As &lt;a href='http://twitter.com/seancorfield'&gt;Sean Corfield&lt;/a&gt; notes in the meetup feedback, the talk was both &amp;#8220;entertaining and thought provoking,&amp;#8221; which I think is about all you can ask of a talk about language internals.&lt;/p&gt;

&lt;p&gt;The big takeaway, I&amp;#8217;d say, is that Rich is interested in making Clojure a language that runs code like the stuff &lt;a href='http://www.weatherbill.com'&gt;we&lt;/a&gt; write run really damn fast. At the moment, he&amp;#8217;s working on &lt;a href='http://www.assembla.com/wiki/show/clojure/Enhanced_Primitive_Support'&gt;static linking and enhanced primitive support&lt;/a&gt;, which looks like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;fib&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;if &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;&amp;lt;= &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='mi'&gt;1&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;fib&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;dec &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;fib&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;time &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;fib&lt;/span&gt; &lt;span class='mi'&gt;38&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 3565.579 msecs&amp;quot;&lt;/span&gt;

&lt;span class='c1'&gt;;; hint arg and return&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;^:static&lt;/span&gt; &lt;span class='nv'&gt;fib&lt;/span&gt; &lt;span class='nv'&gt;^long&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;^long&lt;/span&gt; &lt;span class='nv'&gt;n&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;if &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;&amp;lt;= &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='mi'&gt;1&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;fib&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;dec &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;fib&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;time &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;fib&lt;/span&gt; &lt;span class='mi'&gt;38&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;span class='s'&gt;&amp;quot;Elapsed time: 395.365 msecs&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s right: add a few annotations to the method signature, and get 9x performance. Thanks to Clojure&amp;#8217;s autoboxing and promotion of &lt;code&gt;int&lt;/code&gt;s to &lt;code&gt;long&lt;/code&gt;s, this works for just about any values you&amp;#8217;d want to use here.&lt;/p&gt;

&lt;p&gt;There is one exception, and it was an important part of what Rich had to say last Monday: this function, and most numeric functions in Clojure, will no longer auto-promote values to &lt;code&gt;Big&lt;/code&gt; numbers to avoid overflowing &lt;code&gt;long&lt;/code&gt;s and &lt;code&gt;double&lt;/code&gt;s. This is already &lt;a href='http://groups.google.com/group/clojure/browse_thread/thread/c8c850595c91cc11/8a4eee5ac4eab3f9?lnk=gst&amp;amp;q=autopromotion#8a4eee5ac4eab3f9'&gt;somewhat controversial&lt;/a&gt;, and will no doubt remain so, but Rich did a good job of explaining its necessity as a workaround for the JVM&amp;#8217;s inability to handle values that might be objects or primitives. Inconveniencing legitimate consumers of arbitrary precision math (you know who you are!) to make everyone else happier is a tradeoff that makes sense to me.&lt;/p&gt;

&lt;p&gt;The vision behind this work is the enablement of functional patterns with bare metal performance - &lt;code&gt;map&lt;/code&gt;ping a statically linked function over an array of primitives should be no slower than a corresponding imperative loop. Performance of idiomatic code will be a feature of Clojure, which is pretty uncommon.&lt;/p&gt;

&lt;p&gt;Rich&amp;#8217;s presentation and the gaggle of smart people asking questions yielded many other gems throughout the night. Clojure seems to be on course for a solid amount of additional development. Parallelism will be improved via fork/join and some cleanup of &lt;code&gt;binding&lt;/code&gt; semantics. Pods - more on these after &lt;a href='http://clojure-conj.org/'&gt;Clojure Conj&lt;/a&gt; - will help bring side-effect laden Java code into the fold in a clean way. Clojure&amp;#8217;s Java underpinnings will eventually move to Clojure, and provide a much more solid foundation for tooling along with them. These changes will largely be &amp;#8220;additions&amp;#8221; to the language or entirely transparent, unlike some of the important changes to semantics slated for the near future.&lt;/p&gt;

&lt;p&gt;This, I think, is probably going to be the story of Clojure - the language - from here on out. Don&amp;#8217;t expect an &lt;a href='http://www.erlang.org/doc/reference_manual/processes.html#id77960'&gt;actor model&lt;/a&gt; or an &lt;a href='http://en.wikipedia.org/wiki/Common_Lisp_Object_System'&gt;object system&lt;/a&gt; from the core implementation (&lt;a href='http://clojure.org/macros'&gt;add them&lt;/a&gt; if you really want them!). Do expect a healthy community of interesting, performant libraries and a language that will continue to take whatever steps are necessary to replace Java in your day to day life: this is the clear goal of its creator.&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>Bundler</title>
   <link href="http://combinate.us/ruby/bundler/2010/09/25/bundler/" />
   <updated>2010-09-25T00:00:00+00:00</updated>
   <id>http://combinate.us//ruby/bundler/2010/09/25/bundler</id>
   <content type="html">&lt;p&gt;Being a warning about an excellent dependency management tool:&lt;/p&gt;

&lt;p&gt;The release of &lt;a href='http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done'&gt;Rails 3&lt;/a&gt; ushered in a new era of gem management for Rails developers in the form of &lt;a href='http://gembundler.com/'&gt;Bundler&lt;/a&gt;. This is a very good thing, since a) the previous state of affairs was pretty painful and b) Bundler is a shining example of the kind of great tooling the Ruby community &lt;a href='http://www.capistranorb.com/'&gt;does&lt;/a&gt; &lt;a href='http://cukes.info/'&gt;so&lt;/a&gt; &lt;a href='http://rake.rubyforge.org/'&gt;well&lt;/a&gt;. It&amp;#8217;s not just good for Rails 3 developers either: &lt;code&gt;Gemfile&lt;/code&gt;s can suck in dependencies from &lt;code&gt;.gemspec&lt;/code&gt;s, and Bundler can &lt;a href='http://gembundler.com/rails23.html'&gt;easily be used with legacy Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Of course there are warts, and while Bundler&amp;#8217;s are pretty minor, that didn&amp;#8217;t stop them from eating half my week. One of Bundler&amp;#8217;s neat features is the ability to specify a git repository for a particular gem. Instead of looking in gem repositories for the gem, &lt;code&gt;bundle install&lt;/code&gt; will check the repository out, look for a &lt;code&gt;.gemspec&lt;/code&gt;, and put the code in the right place. This is a nice way to track private gems that change frequently without the overhead of picking version numbers and shipping releases. As of Bundler 1.0, however, there&amp;#8217;s no way to use &lt;code&gt;bundler package&lt;/code&gt; to pack a gem specified this way into a local package cache. This means that when you run &lt;code&gt;bundle
install&lt;/code&gt; on your production machine it has to be able to talk to the development git repository - at best, inconvenient, and at worst, entirely infeasible. The solution for us, for now, was to include our dependency as a vendored, submoduled plugin, and just include third party dependencies in our &lt;code&gt;Gemfile&lt;/code&gt;. This forces us to include all of the plugin&amp;#8217;s dependencies in the top level &lt;code&gt;Gemfile&lt;/code&gt;, and isn&amp;#8217;t at all ideal, but it does the job for now.&lt;/p&gt;

&lt;p&gt;The takeaway is that if the workflow you are planning to implement using bundler needs to use &lt;code&gt;bundle package&lt;/code&gt; and &lt;code&gt;:git&lt;/code&gt; sources together, you&amp;#8217;re out of luck for now. Happily, this wart is &lt;a href='http://github.com/carlhuda/bundler/issues/labels/1.1#issue/67'&gt;slated for removal&lt;/a&gt; in version 1.1, here&amp;#8217;s hoping it ships early!&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>π in Clojure</title>
   <link href="http://combinate.us/2010/02/09/pi-in-clojure/" />
   <updated>2010-02-09T00:00:00+00:00</updated>
   <id>http://combinate.us//2010/02/09/pi-in-clojure</id>
   <content type="html">&lt;div class='sidebar'&gt;&lt;span style='font-size: 30em'&gt;π&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;After reading Carl Sagan&amp;#8217;s &lt;a href='http://www.amazon.com/gp/product/0671004107/'&gt;Contact&lt;/a&gt; I&amp;#8217;m crushing on π, so I looked it up on Wikipedia, where, of course, several algorithms for computing it are described in detail. One of them, the Brent-Salamin algorithm, has the really neat property of doubling the number of digits it gets right on each iteration.&lt;/p&gt;

&lt;p&gt;The algorithm starts with four terms (images ripped from &lt;a href='http://en.wikipedia.org/wiki/Pi'&gt;Wikipedia&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/pi-bs-init.png' alt='Brent-Salamin initial values' /&gt;&lt;/p&gt;

&lt;p&gt;And then iterates on them like:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/pi-bs-iterate-1.png' alt='Brent-Salamin iterations' /&gt; &lt;img src='/images/pi-bs-iterate-2.png' alt='Brent-Salamin iterations' /&gt;&lt;/p&gt;

&lt;p&gt;Whenever you get tired of iterating, you can just plug the latest versions of the terms into:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/pi-bs-pi.png' alt='Brent-Salamin π' /&gt;&lt;/p&gt;

&lt;p&gt;In Clojure, we&amp;#8217;ll start by defining a function to do the heavy lifting:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;compute terms of the the Brent-Salamin algorithm&amp;quot;&lt;/span&gt;
    &lt;span class='p'&gt;[])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We&amp;#8217;ll want two versions of this function, one that will be called with no arguments, to get the initial values of the parameters:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;  &lt;span class='p'&gt;([]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqrt&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And a second which will implement a single iteration of the algorithm:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;  &lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
     &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
           &lt;span class='nv'&gt;B&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqrt&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
           &lt;span class='nv'&gt;T&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;p&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqr&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;A&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
           &lt;span class='nv'&gt;P&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
       &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='nv'&gt;B&lt;/span&gt; &lt;span class='nv'&gt;T&lt;/span&gt; &lt;span class='nv'&gt;P&lt;/span&gt;&lt;span class='p'&gt;])))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Finally, we&amp;#8217;ll define a short function to calculate π given Brent-Salamin terms:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-pi&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='nv'&gt;_&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqr&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mi'&gt;4&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;For idiomatic access to the values generated by this algorithm, we&amp;#8217;ll define a lazy sequence:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-terms&lt;/span&gt;
     &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;iterate &lt;/span&gt;&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;apply&lt;/span&gt; &lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt; &lt;span class='nv'&gt;%&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;brent-salamin-term&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And another for the values of π:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;def &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-pis&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='o'&gt;#&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;apply&lt;/span&gt; &lt;span class='nv'&gt;brent-salamin-pi&lt;/span&gt; &lt;span class='nv'&gt;%&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;brent-salamin-terms&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Things look pretty good:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;take &lt;/span&gt;&lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='nv'&gt;brent-salamin-pis&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;2.914213562373095&lt;/span&gt; &lt;span class='mf'&gt;3.1405792505221686&lt;/span&gt; &lt;span class='mf'&gt;3.141592646213543&lt;/span&gt;
 &lt;span class='mf'&gt;3.141592653589794&lt;/span&gt; &lt;span class='mf'&gt;3.141592653589794&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;But wait - we should probably be careful with precision. Ideally, I&amp;#8217;d like to be able to get an arbitrarily precise version of π. Let&amp;#8217;s take a look at what kind of numeric types we&amp;#8217;re dealing with by printing the class of the inputs to our terms algorithm:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;prn &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;class &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;prn &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;class &lt;/span&gt;&lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;prn &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;class &lt;/span&gt;&lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;prn &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;class &lt;/span&gt;&lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
         &lt;span class='nv'&gt;B&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqrt&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
         &lt;span class='nv'&gt;T&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;p&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqr&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;A&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
         &lt;span class='nv'&gt;P&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
     &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='nv'&gt;B&lt;/span&gt; &lt;span class='nv'&gt;T&lt;/span&gt; &lt;span class='nv'&gt;P&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt;
             &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;brent-salamin-term&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Integer&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;clojure&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Ratio&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Integer&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Integer&lt;/span&gt;
&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mf'&gt;0.8472249029234942&lt;/span&gt; &lt;span class='mf'&gt;0.8472012667468914&lt;/span&gt; &lt;span class='mf'&gt;0.22847329108090064&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Ugh - what a mess. We start off with integers in the first iteration, and move quickly to doubles. That&amp;#8217;s fine for the real world, where according to Wikipedia &amp;#8220;a physicist needs only 39 digits of Pi to make a circle the size of the observable universe accurate to one atom of hydrogen,&amp;#8221; but we&amp;#8217;re trying for gold here. Let&amp;#8217;s start by using &lt;code&gt;BigDecimal&lt;/code&gt;s wherever we can (see sidebar).&lt;/p&gt;
&lt;div class='sidebar' style='float: right;'&gt;
&lt;i&gt;Brent-Salamin using BigInteger&lt;/i&gt;

&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt;
  &lt;span class='p'&gt;([]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqrt&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
  &lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
     &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
           &lt;span class='nv'&gt;B&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqrt&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
           &lt;span class='nv'&gt;T&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='nv'&gt;p&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqr&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;- &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;A&lt;/span&gt;&lt;span class='p'&gt;))))&lt;/span&gt;
           &lt;span class='nv'&gt;P&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='nv'&gt;p&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
       &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='nv'&gt;B&lt;/span&gt; &lt;span class='nv'&gt;T&lt;/span&gt; &lt;span class='nv'&gt;P&lt;/span&gt;&lt;span class='p'&gt;])))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-pi&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt; &lt;span class='nv'&gt;_&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;sqr&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='nv'&gt;a&lt;/span&gt; &lt;span class='nv'&gt;b&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;* &lt;/span&gt;&lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;

&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt;
             &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt;
                    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;brent-salamin-term&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;math&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;BigDecimal&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;math&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;BigDecimal&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;math&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;BigDecimal&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;Double&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;math&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;BigDecimal&lt;/span&gt;
&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mf'&gt;0.8472249029234942&lt;/span&gt; &lt;span class='mf'&gt;0.8472012667468914&lt;/span&gt;
 &lt;span class='mf'&gt;0.22847329108090064&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;p&gt;This is better thanks to Clojure&amp;#8217;s smart arithmetic operators - if they receive a &lt;code&gt;BigDecimal&lt;/code&gt; they&amp;#8217;ll do &lt;code&gt;BigDecimal&lt;/code&gt; operations - but there&amp;#8217;s still a problem in our &lt;code&gt;sqrt&lt;/code&gt; function. Unfortunately, Java doesn&amp;#8217;t give us a &lt;code&gt;BigDecimal&lt;/code&gt; square root function out of the box, so we&amp;#8217;ll have to roll our own. Michael Gilleland at Merriam Park Software explains Heron&amp;#8217;s method in &lt;a href='http://www.merriampark.com/bigsqrt.htm'&gt;Big Square Roots&lt;/a&gt;, and while the Java implementation leaves something to be desired, a basic Clojure implementation is actually quite nice:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;sqrt&lt;/span&gt;
  &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;loop &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='nv'&gt;g&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;let &lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;next-guess&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;+ &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;/ &lt;/span&gt;&lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='nv'&gt;g&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;g&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
      &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;if &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;= &lt;/span&gt;&lt;span class='nv'&gt;g&lt;/span&gt; &lt;span class='nv'&gt;next-guess&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nv'&gt;g&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;recur&lt;/span&gt; &lt;span class='nv'&gt;n&lt;/span&gt; &lt;span class='nv'&gt;next-guess&lt;/span&gt;&lt;span class='p'&gt;)))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That is, until we compile the file, at which point everything explodes!&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;error:&lt;/span&gt; &lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;ArithmeticException:&lt;/span&gt; &lt;span class='nv'&gt;Non-terminating&lt;/span&gt; &lt;span class='nv'&gt;decimal&lt;/span&gt; &lt;span class='nv'&gt;expansion&lt;/span&gt;&lt;span class='c1'&gt;;&lt;/span&gt;
 &lt;span class='nv'&gt;no&lt;/span&gt; &lt;span class='nv'&gt;exact&lt;/span&gt; &lt;span class='nv'&gt;representable&lt;/span&gt; &lt;span class='nv'&gt;decimal&lt;/span&gt; &lt;span class='nv'&gt;result&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The problem here is that we haven&amp;#8217;t specified a precision for the &lt;code&gt;BigInteger&lt;/code&gt; operations that happen when we create our lazy sequences at compile time, and indeed, we don&amp;#8217;t want to. Instead, we&amp;#8217;ll make them into functions so that callers can choose whatever precision they want when they are created. This gets everything compiling, and we jump over to the REPL to give it a whirl:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;with-precision&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;take &lt;/span&gt;&lt;span class='mi'&gt;10&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;etc/brent-salamin-pis&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='nv'&gt;java&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;lang&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nv'&gt;ArithmeticException:&lt;/span&gt; &lt;span class='nv'&gt;Non-terminating&lt;/span&gt; &lt;span class='nv'&gt;decimal&lt;/span&gt; &lt;span class='nv'&gt;expansion&lt;/span&gt;&lt;span class='c1'&gt;;&lt;/span&gt;
  &lt;span class='nv'&gt;no&lt;/span&gt; &lt;span class='nv'&gt;exact&lt;/span&gt; &lt;span class='nv'&gt;representable&lt;/span&gt; &lt;span class='nv'&gt;decimal&lt;/span&gt; &lt;span class='nv'&gt;result&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The problem (and it&amp;#8217;s the last one, I promise!) is that &lt;code&gt;with-precision&lt;/code&gt; creates a thread local binding which isn&amp;#8217;t available when the lazy sequence is realized later on. Fortunately, Clojure 1.1 includes a handy function for just this purpose, &lt;code&gt;bound-fn&lt;/code&gt;. &lt;code&gt;bound-fn&lt;/code&gt; creates a function that carries thread local bindings along into whatever context it is evaluated.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-terms&lt;/span&gt;
  &lt;span class='p'&gt;[]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;iterate &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;bound-fn&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-term&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;brent-salamin-term&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;

&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;defn &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-pis&lt;/span&gt;
  &lt;span class='p'&gt;[]&lt;/span&gt;
  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;map &lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;bound-fn&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;apply &lt;/span&gt;&lt;span class='nv'&gt;brent-salamin-pi&lt;/span&gt; &lt;span class='nv'&gt;t&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;brent-salamin-terms&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Finally - success!&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='clj'&gt;&lt;span class='nv'&gt;user&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;with-precision&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;take &lt;/span&gt;&lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;etc/brent-salamin-pis&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;2.914213562&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='mf'&gt;3.140579251&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='mf'&gt;3.141592648&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='mf'&gt;3.141592656&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt; &lt;span class='mf'&gt;3.141592656&lt;/span&gt;&lt;span class='nv'&gt;M&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This turned into a bit of a slog at the end, but only when we started caring quite a bit about precision. The default behavior of the language leads to very elegant code organized around lazy sequences that will work in almost all real world applications, and that seems like a major win.&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
 <entry>
   <title>Colophon</title>
   <link href="http://combinate.us/web/tech/emacs/2010/01/08/colophon/" />
   <updated>2010-01-08T00:00:00+00:00</updated>
   <id>http://combinate.us//web/tech/emacs/2010/01/08/colophon</id>
   <content type="html">&lt;p&gt;Unless you&amp;#8217;re a web publishing nerd, you should probably stop reading here.&lt;/p&gt;

&lt;p&gt;Back in &lt;a href='http://www.williams.edu'&gt;college&lt;/a&gt; I wrote an awful lot - one of the advantages of a liberal arts education - but since then I&amp;#8217;ve fallen woefully out of practice. I&amp;#8217;m pretty sure at least part of the problem is the unpleasant experience that is composing thoughts in WordPress, and my previous attempts to hack together an emacs2WordPress workflow just haven&amp;#8217;t panned out.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m happy to report, then, that I&amp;#8217;m preliminarily very excited about &lt;a href='http://github.com/mojombo/jekyll'&gt;Jekyll&lt;/a&gt;, a &amp;#8220;blog aware static content generator&amp;#8221; written by one of the GitHub guys. Static content generation is certainly nothing new, but the implementation is slick, and some simple Rakefile hacks and git orchestration makes the whole thing really smooth.&lt;/p&gt;

&lt;p&gt;So now, writing moves from snippets collected in org files, OmniFocus notes and emacs buffers to Markdown formatted files in my Jekyll tree, and finally gets pushed via Git to a repository on my server, where a post-receive hook runs runs Jekyll. Jekyll works its magic and dumps the results into a directory served by httpd, and that&amp;#8217;s what you see. This seems to work pretty well, and lets me keep my text editing where I like it, in emacs. Some &lt;a href='http://github.com/metajack/jekyll/blob/master/emacs/jekyll.el'&gt;handy Jekyll editing functions&lt;/a&gt; from &lt;s&gt;Alex Payne&lt;/s&gt; &lt;a href='http://github.com/metajack'&gt;metajack&lt;/a&gt; help tie things together.&lt;/p&gt;

&lt;p&gt;I originally wanted to take advantage of GitHub&amp;#8217;s free hosting of Jekyll sites, but ended up wanting a bit more flexibility than they currently provide, mainly around feed generation and serving.&lt;/p&gt;

&lt;p&gt;To celebrate the occasion, and just in time for the start of the work year, I&amp;#8217;ve also started publishing at a different URL. The luxury of an unusual name keeps me at the top of &amp;#8221;&lt;a href='http://www.google.com?q=travis+vachon'&gt;g&amp;#160;travis&amp;#160;vachon&lt;/a&gt;&amp;#8221;, so I don&amp;#8217;t feel bad about going with something a little more fanciful. &lt;code&gt;combinate&lt;/code&gt; is nice and succinct and captures a lot of what I like in the world and technology in particular and, most importantly, wasn&amp;#8217;t taken.&lt;/p&gt;

&lt;p&gt;So, Happy New Year, and here&amp;#8217;s to writing more.&lt;/p&gt;</content>
   <author>
     <name>Travis Vachon</name>
     <uri>http://combinate.us/about.html</uri>
   </author>
 </entry>
 
</feed>
