<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Object Mentor Blog: TDD in Clojure</title>
    <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>TDD in Clojure</title>
      <description>&lt;p&gt;OO is a tell-don&amp;#8217;t-ask paradigm.  Yes, I know people don&amp;#8217;t always use it that way, but one of Kay&amp;#8217;s original concepts was that objects were like cells in a living creature.  The cells in a living creature do not ask any questions.  They simply tell each other what to do.  Neurons are tellers, not askers.  Hormones are tellers not askers.  In biological systems, (and in Kay&amp;#8217;s original concept for OO) communication was half-duplex.&lt;/p&gt;


	&lt;p&gt;Clojure is a functional language.  Functional languages are ask-dont-tell.  Indeed, the whole notion of &amp;#8220;tell&amp;#8221; is to change the state of the system.  In a functional program there is no state to change.  So &amp;#8220;telling&amp;#8221; makes little sense.&lt;/p&gt;


	&lt;p&gt;When we use &lt;span class="caps"&gt;TDD&lt;/span&gt; to develop a tell-don&amp;#8217;t-ask system, we start at the high level and write tests using mocks to make sure we are issuing the correct &amp;#8220;tells&amp;#8221;.  We proceed from the top of the system to the bottom of the system.  The last tests we write are for the utilities at the very bottom.&lt;/p&gt;


	&lt;p&gt;In an ask-don&amp;#8217;t-tell system, data starts at the bottom and flows upwards.  The operation of each function depends on the data fed to it by the lower level functions.  There is no mocking framework.  So we write tests that start at the bottom, and we work our way up the the top.&lt;/p&gt;


	&lt;p&gt;Therein lies the rub.&lt;/p&gt;


	&lt;p&gt;In a tell-don&amp;#8217;t-ask system, the tells at the high level are relatively complex.  They branch out into lower subsystems getting simpler, but more numerous as they descend.  Testing these tells using mocks is not particularly difficult because we don&amp;#8217;t need to depend on the lower level functions being there.  The mocks make them irrelevant.&lt;/p&gt;


	&lt;p&gt;In an ask-don&amp;#8217;t-tell system the asks at the low level are simple, but as the data moves upwards it gets grouped and composed into lists, maps, sets, and other complex data structures.  At the top the data is in it&amp;#8217;s most complex form.  Writing tests against that complex data is difficult at best.  And there is currently no way to mock out the lower levels&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; so all tests written at the high level depend on all the functions below.&lt;/p&gt;


	&lt;p&gt;The perception of writing tests from the bottom to the top can be horrific at first.  Consider, for example, the &lt;a href="http://github.com/unclebob/clojureOrbit"&gt;Orbit program&lt;/a&gt; I just wrote.  This program simulates N-body gravitation.  Imagine that I am writing tests at the top level.  I have three bodies at position Pa, Pb, and Pc.  They have masses Ma, Mb, and Mc.  They have velocity vectors of Va, Vb, Vc.  The test I want to write needs to make sure that new positions Pa&amp;#8217;, Pb&amp;#8217;, Pc&amp;#8217;, and new Velocity vectors Va&amp;#8217;, Vb&amp;#8217;, and Vc&amp;#8217; are computed correctly.  How do I do that?&lt;/p&gt;


Should I write a test that looks like this?
&lt;pre&gt;
test-update {
  Pa = (1,1)
  Ma = 2
  Va = (0,0)

  Pb = (1,2)
  Mb = 3
  Vb = (0,0)

  Pc = (4,5)
  Mc = 4
  Vc = (0,0)

  update-all

  Pa should == (1.096, 4.128)
  Va should == (0.096, 3.128)

  Pb should == (1.1571348402636772, 0.1571348402636774)
  Vb should == (0.15713484026367727, -1.8428651597363226)

  Pc should == (3.834148869802242, 4.818148869802242)
  Vc should == (-0.16585113019775796, -0.18185113019775795)
}
&lt;/pre&gt;
A test like this is awful.  It&amp;#8217;s loaded with magic numbers, and secret information.  It tells me nothing about &lt;em&gt;how&lt;/em&gt; the update-all function is working.  It only tells me that it generated certain numbers.  Are those numbers correct?  How would I know?

	&lt;p&gt;But wait!  I&amp;#8217;m working in a &lt;em&gt;functional language&lt;/em&gt;.  That means that every function I call with certain inputs will &lt;em&gt;always&lt;/em&gt; return the same value; no matter how many times I call it.  Functions don&amp;#8217;t change state!  And that means that I can write my tests quite differently.&lt;/p&gt;


	&lt;p&gt;How does update-all work?  Simple, given a list of objects it performs the following operations (written statefully):&lt;/p&gt;


