<?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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Jake McCrary]]></title>
  
  <link href="http://jakemccrary.com/" />
  <updated>2012-01-02T10:23:25-06:00</updated>
  <id>http://jakemccrary.com/</id>
  <author>
    <name><![CDATA[Jake McCrary]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/JakeMccrarysMusings" /><feedburner:info uri="jakemccrarysmusings" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Reflections on Stanford's online class experiment]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/vD8L45lDsas/" />
    <updated>2011-12-29T18:42:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2011/12/29/reflections-on-stanfords-online-class-experiment</id>
    <content type="html">&lt;p&gt;This past fall I took part in Stanford&amp;#8217;s online learning experiment. For those of you who are not aware, Stanford gave anyone with Internet access the opportunity to enroll in three different online courses. This was free of charge, not even books were required. Each was an introductory level class, with the three subjects being &lt;a href="http://ai-class.com"&gt;artificial intelligence&lt;/a&gt;, &lt;a href="http://ml-class.org"&gt;machine learning&lt;/a&gt;, and &lt;a href="http://db-class.org"&gt;databases&lt;/a&gt; (links may die as offered classes change). As far as I know, this was the first time that lecture videos have been paired with scheduled homework, quizzes, and programming assignments at this scale. I only vaguely remember numbers for the AI (artificial intelligence) and ML (machine learning) classes but I believe before classes began there were greater than 100,000 students enrolled apiece. The number of active students was approximately a third of the enrolled number. Even still, this is teaching at an unheard of scale.&lt;/p&gt;

&lt;p&gt;I enrolled in both the AI and ML courses. Enrolling in two was more work, but I&amp;#8217;m glad I did it. The classes followed slightly different formats and taking both provided a perspective in what style worked better for me.&lt;/p&gt;

&lt;h3&gt;AI Class&lt;/h3&gt;

&lt;p&gt;The AI class had video lectures, in video quizzes, homework, and two exams. The videos for this class were short. Each video lasted approximately one to four minutes. This was a nice length as you could easily go back and pick out specific topics to re-watch without jumping around a longer video. The videos showed the professor hand writing notes on pieces of paper. This style made it seem like you were receiving one-on-one tutoring.&lt;/p&gt;

&lt;p&gt;At the end of some of the videos a quiz question was asked. These questions did not count towards your final grade. They existed to help you think and learn about the material as it was being presented.&lt;/p&gt;

&lt;p&gt;The homework usually consisted of a fewer than 10 questions. You had until the due date to submit or change your answers. You did not get any feedback on the homework until it was graded.&lt;/p&gt;

&lt;p&gt;For both of the exams you had about three days to finish the 15 or so questions that were asked.&lt;/p&gt;

&lt;h3&gt;ML Class&lt;/h3&gt;

&lt;p&gt;The ML class had video lectures, in video quizzes, homework, and programming assignments. In contrast to the AI class, the ML video lectures were usually five to thirteen minutes long. This made it harder to re-watch specific parts as you had to jump around the video to find different topics. On the plus side, the ML videos could be easily downloaded and watched on any device (you could not do this with the AI lectures). The ML videos also had controls for speeding up playback. I watched the vast majority of the videos at 1.5 times the normal speed.&lt;/p&gt;

&lt;p&gt;The video questions for the ML class were similar to the AI class in that they didn&amp;#8217;t count towards a final grade and there was usually a max of one per video. Because of the fewer number of videos, there were fewer quizzes than in the AI class. More quizzes would be good, as it forces the student to think instead of simply zoning out while watching the lectures.&lt;/p&gt;

&lt;p&gt;The homework in the ML class was different from the AI class in a couple of ways. The largest difference was that you received feedback immediately when you submitted your answers. You were allowed to attempt the homework as often as you liked and your highest score became your score for that assignment. The questions were somewhat different between different attempts to minimize memorization of answers. There was also a minimum waiting period of ten minutes between attempts, but in order to reduce reliance on simply remembering previous attempts I usually waited a few hours to a day between attempts.&lt;/p&gt;

&lt;p&gt;The ML class had programming assignments. In these exercises you filled in some &lt;a href="http://www.gnu.org/software/octave/"&gt;Octave&lt;/a&gt; code to implement an aspect of machine learning. These exercises where great. Most of the time they made you think about the techniques you were learning that week. It was also nice to get some hands-on experience solving sample machine learning problems. It was rewarding watching my simple spam filter flag email as spam. The programming exercises were best when they weren&amp;#8217;t simply a task in translating math to code.&lt;/p&gt;

&lt;h3&gt;Thoughts on the differences&lt;/h3&gt;

&lt;p&gt;I enjoyed the ML class homework style, instant feedback upon submission, better than the AI because it provided a quicker feedback cycle. Instead of submitting homework answers and waiting to review mistakes you were able to review instantly. I found this, and being able to repeat homework, to be more effective for learning than the single shot style of the AI class.&lt;/p&gt;

&lt;p&gt;I preferred the shortness of the AI lectures. It allowed for easier repetition of lectures and provided more opportunities for quizzes. I also preferred the handwritten style of the AI lectures. The ML lectures felt like I was back in a classroom watching a professor go through some power point slides, adding handwritten notes as the lecture progressed. That isn&amp;#8217;t very engaging. The one-on-one style of the AI lectures was more engaging.&lt;/p&gt;

&lt;p&gt;I enjoyed both the programming exercises of ML class and the exams in the AI class. Both added an interesting way of learning to their respective class.&lt;/p&gt;

&lt;h3&gt;Recommendations&lt;/h3&gt;

&lt;p&gt;If I were designing a course for myself, I found the short videos with many quiz questions style of lecturing to be the more effective style. I would offer homework in a fashion similar to the ML class. Submit as many times as you want, but with a minimum time between submissions. I would up that time to be at least one hour to minimize memorization of answers. My ideal class would also have both programming exercises and exams.&lt;/p&gt;

&lt;p&gt;Both classes had some student run question and answer boards (similar to &lt;a href="http://stackoverflow.com"&gt;stackoverflow&lt;/a&gt;). This was alright but I would look into adding a type of forum that is more suited towards discussions. A Q&amp;amp;A style board is not a great environment for having a discussion that is ordered by time. I think normal forums style with replies ordered by time would be effective and worth an experiment.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;I greatly enjoyed taking these two Stanford classes. I think online lectures and homework were an extremely effective way of delivering information and reinforcing learning. I found taking these two classes to be a manageable amount of work. I did pretty much stop reading books while taking these classes and instead focused on watching lectures and doing homework. Had I only taken one class or spent breaks at work watching videos, I think I would have been able to maintain my other activities while taking these classes.&lt;/p&gt;

&lt;p&gt;There are quite a few classes being offered at Stanford that start in the near future. Scroll to the bottom of &lt;a href="http://www.ml-class.org/course/auth/index"&gt;this&lt;/a&gt; page to take a look at what Stanford is offering starting in January. I would highly recommend taking a class. MIT also just announced &lt;a href="http://web.mit.edu/newsoffice/2011/mitx-education-initiative-1219.html"&gt;MITx&lt;/a&gt;. I haven&amp;#8217;t heard a ton of information about it, but it sounds similar and I look forward to its launch.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=vD8L45lDsas:Z3okEdrd6T0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=vD8L45lDsas:Z3okEdrd6T0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/vD8L45lDsas" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/12/29/reflections-on-stanfords-online-class-experiment/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Continuous testing with Clojure and expectations]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/ZU8vSmb9GG0/" />
    <updated>2011-12-16T09:30:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2011/12/16/continuous-testing-with-clojure-and-expectations</id>
    <content type="html">&lt;p&gt;I&amp;#8217;ve recently started using &lt;a href="http://jayfields.com/"&gt;Jay Fields&amp;#8217;&lt;/a&gt; Clojure testing library, &lt;a href="https://github.com/jaycfields/expectations"&gt;&lt;code&gt;expectations&lt;/code&gt;&lt;/a&gt;. I&amp;#8217;m not going to explain &lt;code&gt;expectations&lt;/code&gt;, Jay already did a great job on his &lt;a href="http://blog.jayfields.com/2011/11/clojure-expectations-introduction.html"&gt;blog&lt;/a&gt;, but I will quote its &lt;a href="https://github.com/jaycfields/expectations"&gt;Github&lt;/a&gt; page.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;expectations is a minimalist&amp;#8217;s testing framework&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The above quote is absolutely true, which is one of the major reasons I&amp;#8217;m liking &lt;code&gt;expectations&lt;/code&gt;. It hasn&amp;#8217;t been all sunshine though, when I first started using it I had a major problem. It slowed down my usual Clojure workflow.&lt;/p&gt;

&lt;p&gt;Up until this point I had stuck to using &lt;code&gt;clojure.test&lt;/code&gt;. Combined with emacs, slime, swank, and &lt;code&gt;clojure-test-mode&lt;/code&gt; I found the time between making a change to code and running tests to be minimal.&lt;/p&gt;

&lt;p&gt;When I switched to &lt;code&gt;expectations&lt;/code&gt; the time it took between making a code change and running tests increased. With &lt;code&gt;expectations&lt;/code&gt; I couldn&amp;#8217;t reevaluate my buffer to get the new tests in my repl environment. Doing so caused the new tests to be there along with the old tests. This meant I needed to switch to the command line to run my tests. This caused me to incur the startup costs of the jvm simply to run my expectations (tests). This was a huge cost compared to what I was used to before.&lt;/p&gt;

&lt;h2&gt;Introducing &lt;code&gt;lein-autoexpect&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;To fix my problem I wrote &lt;a href="https://github.com/jakemcc/lein-autoexpect"&gt;&lt;code&gt;lein-autoexpect&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;lein-autoexpect&lt;/code&gt; is a &lt;a href="https://github.com/technomancy/leiningen/"&gt;&lt;code&gt;Leiningen&lt;/code&gt;&lt;/a&gt; plugin that monitors a project&amp;#8217;s source and test directory and when a Clojure file changes it reloads the affected namespaces and runs all the expectations. Using this plugin my turn around time from modifying code to running all of my expectations is practically nothing. Without the cost of the jvm startup there is practically no time wasted between when code is saved and tests are run.&lt;/p&gt;

&lt;p&gt;To use &lt;code&gt;lein-autoexpect&lt;/code&gt; simply add &lt;code&gt;[lein-autoexpect "0.0.2"]&lt;/code&gt; to your &lt;code&gt;project.clj&lt;/code&gt; file and fetch the dependency. Then at the command line run &lt;code&gt;lein autoexpect&lt;/code&gt;. You&amp;#8217;ll see your tests run and then it will just hang there, eagerly waiting for code to change.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;lein autoexpect
&lt;/span&gt;&lt;span class='line'&gt;*********************************************
&lt;/span&gt;&lt;span class='line'&gt;*************** Running tests ***************
&lt;/span&gt;&lt;span class='line'&gt;Ran 3 tests containing 3 assertions in 16 msecs
&lt;/span&gt;&lt;span class='line'&gt;0 failures, 0 errors.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Next time you end up saving you&amp;#8217;ll see your tests run again and the following example output appears.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;*********************************************
&lt;/span&gt;&lt;span class='line'&gt;*************** Running tests ***************
&lt;/span&gt;&lt;span class='line'&gt;Ran 4 tests containing 4 assertions in 3 msecs
&lt;/span&gt;&lt;span class='line'&gt;0 failures, 0 errors.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;code&gt;lein-autoexpect&lt;/code&gt; tries to clearly delimit each test session with the banner made of &lt;code&gt;*&lt;/code&gt;. This helps keep different runs separate when scrolling through your terminal.&lt;/p&gt;

&lt;p&gt;This style of testing is called &lt;a href="http://blog.objectmentor.com/articles/2007/09/20/continuous-testing-explained"&gt;continuous testing&lt;/a&gt;. If you haven&amp;#8217;t tried it, I would highly recommend giving it a shot. Even just using it for the last few days changed how I think testing should be done.&lt;/p&gt;

&lt;p&gt;Source can be found on &lt;a href="https://github.com/jakemcc/lein-autoexpect"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=ZU8vSmb9GG0:akGOvw7_az8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=ZU8vSmb9GG0:akGOvw7_az8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/ZU8vSmb9GG0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/12/16/continuous-testing-with-clojure-and-expectations/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Utilities I like: autojump]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/1lVPQNL93sE/" />
    <updated>2011-07-25T00:00:00-05:00</updated>
    <id>http://jakemccrary.com/blog/2011/07/25/utilities-i-like-autojump</id>
    <content type="html">&lt;p&gt;&lt;a href="https://github.com/joelthelion/autojump"&gt;autojump&lt;/a&gt; is a nifty command line tool that enables quicker jumping between directories. I&amp;#8217;ve been using it for a few months now and miss it when I work other machines.&lt;/p&gt;

