<?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: Java calling Clojure.</title>
    <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Java calling Clojure.</title>
      <description>&lt;p&gt;While I think Clojure is an interesting language, in order for it to be of real practical use, I must be able to use it in conjunction with other systems I am working on.  Specifically, I&amp;#8217;d like to write some FitNesse tools in Clojure;  but for that to work, I&amp;#8217;ll need to call into my Clojure code from Java.&lt;/p&gt;


	&lt;p&gt;Today, my son Justin and I managed to do just that by following the instruction in Stuart Halloway&amp;#8217;s &lt;a href="http://www.pragprog.com/titles/shcloj/programming-clojure"&gt;book&lt;/a&gt;, the Clojure api &lt;a href="http://clojure.org/api#toc388"&gt;website&lt;/a&gt;, and Mark Volkmann&amp;#8217;s very useful &lt;a href="http://java.ociweb.com/mark/clojure/article.html"&gt;site&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Be advised, that it takes a bit of fiddling to get this to work.  You will have to jockey around with your classpaths and output directories.  But it&amp;#8217;s not actually that hard to do, and the results can be very rewarding.&lt;/p&gt;


	&lt;p&gt;We implemented the Bowling game (again), but this time we wrote the unit tests in Java, and had them call into Clojure.  From the point of view of the Java tests, it looked just like we were calling into java code.  The tests had no idea that this was Clojure.&lt;/p&gt;


Here are the tests:
&lt;pre&gt;
package bowling;

import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;

public class BowlingTest {
  private Game g;

  @Before
  public void setup() {
    g = new Game();
  }

  @Test
  public void roll() throws Exception {
    g.roll(0);
  }

  @Test
  public void gutterGame() throws Exception {
    rollMany(20, 0);
    assertEquals(0, g.score());
  }

  private void rollMany(int n, int pins) {
    for (int i=0; i&amp;lt; n; i++) {
      g.roll(pins);
    }
  }

  @Test
  public void allOnes() throws Exception {
    rollMany(20, 1);
    assertEquals(20, g.score());    
  }

  @Test
  public void oneSpare() throws Exception {
    g.roll(5);
    g.roll(5);
    g.roll(3);
    rollMany(17, 0);
    assertEquals(16, g.score());
  }

  @Test
  public void oneStrike() throws Exception {
    g.roll(10);
    g.roll(5);
    rollMany(17,0);
    assertEquals(20, g.score());
  }

  @Test
  public void perfectGame() throws Exception {
    rollMany(12, 10);
    assertEquals(300, g.score());
  }

  @Test
  public void allSpares() throws Exception {
    rollMany(21, 5);
    assertEquals(150, g.score());
  }
}
&lt;/pre&gt;

The clojure code to make them pass looks like this:
&lt;pre&gt;
(ns bowling.Game
  (:gen-class
    :state state
    :init init
    :methods [
    [roll [int] void]
    [score [] int]
    ]))

(defn -init [] [[] (atom [])])

(defn -roll [this pins]
  (reset! (.state this) (conj @(.state this) pins)))

(declare score-frames)

(defn -score [this]
  (reduce + (take 10 (score-frames [] (conj @(.state this) 0)))))

(defn score-frames [scores [first second third :as rolls]]
  (cond
    (or (empty? rolls) (nil? second) (nil? third)) scores
    (= 10 first) (recur (conj scores (+ 10 second third)) (next rolls))
    (= 10 (+ first second)) (recur (conj scores (+ 10 third)) (nnext rolls))
    :else
    (recur (conj scores (+ first second)) (nnext rolls))))
&lt;/pre&gt;

	&lt;p&gt;The magic is all up in that (ns bowling.game&amp;#8230; block.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;The name of the java class is Game in the bowling package, or just bowling.Game.&lt;/li&gt;
		&lt;li&gt;Clojure will create a special member function named &lt;em&gt;state&lt;/em&gt; that you can use to squirrel away the state variables of the class.&lt;/li&gt;
		&lt;li&gt;A function named &lt;em&gt;-init&lt;/em&gt; will be called when your class is constructed.  You must write this function to return a vector containing 1) a vector of all the arguments to pass to the base class constructor (in my case none), and the initial state of the newly created instance, (in my case an empty vector stuffed into an atom)  &lt;/li&gt;
		&lt;li&gt;The class will have two new methods, &lt;em&gt;roll&lt;/em&gt;, which takes an int and returns void, and &lt;em&gt;score&lt;/em&gt; which takes nothing and returns an int.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;When a method is called on the instance, Clojure automatically invokes a function of the same name, but prefixed by a -, so -roll and -score are the implementations of the &lt;em&gt;roll&lt;/em&gt; and &lt;em&gt;score&lt;/em&gt; methods.  Note that each of these functions take a &lt;em&gt;this&lt;/em&gt; argument.  You can get the state out of &lt;em&gt;this&lt;/em&gt; by saying (.state this).&lt;/p&gt;


	&lt;p&gt;From a source code point of view, that&amp;#8217;s about all there is to it.  But how do you compile this into a java .class file?&lt;/p&gt;