&lt;pre&gt;
  update-all(objects) {
    for each object in objects {
      accumulate-forces(object, objects)
    }
    for each object in objects {
      accelerate(object)
      reposition(object)
    }
  }
&lt;/pre&gt; 

	&lt;p&gt;This is written in stateful form to make is easier for our non-functional friends to follow.  First we accumulate the force of gravity between all the objects.  This amounts to evaluating Newton&amp;#8217;s F=Gm1m1/r^2 formula for each pair of objects, and adding up the force vectors.&lt;/p&gt;


	&lt;p&gt;Then, for each object we accelerate that object by applying the force vector to it&amp;#8217;s mass, and adding the resultant delta-v vector to it&amp;#8217;s velocity vector.&lt;/p&gt;


	&lt;p&gt;Then, for each object we reposition that object by applying the velocity vector to it&amp;#8217;s current position.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s the clojure code for update-all&lt;/p&gt;


&lt;pre&gt;
(defn update-all [os]
  (reposition-all (accelerate-all (calculate-forces-on-all os))))
&lt;/pre&gt;

	&lt;p&gt;In this code you can clearly see the bottom-to-top flow of the application.  First we calculate forces, then we accelerate, and finally we reposition.&lt;/p&gt;


	&lt;p&gt;Now, what do these -all functions look like?  Here they are:&lt;/p&gt;