&lt;p&gt;To jump to a directory you type &lt;code&gt;j SUBSTRING_OF_DIR&lt;/code&gt;. Example:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;/Users/jmccrary
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;j jake
&lt;/span&gt;&lt;span class='line'&gt;/Users/jmccrary/src/github/jakemcc/jakemccrary.com
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;/Users/jmccrary/src/github/jakemcc/jakemccrary.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Above I jumped from my home directory to the root of this website&amp;#8217;s code. Being able to jump between directories by just remembering a name (or part of a name) is great. This frees me from having to remember full paths or set up aliases.&lt;/p&gt;

&lt;p&gt;autojump works by keeping a database of &amp;#8220;time&amp;#8221; spent in directories and jumps to the most frequently visited one that match &lt;code&gt;SUBSTRING_OF_DIR&lt;/code&gt;. If you are curious as to what that database looks like the tool &lt;code&gt;jumpstat&lt;/code&gt; will give you a view.&lt;/p&gt;

&lt;p&gt;I used to set up aliases for jumping between projects but now that I&amp;#8217;ve trained myself to use autojump I don&amp;#8217;t think I&amp;#8217;ll ever go back. Not having to do any extra work besides simply entering the root directory of new projects to setup efficient directory movement is great. I think that if you give it a shot for a while you&amp;#8217;ll find the same benefits.&lt;/p&gt;