Here&amp;#8217;s what we did.  We created a new file named compile.clj that looks like this:
&lt;pre&gt;
(set! *compile-path* "../../classes")
(compile 'bowling.Game)
&lt;/pre&gt;
We can run this file from our &lt;span class="caps"&gt;IDE&lt;/span&gt; (IntelliJ using the LAClojure plugin) and it will compile quite nicely.  But there are a few things you have to make sure you do.

	&lt;ul&gt;
	&lt;li&gt;Find out where your &lt;span class="caps"&gt;IDE&lt;/span&gt; puts the .class files, and set the &lt;em&gt;&lt;strong&gt;compile-path&lt;/strong&gt;&lt;/em&gt; variable to that directory.&lt;/li&gt;
		&lt;li&gt;Also make sure that directory is in your classpath.&lt;/li&gt;
		&lt;li&gt;Make sure that directory exists!&lt;/li&gt;
		&lt;li&gt;Also make sure that your source file directory (the directory that contains the packages) is in your classpath. (I know&amp;#8230; but that&amp;#8217;s apparently what it takes.)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;You will get errors.  And the errors aren&amp;#8217;t particularly informative.  The key to understanding them is to look at the backtrace of the exceptions they throw.  Notice, for example, if the function &amp;#8220;WriteClassFile&amp;#8221; (or something like that) is buried in the backtrace.  If so, you are probably having trouble writing your class file.&lt;/p&gt;


	&lt;p&gt;In the end, we wrote up an ant script that compiled our clojure and our java together.  (You have to compile them in the right order!  If java calls Clojure, those .class files have to exist before the java will compile!)&lt;/p&gt;


	&lt;p&gt;The ant script we used was created for us by IntelliJ, and then we modified it to get it to work.  I include it here with the caveat that we made it work, but we didn&amp;#8217;t make it &amp;#8220;right&amp;#8221;.   You can ignore most of the stuff at the beginning.  The interesting part is the &lt;em&gt;Clojure&lt;/em&gt; target, and the &lt;em&gt;clean&lt;/em&gt; target.&lt;/p&gt;


&lt;pre&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;project name="bowlingforjunit" default="all"&amp;gt;

  &amp;lt;property file="bowlingforjunit.properties"/&amp;gt;
  &amp;lt;!-- Uncomment the following property if no tests compilation is needed --&amp;gt;
  &amp;lt;!-- 
  &amp;lt;property name="skip.tests" value="true"/&amp;gt;
   --&amp;gt;

  &amp;lt;!-- Compiler options --&amp;gt;

  &amp;lt;property name="compiler.debug" value="on"/&amp;gt;
  &amp;lt;property name="compiler.generate.no.warnings" value="off"/&amp;gt;
  &amp;lt;property name="compiler.args" value=""/&amp;gt;
  &amp;lt;property name="compiler.max.memory" value="128m"/&amp;gt;
  &amp;lt;patternset id="ignored.files"&amp;gt;
    &amp;lt;exclude name="**/CVS/**"/&amp;gt;
    &amp;lt;exclude name="**/SCCS/**"/&amp;gt;
    &amp;lt;exclude name="**/RCS/**"/&amp;gt;
    &amp;lt;exclude name="**/rcs/**"/&amp;gt;
    &amp;lt;exclude name="**/.DS_Store/**"/&amp;gt;
    &amp;lt;exclude name="**/.svn/**"/&amp;gt;
    &amp;lt;exclude name="**/.pyc/**"/&amp;gt;
    &amp;lt;exclude name="**/.pyo/**"/&amp;gt;
    &amp;lt;exclude name="**/*.pyc/**"/&amp;gt;
    &amp;lt;exclude name="**/*.pyo/**"/&amp;gt;
    &amp;lt;exclude name="**/.git/**"/&amp;gt;
    &amp;lt;exclude name="**/.sbas/**"/&amp;gt;
    &amp;lt;exclude name="**/.IJI.*/**"/&amp;gt;
    &amp;lt;exclude name="**/vssver.scc/**"/&amp;gt;
    &amp;lt;exclude name="**/vssver2.scc/**"/&amp;gt;
  &amp;lt;/patternset&amp;gt;
  &amp;lt;patternset id="library.patterns"&amp;gt;
    &amp;lt;include name="*.zip"/&amp;gt;
    &amp;lt;include name="*.war"/&amp;gt;
    &amp;lt;include name="*.egg"/&amp;gt;
    &amp;lt;include name="*.ear"/&amp;gt;
    &amp;lt;include name="*.swc"/&amp;gt;
    &amp;lt;include name="*.jar"/&amp;gt;
  &amp;lt;/patternset&amp;gt;
  &amp;lt;patternset id="compiler.resources"&amp;gt;
    &amp;lt;include name="**/?*.properties"/&amp;gt;
    &amp;lt;include name="**/?*.xml"/&amp;gt;
    &amp;lt;include name="**/?*.gif"/&amp;gt;
    &amp;lt;include name="**/?*.png"/&amp;gt;
    &amp;lt;include name="**/?*.jpeg"/&amp;gt;
    &amp;lt;include name="**/?*.jpg"/&amp;gt;
    &amp;lt;include name="**/?*.html"/&amp;gt;
    &amp;lt;include name="**/?*.dtd"/&amp;gt;
    &amp;lt;include name="**/?*.tld"/&amp;gt;
    &amp;lt;include name="**/?*.ftl"/&amp;gt;
  &amp;lt;/patternset&amp;gt;

  &amp;lt;!-- JDK definitions --&amp;gt;

  &amp;lt;property name="jdk.bin.1.6" value="${jdk.home.1.6}/bin"/&amp;gt;
  &amp;lt;path id="jdk.classpath.1.6"&amp;gt;
    &amp;lt;fileset dir="${jdk.home.1.6}"&amp;gt;
      &amp;lt;include name="lib/deploy.jar"/&amp;gt;
      &amp;lt;include name="lib/dt.jar"/&amp;gt;
      &amp;lt;include name="lib/javaws.jar"/&amp;gt;
      &amp;lt;include name="lib/jce.jar"/&amp;gt;
      &amp;lt;include name="lib/management-agent.jar"/&amp;gt;
      &amp;lt;include name="lib/plugin.jar"/&amp;gt;
      &amp;lt;include name="lib/sa-jdi.jar"/&amp;gt;
      &amp;lt;include name="../Classes/charsets.jar"/&amp;gt;
      &amp;lt;include name="../Classes/classes.jar"/&amp;gt;
      &amp;lt;include name="../Classes/dt.jar"/&amp;gt;
      &amp;lt;include name="../Classes/jce.jar"/&amp;gt;
      &amp;lt;include name="../Classes/jconsole.jar"/&amp;gt;
      &amp;lt;include name="../Classes/jsse.jar"/&amp;gt;
      &amp;lt;include name="../Classes/laf.jar"/&amp;gt;
      &amp;lt;include name="../Classes/management-agent.jar"/&amp;gt;
      &amp;lt;include name="../Classes/ui.jar"/&amp;gt;
      &amp;lt;include name="lib/ext/apple_provider.jar"/&amp;gt;
      &amp;lt;include name="lib/ext/dnsns.jar"/&amp;gt;
      &amp;lt;include name="lib/ext/localedata.jar"/&amp;gt;
      &amp;lt;include name="lib/ext/sunjce_provider.jar"/&amp;gt;
      &amp;lt;include name="lib/ext/sunpkcs11.jar"/&amp;gt;
    &amp;lt;/fileset&amp;gt;
  &amp;lt;/path&amp;gt;

  &amp;lt;property name="project.jdk.home" value="${jdk.home.1.6}"/&amp;gt;
  &amp;lt;property name="project.jdk.bin" value="${jdk.bin.1.6}"/&amp;gt;
  &amp;lt;property name="project.jdk.classpath" value="jdk.classpath.1.6"/&amp;gt;

  &amp;lt;!-- Project Libraries --&amp;gt;

  &amp;lt;!-- Global Libraries --&amp;gt;

  &amp;lt;path id="library.clojure.classpath"&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/ant-launcher.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/ant.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/clojure-contrib.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/clojure.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/commons-codec-1.3.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/commons-fileupload-1.2.1.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/commons-io-1.4.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/compojure.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/hsqldb.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/jetty-6.1.14.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/jetty-util-6.1.14.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/jline-0.9.94.jar"/&amp;gt;
    &amp;lt;pathelement location="/Users/unclebob/projects/clojure-build/lib/servlet-api-2.5-6.1.14.jar"/&amp;gt;
  &amp;lt;/path&amp;gt;

  &amp;lt;!-- Modules --&amp;gt;

  &amp;lt;!-- Module BowlingForJunit --&amp;gt;

  &amp;lt;dirname property="module.bowlingforjunit.basedir" file="${ant.file}"/&amp;gt;

  &amp;lt;property name="module.jdk.home.bowlingforjunit" value="${project.jdk.home}"/&amp;gt;
  &amp;lt;property name="module.jdk.bin.bowlingforjunit" value="${project.jdk.bin}"/&amp;gt;
  &amp;lt;property name="module.jdk.classpath.bowlingforjunit" value="${project.jdk.classpath}"/&amp;gt;

  &amp;lt;property name="compiler.args.bowlingforjunit" value="${compiler.args}"/&amp;gt;

  &amp;lt;property name="bowlingforjunit.output.dir" value="${module.bowlingforjunit.basedir}/classes"/&amp;gt;
  &amp;lt;property name="bowlingforjunit.testoutput.dir" value="${module.bowlingforjunit.basedir}/classes"/&amp;gt;

  &amp;lt;path id="bowlingforjunit.module.bootclasspath"&amp;gt;
    &amp;lt;!-- Paths to be included in compilation bootclasspath --&amp;gt;
  &amp;lt;/path&amp;gt;

  &amp;lt;path id="bowlingforjunit.module.classpath"&amp;gt;
    &amp;lt;path refid="${module.jdk.classpath.bowlingforjunit}"/&amp;gt;
    &amp;lt;pathelement location="/Library/junit4.6/junit-4.6.jar"/&amp;gt;
    &amp;lt;path refid="library.clojure.classpath"/&amp;gt;
    &amp;lt;pathelement location="${basedir}/classes"/&amp;gt;
  &amp;lt;/path&amp;gt;

  &amp;lt;path id="bowlingforjunit.runtime.module.classpath"&amp;gt;
    &amp;lt;pathelement location="${bowlingforjunit.output.dir}"/&amp;gt;
    &amp;lt;pathelement location="/Library/junit4.6/junit-4.6.jar"/&amp;gt;
    &amp;lt;path refid="library.clojure.classpath"/&amp;gt;
    &amp;lt;pathelement location="${basedir}/classes"/&amp;gt;
  &amp;lt;/path&amp;gt;

  &amp;lt;patternset id="excluded.from.module.bowlingforjunit"&amp;gt;
    &amp;lt;patternset refid="ignored.files"/&amp;gt;
  &amp;lt;/patternset&amp;gt;

  &amp;lt;patternset id="excluded.from.compilation.bowlingforjunit"&amp;gt;
    &amp;lt;patternset refid="excluded.from.module.bowlingforjunit"/&amp;gt;
  &amp;lt;/patternset&amp;gt;

  &amp;lt;path id="bowlingforjunit.module.sourcepath"&amp;gt;
    &amp;lt;dirset dir="${module.bowlingforjunit.basedir}"&amp;gt;
      &amp;lt;include name="src"/&amp;gt;
    &amp;lt;/dirset&amp;gt;
  &amp;lt;/path&amp;gt;

  &amp;lt;target name="compile" depends="clojure, compile.java" description="Compile module BowlingForJunit"/&amp;gt;

  &amp;lt;target name="compile.java" description="Compile module BowlingForJunit; production classes"&amp;gt;
    &amp;lt;mkdir dir="${bowlingforjunit.output.dir}"/&amp;gt;
    &amp;lt;javac destdir="${bowlingforjunit.output.dir}" debug="${compiler.debug}" nowarn="${compiler.generate.no.warnings}" 
           memorymaximumsize="${compiler.max.memory}" fork="true" executable="${module.jdk.bin.bowlingforjunit}/javac"&amp;gt;
      &amp;lt;compilerarg line="${compiler.args.bowlingforjunit}"/&amp;gt;
      &amp;lt;bootclasspath refid="bowlingforjunit.module.bootclasspath"/&amp;gt;
      &amp;lt;classpath refid="bowlingforjunit.module.classpath"/&amp;gt;
      &amp;lt;src refid="bowlingforjunit.module.sourcepath"/&amp;gt;
      &amp;lt;patternset refid="excluded.from.compilation.bowlingforjunit"/&amp;gt;
    &amp;lt;/javac&amp;gt;

    &amp;lt;copy todir="${bowlingforjunit.output.dir}"&amp;gt;
      &amp;lt;fileset dir="${module.bowlingforjunit.basedir}/src"&amp;gt;
        &amp;lt;patternset refid="compiler.resources"/&amp;gt;
        &amp;lt;type type="file"/&amp;gt;
      &amp;lt;/fileset&amp;gt;
    &amp;lt;/copy&amp;gt;
  &amp;lt;/target&amp;gt;

  &amp;lt;target name="clojure"&amp;gt;
    &amp;lt;java classname="clojure.lang.Compile"&amp;gt;
      &amp;lt;classpath&amp;gt;
        &amp;lt;path location="/Users/unclebob/projects/clojure/BowlingForJunit/classes"/&amp;gt;
        &amp;lt;path location="/Users/unclebob/projects/clojure/BowlingForJunit/src"/&amp;gt;        
        &amp;lt;path location="/Users/unclebob/projects/clojure/BowlingForJunit/src/bowling"/&amp;gt;
        &amp;lt;path location="/Users/unclebob/projects/clojure-build/lib/clojure.jar"/&amp;gt;
        &amp;lt;path location="/Users/unclebob/projects/clojure-build/lib/clojure-contrib.jar"/&amp;gt;  
      &amp;lt;/classpath&amp;gt;
      &amp;lt;sysproperty key="clojure.compile.path" value="/Users/unclebob/projects/clojure/BowlingForJunit/classes"/&amp;gt;
      &amp;lt;sysproperty key="java.awt.headless" value="true"/&amp;gt;
      &amp;lt;arg value="bowling.Game"/&amp;gt;
    &amp;lt;/java&amp;gt;
  &amp;lt;/target&amp;gt;

  &amp;lt;target name="clean" description="cleanup module"&amp;gt;
    &amp;lt;delete dir="${bowlingforjunit.output.dir}"/&amp;gt;
    &amp;lt;delete dir="${bowlingforjunit.testoutput.dir}"/&amp;gt;
    &amp;lt;mkdir  dir="${bowlingforjunit.output.dir}"/&amp;gt;
  &amp;lt;/target&amp;gt;

  &amp;lt;target name="all" depends="clean, compile" description="build all"/&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;</description>
      <pubDate>Fri, 07 Aug 2009 17:00:43 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6d45354f-02f4-4519-aebc-dad2102743cf</guid>
      <author>Uncle Bob</author>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure</link>
      <category>Uncle Bob's Blatherings</category>
    </item>
    <item>
      <title>"Java calling Clojure." by Discount Louboutin Shoes</title>
      <description>&lt;p&gt;Every women always has Christian Louboutins Wedding Shoes turn of fame but it also has its own goodbyes.&lt;/p&gt;</description>
      <pubDate>Wed, 11 Jan 2012 20:07:18 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:08772f81-cba6-4e80-8524-2b3d5b239f61</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-197058</link>
    </item>
    <item>
      <title>"Java calling Clojure." by christian louboutin</title>
      <description>&lt;p&gt;Great website you have here but I was curious if you knew of any community forums that cover the same topics talked about in this article? I&#8217;d really like to be a part of group where I can get responses from other knowledgeable individuals that share the same interest. If you have any suggestions, please let me know. Kudos!&lt;/p&gt;</description>
      <pubDate>Thu, 03 Nov 2011 11:40:02 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:ce997051-c009-41d6-b697-24eaaf2da55d</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-167730</link>
    </item>
    <item>
      <title>"Java calling Clojure." by christian louboutin</title>
      <description>&lt;p&gt;The professional design make you foot more comfortable. Even more tantalizing,this pattern make your legs look as long as you can,it will make you looked more attractive.Moveover,it has reasonable price.If you are a popular woman,do not miss it.&lt;/p&gt;


	&lt;p&gt;Technical details of Christian Louboutin Velours Scrunch Suede Boots Coffee:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Color: Coffee
Material: Suede
4(100mm) heel
Signature red sole x&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Fashion, delicate, luxurious Christian louboutins shoes on sale, one of its series is Christian Louboutin Tall Boots, is urbanism collocation. This Christian louboutins shoes design makes people new and refreshing. Red soles shoes is personality, your charm will be wonderful performance.&lt;/p&gt;</description>
      <pubDate>Thu, 03 Nov 2011 11:13:25 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:beccb5c1-96de-4194-97d9-14365188c905</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-167706</link>
    </item>
    <item>
      <title>"Java calling Clojure." by ysbearing/yisong@1stbearing.com</title>
      <description>&lt;p&gt;Slewing bearing called slewing ring bearings, is a comprehensive load to bear a large bearing, can bear large axial, radial load and overturning moment. &lt;a href="http://www.1stbearing.com" rel="nofollow"&gt;http://www.1stbearing.com&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 19 Oct 2011 02:00:20 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c7a8524f-9eb5-4390-afff-3c81c7ab6bc6</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-159357</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Tips For Bowling</title>
      <description>&lt;p&gt;Great website you have here but I was curious if you knew of any community forums that cover the same topics talked about in this article? I&amp;#8217;d really like to be a part of group where I can get responses from other knowledgeable individuals that share the same interest. If you have any suggestions, please let me know. Kudos!&lt;/p&gt;</description>
      <pubDate>Tue, 18 Oct 2011 12:11:57 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0a16ebe5-700f-4b74-a259-44bcfd6ac1b0</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-159085</link>
    </item>
    <item>
      <title>"Java calling Clojure." by MTS ????????? Mac</title>
      <description>&lt;p&gt;The public may not have known what the messages meant, but it helped pay for them. The skywriting stunt was supported by city and state public funding, according to the High Line&amp;#8217;s website.  &lt;a href="http://www.mts-converter.ru" rel="nofollow"&gt;MTS ???&lt;/a&gt;  &amp;#8220;I wanted a narrative trajectory towards something optimistic at the end, which was the last message, &amp;#8216;Now Open,&amp;#8217;&amp;#8221; she said of the work. &lt;a href="http://www.mts-converter.ru/mts-converter-for-mac.htm" rel="nofollow"&gt;MTS ??? Mac&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 11 Oct 2011 01:01:58 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e15e2af5-96ac-4619-832e-5978ca35b8cc</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-154048</link>
    </item>
    <item>
      <title>"Java calling Clojure." by best sleep aid</title>
      <description>&lt;p&gt;When I at first left a comment I clicked the &amp;#8220;Notify me when new comments are added&amp;#8221; checkbox and now each time a comment is added I get three notification emails with the same comment. Is there any way you can take away people from that service? Thanks a lot!&lt;/p&gt;</description>
      <pubDate>Fri, 30 Sep 2011 13:21:43 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0c4b72dd-c45a-4a98-89ce-c12b318e496d</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-148631</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Tory Burch outlet store</title>
      <description>&lt;p&gt;It was a beneficial workout for me to go through your webpage&lt;/p&gt;</description>
      <pubDate>Wed, 21 Sep 2011 21:17:12 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d7ea7935-1d44-42b1-abbf-ba0d82837555</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-143904</link>
    </item>
    <item>
      <title>"Java calling Clojure." by canada goose coat</title>
      <description>&lt;p&gt;&lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-expedition-parka-c-2.html" rel="nofollow"&gt;Canada Goose Outlet&lt;/a&gt;
is Marmot 8000M Parka. The Marmot 8000M Parka is really a waterproof, breathable jacket with 800 fill &lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-youth-parka-c-7.html" rel="nofollow"&gt;canada goose jacket&lt;/a&gt; feathers. It truly is design and light colored shell is produced for trendy, but uncomplicated, protection from cold temperatures. Reinforced shoulders, elbows and adjustable waist and hem make the Marmot a perfect alternate for skiing and other outdoor sports that want fairly a bit of arm motion. The 8000M Parka weighs three lbs., comes in bonfire and black colours and might be stuffed and stored like a sleeping bag to your convenience.This is one of well-know and prime down jacket brands.Hope our friends like its!Like &lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-womens-c-8.html" rel="nofollow"&gt;canada goose womens&lt;/a&gt; and &lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-expedition-parka-c-2.html" rel="nofollow"&gt;Canada Goose Expedition Parka&lt;/a&gt;.There are &lt;a href="http://www.shopcanadagoosejackets.com/" rel="nofollow"&gt;wholesale canada goose&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Sep 2011 02:23:10 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:337c1930-7732-4de3-9979-0e6900efdc7d</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-142645</link>
    </item>
    <item>
      <title>"Java calling Clojure." by beats by dre store</title>
      <description>&lt;p&gt;, I really enjoyed reading it and will certainly share this post with my friends . Learn &lt;a href="http://www.drdrebeatsheadphones-australia.com" rel="nofollow"&gt;high quality headphones&lt;/a&gt;
&lt;a href="http://www.drdrebeatsheadphones-australia.com" rel="nofollow"&gt;new design headphones&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 23 Aug 2011 03:40:25 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8790cf0d-30c8-49c4-917e-2142a73df935</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-131696</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Crystal Jewellery</title>
      <description>&lt;p&gt;Great post! Nice and informative, I really enjoyed reading it and will certainly share this post with my friends .  Learn everything  about  &lt;a href="http://www.jewelleryxy.com/what-is-cubic-zirconia.html" rel="nofollow"&gt;what is cubic zirconia&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 18 Aug 2011 13:08:10 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6e131a68-2b9a-4d91-8039-b5b8f4ff42fe</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-129503</link>
    </item>
    <item>
      <title>"Java calling Clojure." by danner boots</title>
      <description>&lt;p&gt;thinking about which i listen to an eclectic
&lt;a href="http://www.chiefsupply.com/search/danner+boots" rel="nofollow"&gt;danner boots&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 09 Jun 2011 04:04:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6b941d46-0f5e-40dc-91cf-3be2ade839e4</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-109393</link>
    </item>
    <item>
      <title>"Java calling Clojure." by danner boots</title>
      <description>&lt;p&gt;The ant script we used was created for us by IntelliJ
&lt;a href="http://www.chiefsupply.com/search/danner+boots" rel="nofollow"&gt;danner boots&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 09 Jun 2011 03:59:56 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:590346ee-af6b-4ed8-b66b-a9979e2123b7</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-109390</link>
    </item>
    <item>
      <title>"Java calling Clojure." by beats by dr dre headphones</title>
      <description>&lt;p&gt;I attempted these &lt;a href="http://www.drebeatsstudio.com/beats-by-dr-dre-studio-c-3.html" rel="nofollow"&gt;beats by dr dre studio&lt;/a&gt; out in several genres thinking about which i listen to an eclectic mix Beats By Dr Dre. a washing cloth as well as the manual. Do not purchase any &lt;a href="http://www.drebeatsstudio.com/monster-beats-by-dr-dre-solo-headphones-purple-p-41.html" rel="nofollow"&gt;beats by dr dre solo purple&lt;/a&gt; products inside the internet unless you&amp;#8217;re getting from an Authorized internet DealerBeats By Dre Just Solo. We are reliable provide good &lt;a href="http://www.drebeatsstudio.com/monster-beats-by-dr-dre-pro-headphones-black-p-15.html" rel="nofollow"&gt;beats by dr dre pro black&lt;/a&gt; by reduced price.&lt;/p&gt;</description>
      <pubDate>Thu, 09 Jun 2011 02:56:47 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6ba2f3cb-26d1-4fc8-827f-c915e919f9cc</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-109357</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Hancy</title>
      <description>&lt;p&gt;Hello Friend,Whichever style of Fashion Shoes you&amp;#8217;re looking for, classical, fashionable, lovely or the latest design, you can find your favorite designer shoes in &lt;a href="http://www.dunkpage.com" rel="nofollow"&gt;www.dunkpage.com&lt;/a&gt; ,several days ago I bought one pair of shoes from there,It&amp;#8217;s beautiful and very comfortable!&lt;/p&gt;</description>
      <pubDate>Wed, 08 Jun 2011 10:52:36 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d52a196c-cbff-42f5-b3a7-d83ca855bc14</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-109076</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Jewellery</title>
      <description>&lt;p&gt;Online UK costume and fashion jewellery shop with,&lt;/p&gt;</description>
      <pubDate>Mon, 06 Jun 2011 00:35:32 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c2bd8625-bf25-4f2c-9867-f930ca6b5343</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-108424</link>
    </item>
    <item>
      <title>"Java calling Clojure." by coach purses</title>
      <description>&lt;p&gt;Mr Coates &lt;a href="http://www.coachonlinehandbags.com" rel="nofollow"&gt;&lt;strong&gt;coach purses&lt;/strong&gt;&lt;/a&gt; is the longest U.S. market popular with one of the most successful leather brand. Mr Coates &lt;a href="http://www.coachonlinehandbags.com" rel="nofollow"&gt;&lt;strong&gt;coach purses store&lt;/strong&gt;&lt;/a&gt; represents the most admirable American fashion innovative style and traditional skills .  Mr Coates &lt;a href="http://www.coachonlinehandbags.com" rel="nofollow"&gt;&lt;strong&gt;coach bags&lt;/strong&gt;&lt;/a&gt; have durable quality and exquisite technology, &lt;a href="http://www.coachonlinehandbags.com/conspicuous-coach-heels-c-79.html" rel="nofollow"&gt;&lt;strong&gt;Conspicuous Coach Heels&lt;/strong&gt;&lt;/a&gt; in the female consumers have good reputation. Welcome to our shop &lt;a href="http://www.coachonlinehandbags.com/elegant-coach-purses-c-83.html" rel="nofollow"&gt;&lt;strong&gt;Elegant Coach Purses&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 23 May 2011 21:59:47 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f3adb216-2c9a-4e75-aa75-5e7fb28dbf3f</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-103043</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Movies 2011</title>
      <description>&lt;p&gt;Bad news has wings. Better to ask the way than go astray. By reading we enrich the mind, by conversation we&lt;/p&gt;</description>
      <pubDate>Mon, 23 May 2011 02:28:26 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:88c1769c-4dc9-4c0e-9f97-fa7832a52ef7</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-102505</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Futons Lover</title>
      <description>&lt;p&gt;I got curious and followed the same procedure. I got errors initially. But the errors were not that informative.&lt;/p&gt;</description>
      <pubDate>Fri, 20 May 2011 09:12:43 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7845e3f3-4584-4812-b1ef-65ebce88e399</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-101849</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Futons Lover</title>
      <description>&lt;p&gt;I got curious and followed the same procedure. I got errors initially. But the errors were not that informative.&lt;/p&gt;</description>
      <pubDate>Fri, 20 May 2011 09:12:14 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:bdef7fff-5a8d-4076-8064-18a16408521b</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-101848</link>
    </item>
    <item>
      <title>"Java calling Clojure." by Great post, thanks</title>
      <description>&lt;p&gt;Designer handbags are considered prized possessions by most women all over the world. And &lt;a href="http://www.dearbags.com/31-phillip-lim-handbags-c-169_243.html" rel="nofollow"&gt;phillip lim handbags&lt;/a&gt; add class and sophistication to one&amp;#8217;s style quotient, giving that extra dose required to make heads turn. Most people all over the world love to own at least one designer brand or another, and strive to fill their wardrobe with collection of big names; be it clothes, designer bags or shoes and boots. &lt;a href="http://www.cheap-handbags-shop.com/31-phillip-lim-handbags-c-169_243.html" rel="nofollow"&gt;phillip lim handbags&lt;/a&gt; are especially a favorite with women; who simply go crazy if they can get hold of handbags that are used by celebrities and big shots of the Hollywood industry. In many cases, ladies have gone an extra mile to pay steep prices for designer bags, just because of the brand name. But this is not so with &lt;a href="http://www.toshophandbags.com/31-phillip-lim-handbags-c-169_243.html" rel="nofollow"&gt;phillip lim handbags&lt;/a&gt;. It is quite affordable, and the best part is you get value for money. The exceptional designs, durable quality, unique patterns and great stitching and craftsmanship have all made this brand a name to reckon with. &lt;a href=" &lt;a href=" rel="nofollow"&gt;http://www.mona.uwi.edu/&lt;/a&gt;"&gt;phillip lim handbags change their style very often; but with a Phillip Lim you needn&amp;#8217;t worry about changing it every other day since the name in itself creates magic.&lt;/p&gt;</description>
      <pubDate>Thu, 28 Apr 2011 20:44:26 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:789d58b6-15d4-4f9b-8481-36ebf82f60f5</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-93029</link>
    </item>
    <item>
      <title>"Java calling Clojure." by okey oyunu oyna </title>
      <description>&lt;p&gt;useful article. Thanks&lt;/p&gt;


	&lt;p&gt;internette g&#246;r&#252;nt&#252;l&#252; olarak &lt;a href="http://www.okeyoyunu-oyna.com" rel="nofollow"&gt;okey oyunu oyna&lt;/a&gt;, ger&#231;ek kisilerle tanis,
 turnuva heyecanini yasa.&lt;/p&gt;</description>
      <pubDate>Thu, 28 Apr 2011 15:11:59 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:76caf495-59ae-4797-99a5-fb05c62c888f</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-92790</link>
    </item>
    <item>
      <title>"Java calling Clojure." by belstaff</title>
      <description>&lt;p&gt;In order to meet all demands, producing &lt;a href="http://www.belstafflondon.com/" rel="nofollow"&gt;&lt;b&gt;belstaff jackets&lt;/b&gt;&lt;/a&gt;&lt;br&gt; never reduce. So many brands in the world conluding North Face jackets, &lt;a href="http://www.belstafflondon.com/belstaff-jackets/mens-belstaff-jackets.html/" rel="nofollow"&gt;&lt;b&gt;Mens Belstaff Jackets&lt;/b&gt;&lt;/a&gt;&lt;br&gt;    , columbia jackets and also spyder &lt;a href="http://www.belstafflondon.com/" rel="nofollow"&gt;&lt;b&gt;belstaff jacket&lt;/b&gt;&lt;/a&gt;&lt;br&gt;, each of them is high quality, workmanship, stylish and comfortable, add waterproof and durable freature, they also support for extreme sports.&lt;/p&gt;</description>
      <pubDate>Thu, 21 Apr 2011 19:32:38 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:088dad98-7831-4ded-97ac-01619f2f0a5a</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-88947</link>
    </item>
    <item>
      <title>"Java calling Clojure." by coach bags</title>
      <description>&lt;p&gt;good post,i like this&lt;/p&gt;</description>
      <pubDate>Tue, 19 Apr 2011 22:26:55 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:de25c779-06dd-4d23-8983-8306f4614e21</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-87419</link>
    </item>
    <item>
      <title>"Java calling Clojure." by www.belstafflondon.com </title>
      <description>&lt;p&gt;They are fashionable and difficult at travel and out door. &lt;a href="http://www.belstafflondon.com/" rel="nofollow"&gt;&lt;b&gt;belstaff&lt;/b&gt;&lt;/a&gt; colonial collection goes with well. Our belstaff synthetic &lt;a href="http://www.belstafflondon.com/" rel="nofollow"&gt;&lt;b&gt; belstaff jacket&lt;/b&gt;&lt;/a&gt; sunglasses withtremendous discounted and free shipping. you could potentially conserve 50%-60% off at our &lt;a href="http://www.belstafflondon.com/" rel="nofollow"&gt;&lt;b&gt;belstaff sale&lt;/b&gt;&lt;/a&gt;.You must know regarding the manufacturer title men moncler&lt;a href="http://www.belstafflondon.com/" rel="nofollow"&gt;&lt;b&gt;belstaff jackets&lt;/b&gt;&lt;/a&gt; in the event that you could potentially be an outdoor enthusiast.&lt;/p&gt;</description>
      <pubDate>Thu, 14 Apr 2011 21:09:22 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a7b85a1d-b14c-41a7-944d-cedee6bb58b1</guid>
      <link>http://blog.objectmentor.com/articles/2009/08/07/java-calling-clojure#comment-85151</link>
    </item>
  </channel>
</rss>