&lt;pre&gt;
(defn calculate-forces-on-all [os]
  (map #(accumulate-forces % os) os))

(defn accelerate-all [os]
  (map accelerate os))

(defn reposition-all [os]
  (map reposition os))
&lt;/pre&gt;

	&lt;p&gt;If you don&amp;#8217;t read clojure, don&amp;#8217;t worry.  the map function simply creates a new list from an old list by applying a function to each element of the old list.  So in the case of reposition-all it simply calls reposition on the list of objects (os) producing a new list of objects that have been repositioned.&lt;/p&gt;


	&lt;p&gt;From this we can determine that the function of update-all is to call the three functions (accumulate-forces, accelerate, and reposition) on each element of the input list, producing a new list.&lt;/p&gt;


	&lt;p&gt;Notice how similar that is to a statement we might make about a high level method in an OO program.  (It&amp;#8217;s got to call these three functions on each element of the list).  In an OO language we would mock out the three functions and just make sure they&amp;#8217;d been called for each element.  The calculations would be bypassed as irrelevant.&lt;/p&gt;


	&lt;p&gt;Oddly, we can make the same statement in clojure.  Here&amp;#8217;s the test for update-all&lt;/p&gt;


&lt;pre&gt;
(testing "update-all" 
  (let [
    o1 (make-object ...)
    o2 (make-object ...)
    o3 (make-object ...)
    os [o1 o2 o3]
    us (update-all os)
    ]
    (is (= (nth us 0) (reposition (accelerate (accumulate-forces os o1)
    (is (= (nth us 1) (reposition (accelerate (accumulate-forces os o2)
    (is (= (nth us 2) (reposition (accelerate (accumulate-forces os o3)
    )
  )
&lt;/pre&gt;  

	&lt;p&gt;If you don&amp;#8217;t read clojure don&amp;#8217;t worry.  All this is saying is that we test the update-all function by calling the appropriate functions for each input object, and then see if the elements in the output list match them.&lt;/p&gt;


	&lt;p&gt;In an OO program we&amp;#8217;d find this dangerous because of side-effects.  We couldn&amp;#8217;t be sure that the functions could safely be called without changing the state of some object in the system.  But in a functional language it doesn&amp;#8217;t matter how many times you call a function.  So long as you pass in the same data, you will get the same result.&lt;/p&gt;


	&lt;p&gt;So this test simply checks that the appropriate three functions are getting called on each element of the list.  This is exactly the same thing an OO programmer would do with a mock object!&lt;/p&gt;


	&lt;h3&gt;Is &lt;span class="caps"&gt;TDD&lt;/span&gt; necessary in Clojure?&lt;/h3&gt;


	&lt;p&gt;If you follow the code in the Orbit example, you&amp;#8217;ll note that I wrote tests for all the computations, but did not write tests for the Swing-Gui.  This is typical of the way that I work.  I try to test all business rules, but I &amp;#8220;fiddle&amp;#8221; with the &lt;span class="caps"&gt;GUI&lt;/span&gt; until I like it.&lt;/p&gt;


	&lt;p&gt;If you look carefully you&amp;#8217;ll find that amidst the &lt;span class="caps"&gt;GUI&lt;/span&gt; functions there are some &amp;#8220;presentation&amp;#8221; functions that &lt;em&gt;could&lt;/em&gt; have been tested, but that I neglected to write with &lt;span class="caps"&gt;TDD&lt;/span&gt;[2].  These functions were the worst to get working.  I continuously encountered NPEs and Illegal Cast exceptions while trying to get them to work.&lt;/p&gt;


	&lt;p&gt;My conclusion is that Clojure without &lt;span class="caps"&gt;TDD&lt;/span&gt; is just as much a nightmare as Java or Ruby without &lt;span class="caps"&gt;TDD&lt;/span&gt;.&lt;/p&gt;


	&lt;h3&gt;Summary&lt;/h3&gt;


	&lt;p&gt;In OO we tend to &lt;span class="caps"&gt;TDD&lt;/span&gt; our way from the top to the bottom by using Mocks.  In Clojure we tend to &lt;span class="caps"&gt;TDD&lt;/span&gt; our way from the bottom to the top.  In either case we can compose our tests in terms of the functions they should call on the lower level objects.  In the case of OO we use mocks to tell us if the functions have been called properly.  This protects us from side-effects and allows us to decouple our tests from the whole system.  In clojure we can rely on the fact that the language is functional, and that no matter how many times you call a function it will return the same value.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Brian Marick is working on something that looks a lot like a mocking framework for clojure.  If his ideas pan out, we may be able to &lt;span class="caps"&gt;TDD&lt;/span&gt; from the top to the bottom in Clojure.&lt;/p&gt;


	&lt;p id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; This is an unconscious game we all play with ourselves.  When we have a segment of code that we consider to be immune to &lt;span class="caps"&gt;TDD&lt;/span&gt; (like &lt;span class="caps"&gt;GUI&lt;/span&gt;) then we unconsciously move lots of otherwise testable code into that segment.  Yes, I heard my green band complain every time I did it; but I ignored it because I was in the &lt;span class="caps"&gt;GUI&lt;/span&gt;.  Whoops.&lt;/p&gt;</description>
      <pubDate>Thu, 03 Jun 2010 12:33:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:496c0f47-16d5-480d-9530-125b7ee235d8</guid>
      <author>Uncle Bob</author>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure</link>
      <category>Uncle Bob's Blatherings</category>
    </item>
    <item>
      <title>"TDD in Clojure" by Wilson Rackets</title>
      <description>&lt;p&gt;with good pace for you to prevent your own opponent from setting up for the actual shot as well as they need to become directed into open court to be able to keep your current opponent on the move.&lt;/p&gt;</description>
      <pubDate>Sat, 04 Feb 2012 01:20:19 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:18213d14-973a-48e7-a2ec-9586dd78669d</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-201687</link>
    </item>
    <item>
      <title>"TDD in Clojure" by solar lights outside</title>
      <description>&lt;p&gt;Im no expert, but I believe you just made an excellent point. You certainly fully understand what youre speaking about, and I can truly get behind that. Thanks for staying so upfront and so sincere.&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 07:27:19 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:aed08314-f1ce-4a63-8e0c-20c23ddc1c91</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-201067</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Prince ii</title>
      <description>&lt;p&gt;There&#8217;s a lot of intelligent information in this content. It&#8217;s also engaging which makes it easier to read. It can reach the reader more effectively so more information is retained.&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 07:11:41 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:58a8ab9e-2da0-4b1a-b1ad-e20c9cfa1a3e</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-201027</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Babolat Rackets</title>
      <description>&lt;p&gt;longueurs, l&amp;#8217;ensemble des cotes environnant les raideur et tailles p t&#234;les, tous con&#231;all of us dump aider l&amp;#8217;ensemble des varieties nufactured joueurs.&lt;/p&gt;</description>
      <pubDate>Sun, 29 Jan 2012 20:00:59 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:53da2121-c29e-4910-a320-3b69aab33fdb</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-200129</link>
    </item>
    <item>
      <title>"TDD in Clojure" by fake ray bans</title>
      <description>&lt;p&gt;Welcome to &lt;a href="http://www.replicaray-ban-sale.org/best-fake-raybans-c-80.html " rel="nofollow"&gt;&lt;strong&gt;fake raybans&lt;/strong&gt;&lt;/a&gt; store
online!Our company is fake ray bans manufacturer &amp;#38; supplier,our company also supply &lt;a href="http://www.replicaray-ban-sale.org/best-fake-raybans-c-80.html " rel="nofollow"&gt;&lt;strong&gt;fake ray bans &lt;/strong&gt;&lt;/a&gt; .we have been 
in designer sunglasses for 8 years.there u can get the cheapest price in our company sites,waiting for u visiting.&lt;a href="http://www.replicaray-ban-sale.org/ " rel="nofollow"&gt;&lt;strong&gt;Fake ray bans &lt;/strong&gt;&lt;/a&gt; sold in our company.our company&amp;#8217;s .&lt;a href="http://www.replicaray-ban-sale.org/ " rel="nofollow"&gt;&lt;strong&gt;fake raybans &lt;/strong&gt;&lt;/a&gt;  let you enjoy your life withour paying high prices,and our daily necessities have been sold all over the world for many years and influenced by the customers&amp;#8217; approval.our company is your first choice.&lt;/p&gt;</description>
      <pubDate>Sat, 28 Jan 2012 19:43:37 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e0b68210-0fe7-432f-9e61-2972270d2258</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-199822</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Laalz</title>
      <description>&lt;p&gt;Kind of a bit detailed post but worth reading. &lt;a href="http://www.olwauniversity.com/schools-and-majors/political-science.asp" rel="nofollow"&gt;public administration degree&lt;/a&gt; | &lt;a href="http://www.olwauniversity.com/schools-and-majors/performing-arts.asp" rel="nofollow"&gt;performing arts school&lt;/a&gt; | &lt;a href="http://www.olwauniversity.com/schools-and-majors/occupational-safety.asp" rel="nofollow"&gt;online fire science degree&lt;/a&gt; | &lt;a href="http://www.olwauniversity.com/schools-and-majors/law.asp" rel="nofollow"&gt;Law School&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 27 Jan 2012 12:44:35 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1f0f02e8-736f-4359-9991-071cb5feca27</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-199377</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Laalz</title>
      <description>&lt;p&gt;Kind of a bit detailed post but worth reading. &lt;a href="http://www.olwauniversity.com/schools-and-majors/political-science.asp" rel="nofollow"&gt;public administration degree&lt;/a&gt; | &lt;a href="http://www.olwauniversity.com/schools-and-majors/performing-arts.asp" rel="nofollow"&gt;performing arts school&lt;/a&gt; | &lt;a href="http://www.olwauniversity.com/schools-and-majors/occupational-safety.asp" rel="nofollow"&gt;online fire science degree&lt;/a&gt; | &lt;a href="www.olwauniversity.com/schools-and-majors/law.asp" rel="nofollow"&gt;Law School&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 27 Jan 2012 12:43:45 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e745838c-5a4d-4ebe-b2e0-f6b88916d9bf</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-199376</link>
    </item>
    <item>
      <title>"TDD in Clojure" by dr dre beats cheap</title>
      <description>&lt;p&gt;All bag quality problems can return, to support round-trip courier, freight from the love of two-way networks for bags yet, no quality problems due to personal reasons&lt;/p&gt;


	&lt;p&gt;customers may also wish to Return the date of receipt no reason to return within 7 days . Getting goods to you really worry! Receiving convenient&lt;/p&gt;</description>
      <pubDate>Tue, 24 Jan 2012 06:15:14 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c51475c4-f5f3-4358-8c12-964c2f12032d</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-199035</link>
    </item>
    <item>
      <title>"TDD in Clojure" by online docs</title>
      <description>&lt;p&gt;it was so cool to watching this&amp;#8230;.&lt;/p&gt;</description>
      <pubDate>Tue, 17 Jan 2012 06:19:38 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:d6a190c7-4172-4a1a-a9ab-8b28f35f394b</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-198316</link>
    </item>
    <item>
      <title>"TDD in Clojure" by snow</title>
      <description>&lt;p&gt;&lt;a href="http://www.timeadmin.org/Tissot-Ladies-Classic-Watches_15_1.htm" rel="nofollow"&gt;Tissot Classic Dream Watch&lt;/a&gt; will be a happy life style. Do not hesitate to choose &lt;a href="http://www.timeadmin.org/" rel="nofollow"&gt;tissot ladies watches&lt;/a&gt; and &lt;a href="http://www.timeadmin.org/" rel="nofollow"&gt;tissot gents watches&lt;/a&gt; to add your charming and beauty everytime.&lt;/p&gt;</description>
      <pubDate>Sat, 07 Jan 2012 00:01:20 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:f89b0eaa-621d-48d4-b1a9-88eff990dea9</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-195727</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Moncler Women Jackets</title>
      <description>&lt;p&gt;If you are well-built or rather have a heavy Cheap Moncler Jackets then you should wear full sleeve t-shirts and wearing Moncler Down Jackets as they tend to make you look warmer.&lt;/p&gt;</description>
      <pubDate>Mon, 02 Jan 2012 02:53:01 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:fc690e58-535f-4664-aa8b-518c7dd9b73a</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-194132</link>
    </item>
    <item>
      <title>"TDD in Clojure" by moncler uk</title>
      <description>&lt;p&gt;loosing the smell&lt;/p&gt;</description>
      <pubDate>Sun, 01 Jan 2012 20:53:09 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:852b1d71-3e9e-49a8-8337-5be8f3e4bada</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-194046</link>
    </item>
    <item>
      <title>"TDD in Clojure" by nikewomenheels</title>
      <description>&lt;p&gt;One of the most famous and widely-practiced dance &lt;a href="http://www.nikeheelsdunk.com/" rel="nofollow"&gt;women jordan heels&lt;/a&gt; form is ballet. Almost everyone around the globe knows what ballet is, regardless of whether you are into the art, know someone &lt;a href="http://www.nikeheelsdunk.com/" rel="nofollow"&gt;women jordan heels&lt;/a&gt; practicing ballet, have&amp;nbsp;seen it on television or movies, in musical plays or stage presentations. Ballet is the predominant dance art that has enjoyed global appeal.Of all the dance arts &lt;a href="http://www.jordanheelswomen.net/" rel="nofollow"&gt;Jordan Heels For Women&lt;/a&gt; or forms that are being practiced, aside from the&amp;nbsp;territorial or regional ethnic dance forms- ballet enjoys a reputation a notch above the rest since it is associated with prestige and sophistication.&lt;/p&gt;</description>
      <pubDate>Fri, 30 Dec 2011 02:30:54 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:4b3475a2-2382-4259-94dd-c1502ed3f4c4</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-193641</link>
    </item>
    <item>
      <title>"TDD in Clojure" by nikewomenheels</title>
      <description>&lt;p&gt;One of the most famous and widely-practiced dance &lt;a href="http://www.nikeheelsdunk.com/" rel="nofollow"&gt;women jordan heels&lt;/a&gt; form is ballet. Almost everyone around the globe knows what ballet is, regardless of whether you are into the art, know someone &lt;a href="http://www.nikeheelsdunk.com/" rel="nofollow"&gt;women jordan heels&lt;/a&gt; practicing ballet, have&amp;nbsp;seen it on television or movies, in musical plays or stage presentations. Ballet is the predominant dance art that has enjoyed global appeal.Of all the dance arts &lt;a href="http://www.jordanheelswomen.net/" rel="nofollow"&gt;Jordan Heels For Women&lt;/a&gt; or forms that are being practiced, aside from the&amp;nbsp;territorial or regional ethnic dance forms- ballet enjoys a reputation a notch above the rest since it is associated with prestige and sophistication.&lt;/p&gt;</description>
      <pubDate>Fri, 30 Dec 2011 02:29:19 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:18216ac4-0b74-453a-9a2a-61d83766cc73</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-193640</link>
    </item>
    <item>
      <title>"TDD in Clojure" by lady gaga heartbeats headphone</title>
      <description>&lt;p&gt;lady gaga heartbeats headphone&lt;/p&gt;</description>
      <pubDate>Wed, 28 Dec 2011 05:11:27 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:9391cf3d-85a4-40e6-9fed-047af8f4b878</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-192931</link>
    </item>
    <item>
      <title>"TDD in Clojure" by nikeheelsdunk</title>
      <description>&lt;br&gt;&lt;br&gt;A first aid kit is a must for small and accidental injuries. Of course it&amp;#8217;s unavoidable to scrape your arm on rough bark or falling off the tree stand, at least there&amp;#8217;s an available remedy in that box. Always make sure to dispose of the &lt;a href="http://www.nikewomenheels.net/" rel="nofollow"&gt;Nike heels for women&lt;/a&gt; material properly.&lt;br&gt;&lt;br&gt;Other equipment such as rifles or bows must be kept unloaded. Most States will commission a guide for hunters to carry the ammunition and probably help the hunter carry some of the necessary equipment. It&amp;#8217;s not like having a &lt;a href="http://www.jordanheelswomen.net/" rel="nofollow"&gt;Jordan Heels For Women&lt;/a&gt; caddy carrying the bag, but he is there to ensure the safety of the hunter as well as the forest.&lt;br&gt;&lt;br&gt;Never drink anything that may compromise or deteriorate your physical or mental faculties.</description>
      <pubDate>Mon, 26 Dec 2011 02:42:30 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:2d3f6f57-5687-452e-b521-5dfbe21d14e4</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-192157</link>
    </item>
    <item>
      <title>"TDD in Clojure" by north face khumbu</title>
      <description>&lt;p&gt;This article is impressive,I hope that you will continue doing nice article like this.&lt;/p&gt;</description>
      <pubDate>Sat, 24 Dec 2011 07:33:29 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ea873fe6-e065-4f17-9ebc-c617b715c87d</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-191272</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Dissertation ghost writers</title>
      <description>&lt;p&gt;&lt;a href="http://www.bestghostwriters.net/dissertationthesis-ghostwriting" rel="nofollow"&gt;Dissertation ghost writers&lt;/a&gt;
Learning keeps you open and allows you to grow with confidence. Being connected to others through personal experience makes your journey to success more alive and can help to generate excitement in your pursuit.&lt;/p&gt;</description>
      <pubDate>Sat, 24 Dec 2011 01:16:02 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e5492f6c-6244-4e2f-9100-c566e07b354a</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-191134</link>
    </item>
    <item>
      <title>"TDD in Clojure" by wow enchanting guide </title>
      <description>&lt;p&gt;Clojure is a functional language which is vary important for programming.&lt;/p&gt;</description>
      <pubDate>Fri, 23 Dec 2011 10:40:57 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:fc552a00-1ad2-433b-92b0-dc00d3c11afd</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-190870</link>
    </item>
    <item>
      <title>"TDD in Clojure" by  Monster Beats Studio Diamond </title>
      <description>&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/monster-lady-gaga-inear-c-6.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/monster-lady-gaga-inear-c-6.html&lt;/a&gt;     Hearbeats lady gaga     Dr Dre Hearbeats lady gaga&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/monster-miles-davis-inear-c-11.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/monster-miles-davis-inear-c-11.html&lt;/a&gt;     Dr Dre Beats Miles Davis jazz     Beats by dr dre Miles Davis&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/monster-justbeats-solo-c-5.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/monster-justbeats-solo-c-5.html&lt;/a&gt;     Dr Dre Beats Justin biber solo hd     Beats by dr dre justin bieber&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/monster-butterfly-by-vivienne-c-8.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/monster-butterfly-by-vivienne-c-8.html&lt;/a&gt;     Monster Butterfly by Vivienne Tam     Dr Dre Beats Butterfly by vivienne tam&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/specials.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/specials.html&lt;/a&gt;     Monster Beats special     Dr Dre Beats Special&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/beats-by-drdremonster-studio-headphonesblack-p-19.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/beats-by-drdremonster-studio-headphonesblack-p-19.html&lt;/a&gt;     Beats by dr dre studio black     Monster Beats by Dre Studio&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.drdreheadphone.biz/beats-by-drdremonster-studio-headphonesred-p-31.html" rel="nofollow"&gt;http://www.drdreheadphone.biz/beats-by-drdremonster-studio-headphonesred-p-31.html&lt;/a&gt;     Red Dr Dre Beats Studio Headphone     Beats by dre studio headphone&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 20:28:27 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:2c6e2d73-e3b0-4b1f-8728-c71f68b07c49</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-189639</link>
    </item>
    <item>
      <title>"TDD in Clojure" by snapback snapback hats</title>
      <description>&lt;p&gt;Mourinho absent conference, carefully accept this &amp;#8220;World War&amp;#8221; decompression, which aswell reflects the 18-carat Madrid now to adjournment at Plaza from the state.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 13:54:23 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:0f98a103-a522-47b3-a1bf-d37c243971a4</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-189555</link>
    </item>
    <item>
      <title>"TDD in Clojure" by cheap snapback hats</title>
      <description>&lt;p&gt;There exists excessive demand rather than enough commodities to check the importance.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 13:52:17 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:26d42bb7-0f2b-4dd8-8eea-1adbaade07b9</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-189554</link>
    </item>
    <item>
      <title>"TDD in Clojure" by inexpensive jerseys</title>
      <description>&lt;p&gt;Barca accomplished a adventuresome more. Barcelona&amp;#8217;s appetite can be to win, Barcelona&amp;#8217;s Guardiola is reflected from the calm.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 13:50:18 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:74a986c2-6314-45fb-b05d-84fa8c8201ad</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-189553</link>
    </item>
    <item>
      <title>"TDD in Clojure" by cheap china jerseys</title>
      <description>&lt;p&gt;Mourinho absent conference, carefully accept this &amp;#8220;World War&amp;#8221; decompression, which aswell reflects the 18-carat Madrid now to adjournment at Plaza from the state.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 13:47:56 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:37bf597d-4610-46c0-89d2-e1b14ee93cf1</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-189552</link>
    </item>
    <item>
      <title>"TDD in Clojure" by cheap air shoes</title>
      <description>&lt;p&gt;You are able to ablution heel and additionally on the bend of the allot the aforementioned way, as able-bodied as besom on aback and alternating a few times.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Dec 2011 13:44:30 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:16f50c58-1f08-448b-98a6-0ca500a46bc7</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-189551</link>
    </item>
  </channel>
</rss>