&lt;p&gt;If you are on a Mac and use &lt;a href="https://github.com/mxcl/homebrew"&gt;homebrew&lt;/a&gt; you can install by doing &lt;code&gt;brew install autojump&lt;/code&gt;. For other platforms check out the &lt;a href="https://github.com/joelthelion/autojump"&gt;github&lt;/a&gt; page.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=1lVPQNL93sE:9DD0Nwkn_GQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=1lVPQNL93sE:9DD0Nwkn_GQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/1lVPQNL93sE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/07/25/utilities-i-like-autojump/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[A simple way of testing disconnect logic]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/FHHMNUjki4M/" />
    <updated>2011-06-28T00:00:00-05:00</updated>
    <id>http://jakemccrary.com/blog/2011/06/28/a-simple-way-of-testing-disconnect-logic</id>
    <content type="html">&lt;p&gt;I&amp;#8217;m guessing that software you write connects to some other server. I&amp;#8217;m also guessing that how it handles disconnects is tested (if ever tested) by either killing the process it connects to or by pulling out your network cable. I recently stumbled across a nifty Linux command line tool that makes causing disconnects significantly easier.&lt;/p&gt;

&lt;p&gt;This tool is &lt;a href="http://linux.die.net/man/8/tcpkill"&gt;tcpkill&lt;/a&gt;. To use &lt;code&gt;tcpkill&lt;/code&gt; you specify an interface and a &lt;a href="http://linux.die.net/man/8/tcpdump"&gt;tcpdump&lt;/a&gt; style filter and it kills traffic on that interface that matches the filter.&lt;/p&gt;

&lt;p&gt;For example, if your application has a connection to 192.168.1.130, then to force a disconnect you would execute &lt;code&gt;tcpkill -i eth0 host 192.168.1.130&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tcpkill&lt;/code&gt; can be used for more than forcing disconnects. It can also be used as a simple website filter. If &lt;a href="http://stackoverflow.com"&gt;Stack Overflow&lt;/a&gt; wastes too much of your time then you could simply leave &lt;code&gt;tcpkill -i eth0 host stackoverflow.com&lt;/code&gt; running and enjoy your increased productivity.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tcpkill&lt;/code&gt; is a pretty useful tool. If you want to install it in Ubuntu it is found in the dsniff package (&lt;code&gt;apt-get install dsniff&lt;/code&gt;).&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=FHHMNUjki4M:ov7oq2KrYJI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=FHHMNUjki4M:ov7oq2KrYJI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/FHHMNUjki4M" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/06/28/a-simple-way-of-testing-disconnect-logic/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Command line arguments in Clojure]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/KL0LXzS05Rk/" />
    <updated>2011-04-12T20:00:00-05:00</updated>
    <id>http://jakemccrary.com/blog/2011/04/12/command-line-arguments-in-clojure</id>
    <content type="html">&lt;p&gt;&lt;em&gt;This post is now out of date. The library recommended by this post is now a contrib library. Check out &lt;a href="https://github.com/clojure/tools.cli"&gt;tools.cli&lt;/a&gt; for great documentation about handling command line arguments in Clojure.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Write enough Clojure and eventually you will need to handle command line arguments. There are numerous ways of doing this. Keep reading for a brief introduction to three.&lt;/p&gt;

&lt;h3&gt;Using built-in features&lt;/h3&gt;

&lt;p&gt;There exists a sequence named &lt;code&gt;*command-line-args*&lt;/code&gt; which contains the arguments to your application. Using it is simple, it is just a sequence after all, and it is always available to you. No need to pull in external dependencies that others may not be familiar with.&lt;/p&gt;

&lt;p&gt;This simplicity is also a downside. Because only a sequence is provided for you it is up to you to actually figure out the arguments. If you want to do any sort of verification that certain arguments are supplied you write the code that does the verifying. If you want to move away from positional arguments to using command line flags once again it is up to you to write it.&lt;/p&gt;

&lt;p&gt;Because of the amount of code required to do any sort of advanced argument handling I tend to use &lt;code&gt;*command-line-args*&lt;/code&gt; only for applications that take a single type of argument, for example a file path, and require one or more of this type of argument.&lt;/p&gt;

&lt;h3&gt;Setup for next two sections&lt;/h3&gt;

&lt;p&gt;For the next two sections I&amp;#8217;m using version 1.5.0 of Leiningen and the specified versions of libraries as stated in the below &lt;code&gt;project.clj&lt;/code&gt; file.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defproject&lt;/span&gt; &lt;span class="nv"&gt;blogpost&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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&gt;&lt;span class='line'&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&gt;&lt;span class='line'&gt;                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;clargon&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;1.0.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nv"&gt;:dev-dependencies&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;swank-clojure&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;1.2.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nv"&gt;:run-aliases&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:clargon&lt;/span&gt; &lt;span class="nv"&gt;clargon-example&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nv"&gt;:cc&lt;/span&gt; &lt;span class="nv"&gt;command-line-example&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I&amp;#8217;m using &lt;code&gt;lein run&lt;/code&gt; to run the examples. &lt;code&gt;lein run :cc&lt;/code&gt; runs the clojure.contrib example. Likewise, running &lt;code&gt;lein run :clargon&lt;/code&gt; will run the clargon examples. Both of these commands can be followed by additional arguments that get passed to the application.&lt;/p&gt;

&lt;h3&gt;Using clojure.contrib.command-line&lt;/h3&gt;

&lt;p&gt;The next step after using &lt;code&gt;*command-line-args*&lt;/code&gt; is to use the library &lt;code&gt;clojure.contrib.command-line&lt;/code&gt;. This library provides the function &lt;code&gt;with-command-line&lt;/code&gt; that allows you specify requirements and then handles the parsing of the command line arguments for you.&lt;/p&gt;

&lt;p&gt;Positives of using &lt;code&gt;clojure.contrib.command-line&lt;/code&gt;:
* Part of &lt;code&gt;clojure.contrib&lt;/code&gt;. Probably extremely low friction to start using it.
* No longer need to write your own command line parsing code.
* Responds to &lt;code&gt;-h&lt;/code&gt; and &lt;code&gt;--help&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A negative of using &lt;code&gt;clojure.contrib.command-line&lt;/code&gt; is that the documentation is pretty sparse. This can lead to some fumbling around as you learn how to use it. Another downside is that there isn&amp;#8217;t a way of specifying whether an argument is required or optional. This means you must manually check for required arguments and give appropriate error messages to the user.&lt;/p&gt;

&lt;p&gt;Below is an example of using &lt;code&gt;clojure.contrib.command-line&lt;/code&gt;. It specifies a few different arguments. The &lt;code&gt;--cow&lt;/code&gt; argument has a default value of &amp;#8220;cow&amp;#8221;. &lt;code&gt;--chicken&lt;/code&gt; has no default value, if it is left unspecified it will be &lt;code&gt;nil&lt;/code&gt;. The line with &lt;code&gt;milk?&lt;/code&gt; specifies a boolean value. If &lt;code&gt;--milk&lt;/code&gt; (or &lt;code&gt;-m&lt;/code&gt; because of the &lt;code&gt;m?&lt;/code&gt; specification) is specified at the command line then &lt;code&gt;milk?&lt;/code&gt; will be true. &lt;code&gt;extras&lt;/code&gt; will collect any additional arguments.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ns&lt;/span&gt; &lt;span class="nv"&gt;command-line-example&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:require&lt;/span&gt; &lt;span class="p"&gt;[&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;contrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;command-line&lt;/span&gt; &lt;span class="nv"&gt;:as&lt;/span&gt; &lt;span class="nv"&gt;ccl&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;-main&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&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ccl/with-command-line&lt;/span&gt; &lt;span class="nv"&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="s"&gt;&amp;quot;Command line demo&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;cow&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;This is the cows name&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;cow&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;chicken&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;This specifies the chickens name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;milk?&lt;/span&gt; &lt;span class="nv"&gt;m?&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Should you milk the cow?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="nv"&gt;extras&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cow&amp;#39;s name: &amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;cow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;chicken&amp;#39;s name: &amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;chicken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;milk?: &amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;milk?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;extra args: &amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;extras&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And here is an example of calling that &lt;code&gt;-main&lt;/code&gt; function from the repl.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;lein run :cc --cow Herb --milk other args
&lt;/span&gt;&lt;span class='line'&gt;cow&lt;span class="s1"&gt;&amp;#39;s name:  Herb&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s1"&gt;chicken&amp;#39;&lt;/span&gt;s name:  nil
&lt;/span&gt;&lt;span class='line'&gt;milk?:  &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;extra args:  &lt;span class="o"&gt;[&lt;/span&gt;other args&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Using some other library&lt;/h3&gt;

&lt;p&gt;Another option is to use some library that isn&amp;#8217;t found in &lt;code&gt;clojure.contrib&lt;/code&gt;. One example of this is &lt;a href="https://github.com/gar3thjon3s/clargon"&gt;clargon&lt;/a&gt;. Clargon is a library that &lt;a href="http://blog.gaz-jones.com/"&gt;Gaz Jones&lt;/a&gt; (his blog post &lt;a href="http://blog.gaz-jones.com/post/2528825514/command-line-applications-in-clojure"&gt;here&lt;/a&gt;) wrote. The documentation (both in his blog post and through the github page and tests) is the primary reason I started using it.&lt;/p&gt;

&lt;p&gt;Pros of clargon:
* Great documentation. Makes it quick to get started.
* Can specify functions to transform arguments prior to gaining access to them
* You specify if an argument is required or optional.
* Responds to &lt;code&gt;-h&lt;/code&gt; and &lt;code&gt;--help&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One potential negative of using clargon is that it isn&amp;#8217;t a &lt;code&gt;clojure.contrib&lt;/code&gt; library. This means there is slightly more friction to start using it on your project as, unlike &lt;code&gt;clojure.contrib&lt;/code&gt;, you are probably not already depending on it.&lt;/p&gt;

&lt;p&gt;Below is an example similar to the above &lt;code&gt;clojure.contrib.command-line&lt;/code&gt; example. One important difference is that some arguments are now specified as either required or optional. If a required argument is not specified then an error is printed and execution stops.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ns&lt;/span&gt; &lt;span class="nv"&gt;clargon-example&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:require&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;clargon&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;:as&lt;/span&gt; &lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;-main&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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&gt;&lt;span class='line'&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;opts&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;c/clargon&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="nv"&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;c/optional&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--cow&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Specify the cow&amp;#39;s name&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;:default&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;cow&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;c/required&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--chicken&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Chicken&amp;#39;s name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;c/optional&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;-m?&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;--milk?&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;should you milk the cow?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;code&gt;optional&lt;/code&gt; and &lt;code&gt;required&lt;/code&gt; both take a vector that defines the specification of a flag. Starting with the first element in that vector, each element that is a string and starts with a &amp;#8216;-&amp;#8217; is considered a potential flag for that argument. The last flag is stripped of leading &amp;#8216;-&amp;#8217; characters and is considered the name of that flag (unless a &lt;code&gt;:name&lt;/code&gt; option is specified later). The name is used to look up the value of the argument in the option map that is returned by the &lt;code&gt;clargon&lt;/code&gt; function. If the next element after the last flag is a string then it is considered the documentation for that flag. When clargon runs into a non-string element then it and everything after it are considered options and should be specified as key value pairs. Options that do something are &lt;code&gt;:default&lt;/code&gt;, &lt;code&gt;:name&lt;/code&gt;, and &lt;code&gt;:required&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;optional&lt;/code&gt; and &lt;code&gt;required&lt;/code&gt; both can take a function as a second argument. This function will be passed the argument for that flag and should return a transformed version of it. Below is an example using this functionality to specify a required flag that takes a comma separated list of files. These comma separated files are split apart and stuck into a vector.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ns&lt;/span&gt; &lt;span class="nv"&gt;clargon-example&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:require&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;clargon&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;:as&lt;/span&gt; &lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;-main&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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&gt;&lt;span class='line'&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;opts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;c/clargon&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="nv"&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;c/required&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--files&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Files to process&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                          &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;split&lt;/span&gt; &lt;span class="nv"&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;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Parsed opts: &amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Below is the above example being ran.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;lein&lt;/span&gt; &lt;span class="nv"&gt;run&lt;/span&gt; &lt;span class="nv"&gt;:clargon&lt;/span&gt; &lt;span class="nv"&gt;--files&lt;/span&gt; &lt;span class="nv"&gt;one&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt,two&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt,three&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;Parsed&lt;/span&gt; &lt;span class="nv"&gt;opts:&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:files&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;one&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt&lt;/span&gt; &lt;span class="nv"&gt;two&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt&lt;/span&gt; &lt;span class="nv"&gt;three&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Clargon supports some more advanced nested argument handling that I&amp;#8217;m not going to go into here. If you want to know more about clargon I&amp;#8217;d recommend reading reading Gaz&amp;#8217;s &lt;a href="http://blog.gaz-jones.com/post/2528825514/command-line-applications-in-clojure"&gt;blog post&lt;/a&gt; and the &lt;a href="https://github.com/gar3thjon3s/clargon"&gt;clargon&lt;/a&gt; readme and tests.&lt;/p&gt;

&lt;h3&gt;End&lt;/h3&gt;

&lt;p&gt;There are many more ways to handle command line parsing in Clojure. You are not limited to any of the three above. I&amp;#8217;ve personally found clargon to hit all of my needs and plan on continuing to use it.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=KL0LXzS05Rk:q2yyHlnqR6w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=KL0LXzS05Rk:q2yyHlnqR6w:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/KL0LXzS05Rk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/04/12/command-line-arguments-in-clojure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Creating a SQL table with a composite primary key in Clojure]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/oGLFf68tXQo/" />
    <updated>2011-01-19T00:00:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2011/01/19/creating-sql-table-with-composite-key-in-clojure</id>
    <content type="html">&lt;p&gt;I was interacting with a SQL database using Clojure and needed to create a table so I turned to &lt;code&gt;create-table&lt;/code&gt; from &lt;a href="http://clojure.github.com/clojure-contrib/sql-api.html"&gt;clojure.contrib.sql&lt;/a&gt;. Looking at the &lt;a href="http://clojure.github.com/clojure-contrib/sql-api.html#clojure.contrib.sql/create-table"&gt;docs&lt;/a&gt; for &lt;code&gt;create-table&lt;/code&gt; it seemed pretty straight forward. To create a table with columns &lt;em&gt;date&lt;/em&gt;, &lt;em&gt;id&lt;/em&gt;, &lt;em&gt;symbol&lt;/em&gt;, &lt;em&gt;price&lt;/em&gt;, and &lt;em&gt;quantity&lt;/em&gt; you would write the following.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;create-table&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;orders&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:date&lt;/span&gt;     &lt;span class="s"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:id&lt;/span&gt;       &lt;span class="s"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:symbol&lt;/span&gt;   &lt;span class="s"&gt;&amp;quot;char(10)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:price&lt;/span&gt;    &lt;span class="s"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:quantity&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The above works. I also wanted to specify that columns &lt;em&gt;date&lt;/em&gt; and &lt;em&gt;id&lt;/em&gt; to form a composite primary key. I wasn&amp;#8217;t sure how to specify a composite primary key with &lt;code&gt;create-table&lt;/code&gt; and ended up diving into its &lt;a href="https://github.com/clojure/clojure-contrib/blob/b8d2743d3a89e13fc9deb2844ca2167b34aaa9b6/src/main/clojure/clojure/contrib/sql.clj#L103"&gt;code&lt;/a&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;create-table&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s"&gt;&amp;quot;Creates a table on the open database connection given a table name and&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;  specs. Each spec is either a column spec: a vector containing a column&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;  name and optionally a type and other constraints, or a table-level&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;  constraint: a vector containing words that express the constraint. All&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="s"&gt;  words used to describe the table may be supplied as strings or keywords.&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;name&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&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;do-commands&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;CREATE TABLE %s (%s)&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;as-str&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;str&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;as-str&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;concat&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interpose&lt;/span&gt; &lt;span class="p"&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;/span&gt;&lt;span class='line'&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;partial &lt;/span&gt;&lt;span class="nv"&gt;interpose&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;specs&lt;/span&gt;&lt;span class="p"&gt;))))))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Looking at &lt;code&gt;create-table&lt;/code&gt; we can see it creates a SQL statement which is then executed by &lt;code&gt;do-commands&lt;/code&gt;. In order to have a composite key we need &lt;code&gt;do-commands&lt;/code&gt; to execute a SQL statement that looks similar to below.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="nb"&gt;char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s break down &lt;code&gt;create-table&lt;/code&gt; to figure out what we need to pass it to make &lt;code&gt;do-commands&lt;/code&gt; run the above statement. The code for &lt;code&gt;create-table&lt;/code&gt; is repeated below with comments pointing out what step lines up the code.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;create-table&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;name&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&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;do-commands&lt;/span&gt;                                              &lt;span class="c1"&gt;; step 7&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;CREATE TABLE %s (%s)&amp;quot;&lt;/span&gt;                           &lt;span class="c1"&gt;; step 6&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;as-str&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;str&lt;/span&gt;                                       &lt;span class="c1"&gt;; step 5&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;as-str&lt;/span&gt;                                    &lt;span class="c1"&gt;; step 4&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;concat&lt;/span&gt;                                 &lt;span class="c1"&gt;; step 3&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interpose&lt;/span&gt; &lt;span class="p"&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;span class="c1"&gt;; step 2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;partial &lt;/span&gt;&lt;span class="nv"&gt;interpose&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;specs&lt;/span&gt;&lt;span class="p"&gt;))))))))&lt;/span&gt;  &lt;span class="c1"&gt;; step 1&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;ol&gt;
&lt;li&gt;First &lt;code&gt;create-table&lt;/code&gt; takes the sequences in &lt;code&gt;specs&lt;/code&gt; and puts a space between each element in each sequence.&lt;/li&gt;
&lt;li&gt;The result of step 1 then has a vector containing a comma and a space interposed between each element of it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;concat&lt;/code&gt; combined with &lt;code&gt;apply&lt;/code&gt; is used to combine each element of the result of step 2 into a single sequence.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;as-str&lt;/code&gt; (from &lt;a href="http://clojure.github.com/clojure-contrib/string-api.html#clojure.contrib.string/as-str"&gt;c.c.string&lt;/a&gt;) is mapped over the result of step 3 to make sure every element is a string.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;str&lt;/code&gt; is used to make one string out of the sequence of strings from step 4.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format&lt;/code&gt; is used to substitute in &lt;code&gt;name&lt;/code&gt; and the result of step 5 to create the SQL statement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;do-commands&lt;/code&gt; executes the statement created in step 6.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Knowing how &lt;code&gt;create-table&lt;/code&gt; works now allows us to specify the arguments that will create the orders table with the composite primary key of &lt;em&gt;date&lt;/em&gt; and &lt;em&gt;id&lt;/em&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;create-table&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;orders&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:date&lt;/span&gt;     &lt;span class="s"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:id&lt;/span&gt;       &lt;span class="s"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:symbol&lt;/span&gt;   &lt;span class="s"&gt;&amp;quot;char(10)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:price&lt;/span&gt;    &lt;span class="s"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:quantity&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;PRIMARY KEY&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;(date, id)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=oGLFf68tXQo:XXD9-Su_RXA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=oGLFf68tXQo:XXD9-Su_RXA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/oGLFf68tXQo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/01/19/creating-sql-table-with-composite-key-in-clojure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Generating test cases in Clojure]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/JcQd3fqA4EY/" />
    <updated>2011-01-18T00:00:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2011/01/18/generating-test-cases-in-clojure</id>
    <content type="html">&lt;p&gt;Recently I was writing some data mining Clojure code which needed to parse a log file and do some transforms of the data. Some of the transforms were dependent on data found across multiple lines. There was no ordering or proximity guarantees to these lines.&lt;/p&gt;

&lt;p&gt;This required the code to handle a variety of situations. After writing a couple simple tests and getting those passing I wanted to more extensively test my solution. I was lazy though and did not want to hand code all of the potential orderings.  Enter &lt;code&gt;permutations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;permutations&lt;/code&gt; is a function out of &lt;a href="http://clojure.github.com/clojure-contrib/combinatorics-api.html"&gt;clojure.contrib.combinatorics&lt;/a&gt;. As the name suggests, you give it a collection and it returns a lazy sequence containing all the different permutations of the elements in that collection. An example is below.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&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;ns&lt;/span&gt; &lt;span class="nv"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;generate&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;[&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;contrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;combinatorics&lt;/span&gt; &lt;span class="nv"&gt;:only&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;permutations&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;generate&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;permutations&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;:c&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;:a&lt;/span&gt; &lt;span class="nv"&gt;:b&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;:a&lt;/span&gt; &lt;span class="nv"&gt;:c&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;:b&lt;/span&gt; &lt;span class="nv"&gt;:a&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;:b&lt;/span&gt; &lt;span class="nv"&gt;:c&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="nf"&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;:c&lt;/span&gt; &lt;span class="nv"&gt;:b&lt;/span&gt; &lt;span class="nv"&gt;:a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You can already see where this is going. I was able to use &lt;code&gt;permutations&lt;/code&gt; to generate all the potential different orderings of the input. This saved me the trouble of having to do that by hand.&lt;/p&gt;

&lt;p&gt;One difficulty of generating test inputs pragmatically is telling what sort of inputs caused it to fail. To get around this I used the rarely used (at least in code I&amp;#8217;m working on) second argument of &lt;a href="http://clojure.github.com/clojure/clojure.test-api.html#clojure.test/is"&gt;clojure.test&amp;#8217;s&lt;/a&gt; &lt;code&gt;is&lt;/code&gt;. This second argument is a message that prints on a failure.&lt;/p&gt;

&lt;p&gt;Below is a contrived example of using &lt;code&gt;permutations&lt;/code&gt; to test an obviously wrong &lt;code&gt;silly-add&lt;/code&gt; function. &lt;code&gt;silly-add&lt;/code&gt; is defined below.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;generate&amp;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;silly-add&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;              &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;generate/silly-add&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Below is a test that uses &lt;code&gt;permutations&lt;/code&gt; to exercise &lt;code&gt;silly-add&lt;/code&gt; with all the potential orderings three input numbers. Note that it takes advantage of the second argument to &lt;code&gt;is&lt;/code&gt;. Without this we would not know what input caused the failure.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;generate&amp;gt;&lt;/span&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;clojure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;generate&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;deftest&lt;/span&gt; &lt;span class="nv"&gt;generate-some-tests&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;doseq &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;input&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;permutations&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;0&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="mi"&gt;10&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;silly-add&lt;/span&gt; &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Failed on input: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;&lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;generate/generate-some-tests&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Running the test we see that there is clearly an error.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;generate&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run-tests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;Testing&lt;/span&gt; &lt;span class="nv"&gt;generate&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;FAIL&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;generate-some-tests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;NO_SOURCE_FILE:1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;Failed&lt;/span&gt; &lt;span class="nv"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;input:&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;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;expected:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;= &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;apply &lt;/span&gt;&lt;span class="nv"&gt;silly-add&lt;/span&gt; &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nv"&gt;actual:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;= &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;FAIL&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;generate-some-tests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;NO_SOURCE_FILE:1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;Failed&lt;/span&gt; &lt;span class="nv"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;input:&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;9&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;expected:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;= &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;apply &lt;/span&gt;&lt;span class="nv"&gt;silly-add&lt;/span&gt; &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nv"&gt;actual:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;= &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;code&gt;permutations&lt;/code&gt; saved me a bit of time and let me test some situations that I otherwise would not have tested. This actually exposed a subtle bug in my code. Hopefully it can do the same for you.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=JcQd3fqA4EY:yLIYQahGi3Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=JcQd3fqA4EY:yLIYQahGi3Q:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/JcQd3fqA4EY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2011/01/18/generating-test-cases-in-clojure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Quickly starting a powerful Clojure REPL]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/X5Dyf8PEqck/" />
    <updated>2010-12-07T00:00:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2010/12/07/quickily-starting-a-powerful-clojure-repl</id>
    <content type="html">&lt;p&gt;I often find myself browsing the Internet and then suddenly I want to have a Clojure REPL at my fingertips. As I&amp;#8217;ve become better with emacs and &lt;a href="http://www.emacswiki.org/ParEdit"&gt;paredit&lt;/a&gt; I&amp;#8217;ve become dependent on the powerful editing this combo affords. The rest of this post details how I changed my five step process into a two step process. It does not explain basic emacs/slime setup but rather explains how I cut a few steps out of a suboptimal workflow for getting a powerful Clojure REPL up and running in emacs.&lt;/p&gt;

&lt;p&gt;My previous workflow was the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a terminal&lt;/li&gt;
&lt;li&gt;Change to the root of Clojure project where I use &lt;a href="https://github.com/technomancy/leiningen"&gt;Leiningen&lt;/a&gt; and have swank-clojure as a dependency.&lt;/li&gt;
&lt;li&gt;Run the command &lt;code&gt;lein swank&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Start emacs&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;M-x slime-connect&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;This five step process was terrible. From me seeing something interesting to try to having a REPL open took too much time.&lt;/p&gt;

&lt;p&gt;Today I changed my process so it on takes two steps. They are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start emacs&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;M-x clojure-swank&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;This is a much better. I&amp;#8217;ll admit had a lot of room for improvement so it wasn&amp;#8217;t too hard to make it better. Below are the steps I took to cut three steps.&lt;/p&gt;

&lt;p&gt;First, using Leiningen 1.4.0, I ran &lt;code&gt;lein install swank-clojure 1.3.0-SNAPSHOT&lt;/code&gt;. This installed a script called swank-clojure into $HOME/.lein/bin. When run, this script starts a swank server waiting for connections on port 4005.&lt;/p&gt;

&lt;p&gt;Next I wrote a function in &lt;a href="http://en.wikipedia.org/wiki/Emacs_Lisp"&gt;elisp&lt;/a&gt; that gives emacs the ability to call the newly installed swank-clojure script, wait for the swank server to start, and then connect to it. This function, &lt;code&gt;clojure-swank&lt;/code&gt;, can be seen below. It creates a buffer named &lt;code&gt;*clojure-swank*&lt;/code&gt;, runs the newly installed script, and captures the output in the freshly created buffer. When the &amp;#8220;Connection opened&amp;#8221; line appears &lt;code&gt;slime-connect&lt;/code&gt; is called, connecting emacs to the freshly started swank server. After this we are at the REPL with all the advantages that emacs and paredit give us.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='cl'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;clojure-swank&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s"&gt;&amp;quot;Launch swank-clojure from users homedir/.lein/bin&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;buffer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;get-buffer-create&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;*clojure-swank*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;flet&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;display-buffer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;buffer-or-name&lt;/span&gt; &lt;span class="k"&gt;&amp;amp;optional&lt;/span&gt; &lt;span class="nv"&gt;not-this-window&lt;/span&gt; &lt;span class="nv"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bury-buffer&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;shell-command&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;~/.lein/bin/swank-clojure &amp;amp;&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-process-filter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;get-buffer-process&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;with-current-buffer&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;*clojure-swank*&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;insert&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nv"&gt;string-match&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Connection opened on local port +\\([0-9]+\\)&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;slime-connect&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;match-string&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-process-filter&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Starting swank.. &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I&amp;#8217;ve also written a &lt;code&gt;clojure-kill-swank&lt;/code&gt; function for stopping the swank server.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='cl'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;clojure-kill-swank&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="s"&gt;&amp;quot;Kill swank process started by lein swank.&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;process&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;get-buffer-process&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;*clojure-swank*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ignore-errors&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;slime-quit-lisp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;timeout&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;eql&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;run&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;process-status&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sit-for&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;decf&lt;/span&gt; &lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ignore-errors&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kill-buffer&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;*clojure-swank*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Both of those functions need to be added to a location where they will get defined on emacs start-up. Once this is done the powerful REPL you are used to emacs providing can be at your finger tips in practically no time at all.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=X5Dyf8PEqck:zSG-Cyn-mJA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=X5Dyf8PEqck:zSG-Cyn-mJA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/X5Dyf8PEqck" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2010/12/07/quickily-starting-a-powerful-clojure-repl/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Trampolining through mutual recursion with Clojure]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/7KYkWE3kmEo/" />
    <updated>2010-12-06T00:00:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2010/12/06/trampolining-through-mutual-recursion</id>
    <content type="html">&lt;p&gt;The other day I stumbled across some &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; code that used &lt;a href="http://en.wikipedia.org/wiki/Mutual_recursion"&gt;mutual recursion&lt;/a&gt;. Mutual recursion can be a valuable tool when solving a problem. Unfortunately because of the lack of &lt;a href="http://en.wikipedia.org/wiki/Tail_call"&gt;tail call optimization&lt;/a&gt; on the JVM this can be a dangerous technique when writing Clojure code. It can be easy to forget about this limitation and end up writing code that blows the stack.&lt;/p&gt;

&lt;p&gt;Take the classic even/odd checking code from the &lt;a href="http://en.wikipedia.org/wiki/Mutual_recursion"&gt;Wikipedia&lt;/a&gt; page. If we just translate it to Clojure it will cause a &lt;a href="http://en.wikipedia.org/wiki/Stack_overflow"&gt;stack overflow&lt;/a&gt; error when we pass in a large number. The massive number of function calls require before returning causes too much memory to be consumed.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;my-odd?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;my-even?&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&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-odd?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Math/abs&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;my-odd?&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&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-even?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Math/abs&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&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;my-even?&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;; Evaluation aborted. &amp;lt;- this is a result of java.util.StackOverflowError&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Luckily since Clojure 1.0 there has been a useful function for dealing with this. &lt;code&gt;trampoline&lt;/code&gt;, with minor modifications to your code, can be used to get around the lack of tail call optimizations (&lt;a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/trampoline"&gt;docs here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;trampoline&lt;/code&gt; takes a function (and, if needed, arguments to pass into the function) and calls it. If the function returns a function then &lt;code&gt;trampoline&lt;/code&gt; calls that. As long as functions are returned &lt;code&gt;trampoline&lt;/code&gt; will continue calling them. When a non-function value is returned &lt;code&gt;trampoline&lt;/code&gt; returns, passing through the value.&lt;/p&gt;

&lt;p&gt;To make our sample code work with &lt;code&gt;trampoline&lt;/code&gt; we simply change our functions to return a closure which wraps the call that was previously being executed. This just entails putting a &lt;code&gt;#&lt;/code&gt; before the final s-exp. This takes advantage of Clojure&amp;#8217;s anonymous function syntax to change the function call into a closure which is returned.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;my-even?&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&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;my-odd?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Math/abs&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;my-odd?&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&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nv"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;my-even?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Math/abs&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;By doing this we&amp;#8217;ve changed how the caller interacts with &lt;code&gt;my-even?&lt;/code&gt; and &lt;code&gt;my-odd?&lt;/code&gt;. It now needs to be called by &lt;code&gt;trampoline&lt;/code&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&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;trampoline&lt;/span&gt; &lt;span class="nv"&gt;my-even?&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now we no longer suffer from the stack overflow error.&lt;/p&gt;

&lt;p&gt;I think we can still do better though, because now the caller of &lt;code&gt;my-even?&lt;/code&gt; and &lt;code&gt;my-odd?&lt;/code&gt; suffers since they are forced to remember to use &lt;code&gt;trampoline&lt;/code&gt;. By forcing this on the caller, we&amp;#8217;ve pushed what should be hidden implementations details into the callers code. We can fix this by pushing the use of &lt;code&gt;trampoline&lt;/code&gt; into our functions.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;my-even?&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&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;letfn&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nf"&gt;e?&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&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nv"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;o?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Math/abs&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;zero? &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="nv"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;e?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Math/abs&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))))]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;trampoline&lt;/span&gt; &lt;span class="nv"&gt;e?&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;my-odd?&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&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-even?&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&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;my-even?&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;my-odd?&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now we have the best of both worlds. Mutual recursion without the worry of a stack overflow and functions that don&amp;#8217;t force the caller to be aware of the implementation details.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=7KYkWE3kmEo:uFqDk5HV1XQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=7KYkWE3kmEo:uFqDk5HV1XQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/7KYkWE3kmEo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2010/12/06/trampolining-through-mutual-recursion/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Inserting values into a nested map in Clojure]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/FuZQHWnV9-M/" />
    <updated>2010-06-06T00:00:00-05:00</updated>
    <id>http://jakemccrary.com/blog/2010/06/06/inserting-values-into-a-nested-map-in-clojure</id>
    <content type="html">&lt;p&gt;Recently I was writing some Clojure with a coworker and we needed to insert values into a nested map structure. Our first solution (and example of using it at the repl) looked something like this.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;add-to-cache&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;cache&lt;/span&gt; &lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="nv"&gt;key2&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;entry&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;cache&lt;/span&gt; &lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="nv"&gt;new-entry&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;entry&lt;/span&gt; &lt;span class="nv"&gt;key2&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;cache&lt;/span&gt; &lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="nv"&gt;new-entry&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&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;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-cache&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="nv"&gt;:chicago&lt;/span&gt; &lt;span class="nv"&gt;:lakeview&lt;/span&gt; &lt;span class="nv"&gt;:jake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-cache&lt;/span&gt; &lt;span class="nv"&gt;:sf&lt;/span&gt; &lt;span class="nv"&gt;:mission&lt;/span&gt; &lt;span class="nv"&gt;:dan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-cache&lt;/span&gt; &lt;span class="nv"&gt;:chicago&lt;/span&gt; &lt;span class="nv"&gt;:wickerpark&lt;/span&gt; &lt;span class="nv"&gt;:alex&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:sf&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:mission&lt;/span&gt; &lt;span class="nv"&gt;:dan&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;:chicago&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:wickerpark&lt;/span&gt; &lt;span class="nv"&gt;:alex,&lt;/span&gt; &lt;span class="nv"&gt;:lakeview&lt;/span&gt; &lt;span class="nv"&gt;:jake&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This worked but seemed overly verbose for doing what (in our minds) should have been a simple operation. After some digging around in the docs we found the function &lt;code&gt;assoc-in&lt;/code&gt;. This useful function allowed us to greatly simplify the code.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;add-to-cache&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;cache&lt;/span&gt; &lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="nv"&gt;key2&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;assoc-in&lt;/span&gt; &lt;span class="nv"&gt;cache&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="nv"&gt;key2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&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;-&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-cache&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="nv"&gt;:chicago&lt;/span&gt; &lt;span class="nv"&gt;:lakeview&lt;/span&gt; &lt;span class="nv"&gt;:jake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-cache&lt;/span&gt; &lt;span class="nv"&gt;:sf&lt;/span&gt; &lt;span class="nv"&gt;:mission&lt;/span&gt; &lt;span class="nv"&gt;:dan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add-to-cache&lt;/span&gt; &lt;span class="nv"&gt;:chicago&lt;/span&gt; &lt;span class="nv"&gt;:wickerpark&lt;/span&gt; &lt;span class="nv"&gt;:alex&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:sf&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:mission&lt;/span&gt; &lt;span class="nv"&gt;:dan&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;:chicago&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;:wickerpark&lt;/span&gt; &lt;span class="nv"&gt;:alex,&lt;/span&gt; &lt;span class="nv"&gt;:lakeview&lt;/span&gt; &lt;span class="nv"&gt;:jake&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Much simpler and easier to read. The next person to look at the code will be able to quickly skim and tell what the code is doing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;assoc-in&lt;/code&gt; can also be used with nested associative structures like vectors.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&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;assoc-in&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="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="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="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;:z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;:z&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="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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;assoc-in&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="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="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;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;:z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&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="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;:z&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Hopefully this post makes searching for how to insert into nested maps slighly easier for the next person who thinks there must be a better way for doing this.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=FuZQHWnV9-M:5TjfXHyeSjQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=FuZQHWnV9-M:5TjfXHyeSjQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/FuZQHWnV9-M" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2010/06/06/inserting-values-into-a-nested-map-in-clojure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Plotting time series data with Incanter]]></title>
    <link href="http://feedproxy.google.com/~r/JakeMccrarysMusings/~3/dorx4kABslU/" />
    <updated>2010-02-21T00:00:00-06:00</updated>
    <id>http://jakemccrary.com/blog/2010/02/21/plotting-time-series-data-with-incanter</id>
    <content type="html">&lt;p&gt;Recently I found myself wanting to plot some time series data and wanted to do this in Clojure. Unfortunately Incanter, a good statistical and graphics library for Clojure, did not provide a way to plot data where the x-axis is a time value. A quick fork on github and a pull request later and now Incanter does. Since I added this functionality I thought I would write up a short example of using it.&lt;/p&gt;

&lt;p&gt;The example time series data I’m using I took from Yahoo’s &lt;a href="http://finance.yahoo.com/"&gt;finance section&lt;/a&gt;. &lt;a href="http://ichart.finance.yahoo.com/table.csv?s=YHOO&amp;amp;a=03&amp;amp;b=12&amp;amp;c=1996&amp;amp;d=01&amp;amp;e=21&amp;amp;f=2010&amp;amp;g=d&amp;amp;ignore=.csv"&gt;Here&lt;/a&gt; is a link to the csv file I used.&lt;/p&gt;

&lt;p&gt;I’m using the &lt;code&gt;read-dataset&lt;/code&gt; function provided by Incanter. This procedure reads a delimited file (or URL) and returns an Incanter dataset.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;yhoo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;read-dataset&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;table.csv&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;:header&lt;/span&gt; &lt;span class="nv"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Yahoo stores the date in a yyyy-mm-dd format. I need to convert that to milliseconds from the epoch so it can be used in time-series-plot as the x-axis data. To do this I wrote a function which takes the string representation of the date, splits in on “-”, then use the &lt;code&gt;joda-date&lt;/code&gt; and &lt;code&gt;to-ms&lt;/code&gt; functions from incanter.chrono to get the number of milliseconds from the epoch.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;to-milliseconds-from-epoch&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;to-ms&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;apply &lt;/span&gt;&lt;span class="nv"&gt;joda-date&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;Integer/parseInt&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;split&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now that we have a function which takes the string representation and get the milliseconds it is time to get the data I want from the dataset. The below code selects the &lt;code&gt;:Close&lt;/code&gt; and &lt;code&gt;:Date&lt;/code&gt; column while mapping the &lt;code&gt;:Date&lt;/code&gt; column to a millisecond from epoch representation of date.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;mod-data&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;col-names&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;conj-cols&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;:Close&lt;/span&gt; &lt;span class="nv"&gt;yhoo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;$map&lt;/span&gt; &lt;span class="nv"&gt;to-milliseconds-from-epoch&lt;/span&gt; &lt;span class="nv"&gt;:Date&lt;/span&gt; &lt;span class="nv"&gt;yhoo&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;:Close&lt;/span&gt; &lt;span class="nv"&gt;:Date&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The next step is to use the &lt;code&gt;time-series-plot&lt;/code&gt; function to actually create the plot. Because the data we have is in a dataset, we can pass in the column names as the x and y parameters and provide the data set as the value to the &lt;code&gt;:data&lt;/code&gt; key in the optional parameters.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;chart&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;time-series-plot&lt;/span&gt; &lt;span class="nv"&gt;:Date&lt;/span&gt; &lt;span class="nv"&gt;:Close&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                             &lt;span class="nv"&gt;:x-label&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                             &lt;span class="nv"&gt;:y-label&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Closing Price&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                             &lt;span class="nv"&gt;:title&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Closing price over time for Yahoo&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                             &lt;span class="nv"&gt;:data&lt;/span&gt; &lt;span class="nv"&gt;mod-data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then we use the Incanter function &lt;code&gt;view&lt;/code&gt; to actually see the chart.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;view&lt;/span&gt; &lt;span class="nv"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;img src="http://jakemccrary.com/images/yhoo.png" title="Chart of historical YHOO closing prices" alt="Chart of historical YHOO closing prices" /&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=dorx4kABslU:thqjdnS4am4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?a=dorx4kABslU:thqjdnS4am4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JakeMccrarysMusings?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JakeMccrarysMusings/~4/dorx4kABslU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://jakemccrary.com/blog/2010/02/21/plotting-time-series-data-with-incanter/</feedburner:origLink></entry>
  
</feed>

