<?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>Clojure/core Blog</title>
 
 <link href="http://clojure.com/blog/" />
 <updated>2012-02-22T16:33:43-05:00</updated>
 <id>http://clojure.com/</id>
 <author>
   <name>Clojure/core Blog</name>
   <email>clojure@thinkrelevance.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Clojure/coreBlog" /><feedburner:info uri="clojure/coreblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><entry>
   <title>All Conj 2011 Videos Available</title>
   <link href="http://clojure.com/blog/2012/02/20/all-conj-2011-videos-available.html" />
   <updated>2012-02-20T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/20/all-conj-2011-videos-available</id>
   <content type="html">&lt;p&gt;The remaining six Clojure/conj 2011 videos have been released, and all videos are now available on &lt;a href="http://clojure.blip.tv/"&gt;Clojure's blip.tv page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you once more to all of our speakers and attendees.  If we don't see you at &lt;a href="http://clojurewest.org/"&gt;Clojure/west&lt;/a&gt; or &lt;a href="http://euroclojure.com/2012/"&gt;EuroClojure&lt;/a&gt; first, we'll see you at the next Conj!&lt;/p&gt;

&lt;h3&gt;Scheduled Talk Videos&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Keynote&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/richhickey"&gt;Rich Hickey&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/rich-hickey-keynote-5970064"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Cascalog: Making Data Processing Fun Again&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/nathanmarz"&gt;Nathan Marz&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/nathan-marz-cascalog-making-data-processing-fun-again-5970118"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Extreme Cleverness: Functional Data Structures in Scala&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/djspiewak"&gt;Daniel Spiewak&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/daniel-spiewak-extreme-cleverness-functional-data-structures-in-scala-5970151"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Performance in the Wild&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/craigandera"&gt;Craig Andera&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/craig-andera-performance-in-the-wild-5970188"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;The Macronomicon&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/fogus"&gt;Michael Fogus&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/michael-fogus-the-macronomicon-5970233"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Programming Music with Overtone&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/samaaron"&gt;Sam Aaron&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/sam-aaron-programming-music-with-overtone-5970273"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Clojure/huh? - Clojure's Governance and How It Got That Way</title>
   <link href="http://clojure.com/blog/2012/02/17/clojure-governance.html" />
   <updated>2012-02-17T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/17/clojure-governance</id>
   <content type="html">&lt;h2&gt;Enter Rich, with Parentheses&lt;/h2&gt;

&lt;p&gt;In the beginning, there was a guy with an idea. That guy was Rich Hickey, and his idea was to combine the power of Lisp with the reach of a modern managed runtime. He started with &lt;a href="http://jfli.sourceforge.net/"&gt;Jfli&lt;/a&gt;, embedding a JVM in Lispworks' Common Lisp implementation. When that proved inadequate, he took a two-year sabbatical to write the compiler that would eventually become &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;: a completely new Lisp for the JVM with language-level concurrency support.&lt;/p&gt;

&lt;p&gt;In late 2007, Rich Hickey presented Clojure at a meeting of the New York Lisp users' group, &lt;a href="http://lispnyc.org/"&gt;LispNYC&lt;/a&gt;. I was there, and I was so excited by what I saw that I wrote one of the &lt;a href="http://stuartsierra.com/2007/11/15/clojure-a-lisp-worth-talking-about"&gt;first blog articles about Clojure&lt;/a&gt;. Three days later, I was asking questions about Java interop on the &lt;a href="http://groups.google.com/group/clojure"&gt;Clojure mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Those early days were fun, participating in heady discussions about fundamental language features like &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/3a76a052b419d4d1/d57ae6ad6efb0d4e?#d57ae6ad6efb0d4e"&gt;nil vs. false&lt;/a&gt; and &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/8b2c8dc96b39ddd7/5237b9d3ab300df8"&gt;argument order&lt;/a&gt;. It felt like the beginning of something genuinely new. The community was tiny, and Rich participated in almost every discussion on the mailing list or IRC.&lt;/p&gt;

&lt;p&gt;How times have changed. The Clojure mailing list has over five thousand members, and we just wrapped up the &lt;a href="http://clojure-conj.org/"&gt;second international Clojure conference&lt;/a&gt; with nearly four hundred attendees. Google Groups tells me I've racked up over a thousand posts on the mailing list, which is shocking to me. There are five books and counting about Clojure. People are building businesses and careers on it. Who would have guessed, in 2007, that we would be here in just four years?&lt;/p&gt;

&lt;h2&gt;Enter Second Stuart&lt;/h2&gt;

&lt;p&gt;(That was a cheap shot. Hi, Stu! :)&lt;/p&gt;

&lt;p&gt;In the Summer of 2008, Stuart Halloway started &lt;a href="http://thinkrelevance.com/blog/2008/07/30/clojure.html"&gt;blogging about Clojure&lt;/a&gt;. With his co-founder Justin Gehtland, Stuart H. had already &lt;a href="http://thinkrelevance.com/"&gt;built a business&lt;/a&gt; helping big companies navigate from ponderous Java development to more agile practices and more expressive languages like Ruby. Stuart H. decided that Clojure was the &lt;a href="http://thinkrelevance.com/blog/2009/10/19/the-case-for-clojure.html"&gt;next big thing&lt;/a&gt;. He wrote the &lt;a href="http://pragprog.com/book/shcloj/programming-clojure"&gt;first book about Clojure&lt;/a&gt; (soon to get a &lt;a href="http://pragprog.com/book/shcloj2/programming-clojure"&gt;2nd edition&lt;/a&gt;). When he and Rich met at the 2008 JVM Language Summit, they started a long conversation that would eventually become a partnership.&lt;/p&gt;

&lt;h2&gt;Clojure Contrib: The Beginning&lt;/h2&gt;

&lt;p&gt;Around the same mid-2008 time frame, "clojure-contrib" began its life as a Subversion repository where community members could share code. There were twelve committers and no rules, just a bunch of Clojure source files containing code that we found useful. I contributed str-utils, seq-utils, duck-streams, and later test-is.&lt;/p&gt;

&lt;p&gt;The growth of contrib eventually led to the need for some kind of library loading scheme more expressive than &lt;code&gt;load-file&lt;/code&gt;. I wrote a primitive &lt;code&gt;require&lt;/code&gt; function that took a file name argument and loaded it from the classpath. Steve Gilardi modified &lt;code&gt;require&lt;/code&gt; to take a namespace symbol instead of a file. I suggested &lt;code&gt;use&lt;/code&gt; as the shortcut for the common case of &lt;code&gt;require&lt;/code&gt; followed by &lt;code&gt;refer&lt;/code&gt;. This all happened fairly quickly, without a lot of consideration or planning, culminating in the &lt;code&gt;ns&lt;/code&gt; macro. The peculiarities of the &lt;code&gt;ns&lt;/code&gt; macro grew directly out of this work, so you can blame us for that.&lt;/p&gt;

&lt;p&gt;Clojure-contrib also prompted a question that every open-source software project must grapple with: how to handle ownership. We'd already &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/4eea23108b2ed46e/e69c92cd7be8826a"&gt;gone through two licenses&lt;/a&gt;: the Common Public License and its successor, the Eclipse Public License.&lt;/p&gt;

&lt;p&gt;Rich &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/6de5840e5ab9abdf/306f63a87d34e5f1"&gt;proposed a Clojure Contributor Agreement&lt;/a&gt; as a means to protect Clojure's future. The motivation for the CA was to make sure Clojure would always be open-source but never trapped by a particular license. The Clojure CA is a covenant between the contributor and Rich Hickey: the contributor assigns joint ownership of his contributions to Rich. In return, Rich promises that Clojure will always be available under an open-source license approved by the &lt;a href="http://www.fsf.org/"&gt;FSF&lt;/a&gt; or the &lt;a href="http://www.opensource.org/"&gt;OSI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some open-source projects got stuck with the first license under which contributions were made. Under the CA, if the license ever needs to change again, there would be no obstacles and no need to get permission from every past contributor. Agreements like this have become standard practice for owners of large open-source projects like &lt;a href="http://www.eclipse.org/legal/committer_process/EclipseIndividualCommitterAgreementFinal.pdf"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://www.apache.org/licenses/icla.txt"&gt;Apache&lt;/a&gt;, and &lt;a href="http://www.oracle.com/technetwork/community/oca-486395.html"&gt;Oracle&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Clojure/core and "New Contrib"&lt;/h2&gt;

&lt;p&gt;In 2010 I left my cozy academic job and went to work for Relevance, where Stuart Halloway and Rich were discussing a strategic partnership that would eventually become &lt;a href="http://clojure.com/"&gt;Clojure/core&lt;/a&gt;. So what is Clojure/core? It's a business initiative of Relevance (though not an independent business entity) to provide consulting, training, and development-for-hire services around Clojure. Rich Hickey is an advisor to Clojure/core, but not a Relevance employee.&lt;/p&gt;

&lt;p&gt;Members of Clojure/core, of which I am one, have made a commitment to spend their &lt;a href="http://thinkrelevance.com/blog/2011/08/01/Friday-Update.html"&gt;20% time&lt;/a&gt; supporting the Clojure ecosystem. Although Rich still personally reviews every patch for the language itself, the job of answering questions and organizing contributions from a 5000-member community is too big for one person, so Rich delegated that responsibility to Clojure/core.&lt;/p&gt;

&lt;p&gt;The first big issue Clojure/core had to confront was the distribution of clojure-contrib. With sixty-plus libraries in one binary release, it was already unwieldy. Since clojure-contrib releases were tied to Clojure language releases, which happened infrequently, development had stalled. There was also vast confusion about what, exactly, clojure-contrib was meant to be. Was it an essential component of the language, a nascent standard library, or a load of crap? (I was inclined to the latter view, especially with regard to my own contributions.)&lt;/p&gt;

&lt;p&gt;My attempts at &lt;a href="https://github.com/clojure/clojure-contrib/commit/a6a92b9b3d2bfd9a56e1e5e9cfba706d1aeeaae5"&gt;modularizing clojure-contrib within a single Git repository&lt;/a&gt; failed to improve the situation. Eventually, we settled on the solution of separate Git repositories for each library. This was a huge amount of work: dozens of repositories to create and hundreds of files to move. Many of the contrib libraries were stagnant, their original authors lacking time to continue working on them.&lt;/p&gt;

&lt;p&gt;Finally, almost a year later, the situation has stabilized: &lt;a href="http://dev.clojure.org/display/doc/Clojure%2BContrib"&gt;28 libraries&lt;/a&gt;, each with its own Git repository, test suite, &lt;a href="http://build.clojure.org/"&gt;continuous integration&lt;/a&gt;, and independent release cycle. The overall code quality is higher and development is moving forward again.&lt;/p&gt;

&lt;p&gt;It was a painful transition for everyone, not least for those of us trying to manage it all and bear the brunt of the inevitable carping. On top of everything else, the whole process overlapped with the release of Clojure 1.3, the first release to break backwards-compatibility in noticeable ways (non-dynamic Vars as a default, long/double as default numeric types).&lt;/p&gt;

&lt;p&gt;Our technology choices for Clojure and "new contrib" — GitHub, JIRA, Hudson, and Maven — were driven by several concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to be first-class participants in the Java ecosystem&lt;/li&gt;
&lt;li&gt;to preserve the future-proof licensing structure of the CA&lt;/li&gt;
&lt;li&gt;to give library developers freedom to develop/release on their own schedule&lt;/li&gt;
&lt;li&gt;to ensure changes are made only after a thorough review process&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The last point was particularly important for patches to the Clojure language. Clojure is &lt;em&gt;very&lt;/em&gt; stable: since its first public release, implementation bugs have been rare and regressions almost nonexistent. Most reported bugs are edge cases in Java interop. But stability has a price: new features come more slowly. The majority of JIRA tickets on Clojure are really feature requests. Rich is extremely conservative about adding features to the language, and he has impressed this view on Clojure/core for the purpose of screening tickets.&lt;/p&gt;

&lt;p&gt;To take one prominent example, &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/aa57ab265f7474a/51bb53ca077154f8"&gt;named arguments were discussed&lt;/a&gt; as far back as January 2008. Community members developed the &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/d4f5f04f6894c741/4d3051dc6604df5d"&gt;defnk macro&lt;/a&gt; to facilitate writing functions with named arguments, and &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/de791a1a28659ea/6020c7db6bb74844"&gt;lobbied to add it&lt;/a&gt; to Clojure. Finally, in March 2010, Rich made a &lt;a href="https://github.com/clojure/clojure/commit/29389970bcd41998359681d9a4a20ee391a1e07c"&gt;one-line commit&lt;/a&gt; adding support for map destructuring from sequential collections. This gave the benefit of keyword-style parameters everywhere destructuring is supported, including function arguments. By waiting, and thinking, we got something better than defnk. If defnk had been accepted earlier, we might have been stuck with an inferior implementation.&lt;/p&gt;

&lt;p&gt;Conversely, the decision to move some libraries into the language, notably my testing library, was probably premature. (Stuart Halloway accepts blame for that one. :) Some of the decisions I made in that library could use revisiting, but now clojure.test is what we're stuck with.&lt;/p&gt;

&lt;h2&gt;Clojure/dev and the Future&lt;/h2&gt;

&lt;p&gt;If there was one mistake that I personally made during the 1.3 migration, it was speaking as if Clojure/core &lt;em&gt;owned&lt;/em&gt; Clojure and clojure-contrib. We don't: Clojure is owned by Rich Hickey, and clojure-contrib is owned jointly by Rich Hickey and contributors. But we &lt;em&gt;are&lt;/em&gt; the appointed stewards (and Stuarts!) of the open-source Clojure ecosystem. In that role, we have to make decisions about what we choose to invest time in supporting. Given limited time, and following Rich's conservative position on new features, that decision is usually "no."&lt;/p&gt;

&lt;p&gt;It's a difficult position to be in. Most of Clojure/core's members come from the free-wheeling, fast-paced open-source world of Ruby on Rails. We really don't enjoy saying "no" all the time. But a conservative attitude toward new features is exactly the reason Clojure is so stable. Patches don't get into the language until they have been &lt;a href="http://dev.clojure.org/display/design/JIRA%2Bworkflow"&gt;reviewed by at least three people&lt;/a&gt;, one of them Rich Hickey. New libraries don't get added to &lt;a href="http://dev.clojure.org/display/design/Clojure%2BContrib"&gt;clojure-contrib&lt;/a&gt; without multiple mailing-list discussions. None of the new contrib libraries has reached the &lt;a href="http://dev.clojure.org/display/design/Contrib%2B1.0.0%2BReleases"&gt;1.0.0 milestone&lt;/a&gt;, and probably won't for some time. These hurdles are not arbitrary; they are an attempt to guarantee that new additions to Clojure reflect the same consideration and careful design that Rich invested in the original implementation.&lt;/p&gt;

&lt;p&gt;So what is clojure-contrib today? It's a curated set of libraries whose ownership and licensing is governed by the Clojure Contributor Agreement. It could also serve as a proving ground for new features in the language, but this does not imply that every contrib library will eventually make it into the language.&lt;/p&gt;

&lt;p&gt;With the expansion of contrib, we've given name to another layer of organization: &lt;em&gt;Clojure/dev&lt;/em&gt;. Clojure/dev is the set of all people who have signed the Clojure Contributor Agreement. This entitles them to participate in discussions on the &lt;a href="http://groups.google.com/group/clojure-dev"&gt;clojure-dev mailing list&lt;/a&gt;, submit patches on &lt;a href="http://dev.clojure.org/jira"&gt;JIRA&lt;/a&gt;, and become committers on contrib libraries. Within Clojure/dev is the smaller set of people who have been tasked with screening Clojure language tickets. Clojure/core overlaps with both groups.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/clojure-community-layers.png" label="Diagram showing layers of the Clojure community" /&gt;&lt;/p&gt;

&lt;p&gt;At the tail end of this year's &lt;a href="http://clojure-conj.org/"&gt;Clojure/conj&lt;/a&gt;, Stuart Halloway opened the first face-to-face meeting of Clojure/dev with these words: "This is the Clojure/dev meeting. It's a meeting of volunteers talking about how they're going to spend their free time. The only thing we owe each other is honest communication about when we're planning to do something and when we're not. There is no obligation for anybody in this room to build anything for anybody else."&lt;/p&gt;

&lt;p&gt;One consensus that came out of the Clojure/dev meeting was that we need to get better at using our tools, particularly JIRA. We would like to streamline the processes of joining Clojure/dev, screening patches, and creating new contrib libraries. We also need better integration testing between Clojure and applications that use it. Application and library developers can help by running their test suites against pre-release versions of Clojure (alphas, betas, even SNAPSHOTs) and reporting problems early.&lt;/p&gt;

&lt;p&gt;But Stu's last point is an important one: no one in the Clojure community owes anybody anything. If you want something, it's not enough to ask for it, you need to be willing to do the work to make it happen. At the same time, don't let a lukewarm response to ideas on the mailing list dissuade you from implementing something you think is valuable. It might just be that no one has time to think about it. Recall keyword arguments: more than two years from inception to completion. We're in this for the long haul. Join us, be patient, and let's see where we can go.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(take 5 william-byrd)</title>
   <link href="http://clojure.com/blog/2012/02/16/take5-william-byrd.html" />
   <updated>2012-02-16T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/16/take5-william-byrd</id>
   <content type="html">&lt;p&gt;William Byrd is a postdoc at Indiana University researching the applicability of declarative programming techniques to high-performance computing domains.  In addition, he is one of the three authors of the fantastic book &lt;em&gt;&lt;a href="http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;amp;tid=10663"&gt;The Reasoned Schemer&lt;/a&gt;&lt;/em&gt; that walks the reader through the development of a small but powerful logical programming system in Scheme called &lt;a href="http://kanren.sourceforge.net/"&gt;miniKanren&lt;/a&gt;.  Dr. Byrd attended the &lt;a href="http://clojure-conj.org/"&gt;2011 Clojure Conj&lt;/a&gt; and gave (along with Dr. Friedman) what became one of the best talks of the conference -- during the conference off hours.  In this candid installment in the &lt;code&gt;(take)&lt;/code&gt; series of micro-interviews Dr. Byrd discusses Clojure, Scheme, Lisp, macros, and miniKanren's evolution.&lt;/p&gt;

&lt;h3&gt;A trend in the &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt; language and its ecosystem is an increasing emphasis on declarative programming models, including Datalog, logic, and relational programming.  Is this progression unique to the Clojure evolution, or is it more emblematic of a more general trend?&lt;/h3&gt;

&lt;p&gt;Declarative programming has been used in industry for decades: HTML, XSLT, GNU Make, and SQL are all declarative languages.  I see a slightly different trend, towards programmers designing their own domain-specific languages, many of which are declarative.  Of course Lispers have been doing this for decades--Lisp macros are arguably the most powerful tool for creating DSLs.  Therefore Clojure is almost perfectly positioned as a pragmatic language for DSL creation.  Almost, but not quite.&lt;/p&gt;

&lt;p&gt;Not quite, because Clojure's macro system appears to me to be a kludge, trying to patch up Common Lisp's &lt;code&gt;defmacro&lt;/code&gt; without going all the way to real &lt;a href="http://en.wikipedia.org/wiki/Hygienic_macro"&gt;hygienic macros&lt;/a&gt;.  I don't mean to be overly critical--I'm not happy with the state of Scheme, either, which has not one but two hygienic macro systems, neither of which is ideal.&lt;/p&gt;

&lt;p&gt;The more powerful Scheme macro system, &lt;code&gt;syntax-case&lt;/code&gt;, gives the programmer the full power of Scheme at macro expansion time, along with the ability to "bend" hygiene when desired.  Syntax-case is powerful enough to define Common Lisp's &lt;code&gt;defmacro&lt;/code&gt; (and almost certainly powerful enough to define Clojure's &lt;code&gt;defmacro&lt;/code&gt; as well).  Unfortunately, &lt;code&gt;syntax-case&lt;/code&gt; is notoriously complicated.  As far as I can tell, mastering syntax-case requires a mental model equivalent in complexity to the macro expander's implementation.  As a result, Dan, Oleg, and I refuse to use &lt;code&gt;syntax-case&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The other Scheme macro system, &lt;code&gt;syntax-rules&lt;/code&gt;, is strictly less powerful than &lt;code&gt;syntax-case&lt;/code&gt;, and can in fact be implemented in &lt;code&gt;syntax-case&lt;/code&gt;.  However, the mental model required to use syntax-rules is much simpler, as it is essentially a term-rewriting system with hygiene.  For vanilla forms such as &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;and&lt;/code&gt;, and &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;syntax-rules&lt;/code&gt; works beautifully.  For incredibly complicated macros, such as the &lt;code&gt;match&lt;/code&gt; pattern matcher used in &lt;a href="https://www.cs.indiana.edu/~dyb/"&gt;Kent Dybvig's&lt;/a&gt; compiler course at Indiana, the full power of &lt;code&gt;syntax-case&lt;/code&gt; is probably required.  For almost all other macros, it seems like a system with just a little more power than syntax-rules would be both sufficient and ideal.  For example, often a macro writer wishes to concatenate two symbols--currently this requires using &lt;code&gt;syntax-case&lt;/code&gt;, even if the rest of the macro is trivial.&lt;/p&gt;

&lt;p&gt;If a hygienic macro system that hits the sweet spot between &lt;code&gt;syntax-rules&lt;/code&gt; and &lt;code&gt;syntax-case&lt;/code&gt; is created, I hope it will be adopted by Schemers and Clojurers alike.  A few steps in this direction include the Dylan macro system and &lt;a href="http://docs.racket-lang.org/syntax/Parsing_Syntax.html"&gt;Ryan Culpepper's &lt;code&gt;syntax-parse&lt;/code&gt;&lt;/a&gt;.  Also needed is a way to learn how to write non-trivial hygienic macros that doesn't involve earning a PhD in programming languages from Indiana or Northeastern.&lt;/p&gt;

&lt;h3&gt;Because of the limitations imposed by the JVM, is Clojure unable to address certain classes of problems due to a limitation in its support for &lt;a href="http://en.wikipedia.org/wiki/Continuation-passing_style"&gt;CPS&lt;/a&gt;?&lt;/h3&gt;

&lt;p&gt;Clojure is Turing-complete, so in theory the answer to all such questions is 'no'--you can always encode the problem using iteration.  In practice, you lose many of the powerful correctness-preserving transformations enabled by CPS (CPS is the gateway drug of program transformations).&lt;/p&gt;

&lt;p&gt;Even worse, there is a tremendous hidden cost to the Clojure community.  Schemers should be the greatest fans of Clojure; instead, they see the improper handling of tail calls, along with a suspect-looking macro system, and yawn instead of jumping onboard.  I think the macro situation can and should be improved; I don't know what to do about tail calls, other than clearly explain the design tradeoffs to Schemers and challenge them to do better.&lt;/p&gt;

&lt;h3&gt;How do you see the future of Lisp progressing?&lt;/h3&gt;

&lt;p&gt;Common Lisp has no future--if taking the union of features from multiple Lisp Machine implementations didn't kill it (why have one object system when you can have three?), standardization did.  Fortran is still evolving; Common Lisp isn't.&lt;/p&gt;

&lt;p&gt;So far the Scheme community has avoided making the same mistakes.  Historically, only the intersection of features from the major implementations have made it into the standard.  The result is a standard language that is useless for real-world programming (FFI and threads aren't in the current standard, for example) but encourages researchers and implementers to experiment with new features.  In fact, Scheme shouldn't be viewed as a complete programming language--rather, Scheme is a dialect of Lisp, and the various implementations (Racket, Chez, Ikarus, etc.) are dialects of Scheme.  Scheme will never become a popular language, but popular languages are becoming more like Scheme.  For example, Ruby ripped off much of Scheme--alas, Matz decided not to rip off the most important part, hygienic macros, which is why Ruby programmers think the solution to every problem is to hack the interpreter.&lt;/p&gt;

&lt;p&gt;One interesting Lisp you didn't mention is &lt;a href="http://opendylan.org/"&gt;Dylan&lt;/a&gt;, which was created by Apple in the 90's and then abandoned.  Dylan is an object-oriented infix-notation Scheme designed for systems programming, with well-designed libraries, real hygienic macros, and outstanding performance.  I'm trying to steal a few cool ideas from Dylan--Clojurers should as well.  Dylan is dead, but hopefully its ideas will live on.&lt;/p&gt;

&lt;p&gt;Clojure feels like a different beast entirely.  Clojure has one canonical implementation, one lead designer, no rigorous standard (this part needs to change!), an enthusiastic and rapidly growing community, and a very practical bent.  From that perspective, Clojure sounds much more like Ruby or Python than Lisp.  Two major differences I see are the quality of the implementation (Clojure shows Pythoners that pragmatic dynamic languages needn't be slow) and the incorporation of STM, fast immutable data structures, logic programming, and other useful but potentially scary technologies that haven't made their way into the fundamentally conservative world of "scripting" languages (where much of the innovation is in syntactic sugar, since these languages lack hygienic macros).&lt;/p&gt;

&lt;p&gt;Will Clojure become as popular as Ruby or Python?  Probably not.  Will the languages that replace Ruby and Python be influenced by Clojure?  Almost certainly.  This is one reason it's important for Clojurers to understand the weaknesses of the language, and not just its strengths.&lt;/p&gt;

&lt;h3&gt;What is it like to work with Dr. Friedman and Oleg Kiselyov?&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://blip.tv/clojure/dan-friedman-and-william-byrd-minikanren-5936333"&gt;Dan is a close friend and mentor&lt;/a&gt;--working with him is always great fun.  We argue constantly over language design--sometimes I'm even right.&lt;/p&gt;

&lt;p&gt;Oleg is an emissary from some advanced alien race.  Working with him is both exhausting and enlightening.&lt;/p&gt;

&lt;h3&gt;What are you working on next?&lt;/h3&gt;

&lt;p&gt;I'm a postdoc working for Andrew Lumsdaine in CREST, the &lt;a href="http://pti.iu.edu/crest"&gt;Center for Research in Extreme Scale Technologies at Indiana University&lt;/a&gt;.   My primary research is on the design, implementation, and application of declarative languages to High Performance Computing.  I'm fortunate to be working with Eric Holk, Claire Alvis, Andy Lumsdaine, Arun Chauhan, and several other talented hackers and language designers at Indiana.  We're currently working on two languages: Kanor, a message-passing language for programming cluster supercomputers, and Harlan, a declarative language for general purpose GPU programming.  Of course both languages are implemented in Scheme.  We hope to embed Harlan in the Scheme REPL; if we are successful, perhaps &lt;a href="http://twitter.com/swannodette"&gt;David Nolen&lt;/a&gt; can port our implementation to Clojure!&lt;/p&gt;

&lt;p&gt;I'm also working with Dan and Claire on improving &lt;a href="https://github.com/calvis/cKanren"&gt;cKanren&lt;/a&gt;, our implementation of constraint logic programming.  I can't wait to see what cool tricks David uses in his core.logic version of cKanren.&lt;/p&gt;

&lt;p&gt;For fun I run 3D printing and Arduino clubs for undergrads, and am working with Nicole Jacquard, Andy Lumsdaine, and Kylie Peppler to start a Fab Lab at Indiana.  Next semester I'll be teaching a course on Arduino, which will rock.&lt;/p&gt;

&lt;p&gt;I'm also doing some fun research with Zach Sparks and Claire at Indiana, and Chris Martens at CMU, on using logic programming to write Interactive Fiction.&lt;/p&gt;

&lt;p&gt;Finally, I'm working with some Indiana-trained macrologists on a new hygienic macro system for Scheme, and hopefully for Clojure as well.  I hope to say much more about that soon.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>EuroClojure and London Training</title>
   <link href="http://clojure.com/blog/2012/02/16/euroclojure-and-london-training.html" />
   <updated>2012-02-16T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/16/euroclojure-and-london-training</id>
   <content type="html">&lt;p&gt;We're delighted to announce our involvement in
&lt;a href="http://euroclojure.com/2012/"&gt;EuroClojure&lt;/a&gt; 2012, Europe's first
Clojure conference, happening in London from May 24th to May 25th.&lt;/p&gt;

&lt;p&gt;Clojure/core members &lt;a href="https://twitter.com/stuartsierra"&gt;Stuart Sierra&lt;/a&gt;
and &lt;a href="https://twitter.com/levanderhart"&gt;Luke VanderHart&lt;/a&gt;, authors of
&lt;a href="http://www.apress.com/9781430272311"&gt;Practical Clojure&lt;/a&gt;, will be
&lt;a href="http://euroclojure.com/2012/3-day-clojure-training/"&gt;offering our 3-day Clojure training class&lt;/a&gt;
between May 21st and May 23rd, right before the conference.&lt;/p&gt;

&lt;p&gt;Much of the Clojure community is European, and we're excited to see
Clojure conferences going global.&lt;/p&gt;

&lt;p&gt;EuroClojure brings the number of yearly Clojure-specific conferences
to three (the other two being &lt;a href="http://clojurewest.org/"&gt;Clojure/west&lt;/a&gt;
and &lt;a href="http://clojureconj.org/"&gt;Clojure/conj&lt;/a&gt;, and gives Clojurists
world-wide another opportunity to learn and share all things Clojure.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://euroclojure.com/2012/registration/"&gt;Registration for EuroClojure and training is open&lt;/a&gt;.
We'll see you there.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Six More Conj 2011 Videos Available</title>
   <link href="http://clojure.com/blog/2012/02/14/six-more-conj-2011-videos-available.html" />
   <updated>2012-02-14T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/14/six-more-conj-2011-videos-available</id>
   <content type="html">&lt;p&gt;We are happy to announce the availability of another six Clojure/conj 2011 videos.&lt;/p&gt;

&lt;p&gt;Recordings from both of the 2010 and 2011 events are available, along
with other Clojure videos, on
&lt;a href="http://clojure.blip.tv/"&gt;Clojure's blip.tv page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To see talks about Clojure in person, your next opportunity is
&lt;a href="http://clojurewest.org"&gt;Clojure/west&lt;/a&gt;, the Regular registration of
which ends on February 17th!&lt;/p&gt;

&lt;h3&gt;Scheduled Talk Videos&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;(Neal's) Master Plan for Clojure Enterprise Mindshare Domination&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/neal4d"&gt;Neal Ford&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/neal-ford-neal-s-master-plan-for-clojure-enterprise-mindshare-domination-5953926"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Predicate Dispatch&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/swannodette"&gt;David Nolen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/david-nolen-predicate-dispatch-5953889"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;From Linear to Incremental&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/cgrand/"&gt;Christophe Grand&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/christophe-grand-from-linear-to-incremental-5953881"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Logs as Data&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/mmcgrana"&gt;Mark McGranaghan&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/mark-mcgranaghan-logs-as-data-5953857"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Modeling the world probabilistically using Bayesian networks in Clojure&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/cemerick"&gt;Chas Emerick&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/chas-emerick-modeling-the-world-probabilistically-using-bayesian-networks-in-clojure-5961126"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Clojure and Android&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/deepbluelambda"&gt;Daniel Solano Gómez&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/daniel-solano-g%C3%B3mez-clojure-and-android-5953832"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>More Conj 2011 Videos Available</title>
   <link href="http://clojure.com/blog/2012/02/06/more-conj-2011-videos-available.html" />
   <updated>2012-02-06T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/06/more-conj-2011-videos-available</id>
   <content type="html">&lt;p&gt;Six more videos from Clojure Conj 2011 are now available, including four scheduled talks and two UnConj recordings.&lt;/p&gt;

&lt;p&gt;Both 2010 and 2011 Clojure Conj recordings are available at
&lt;a href="http://clojure.blip.tv/"&gt;Clojure's blip.tv page&lt;/a&gt; and are also
directly accessible via the links below.&lt;/p&gt;

&lt;p&gt;We will continue to release Conj 2011 talks as they become available.&lt;/p&gt;

&lt;h3&gt;Scheduled Talk Videos&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Striving to Make Things Simple and Fast&lt;/strong&gt; &lt;em&gt;Phil Bagwell&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/phill-bagwell-striving-to-make-things-simple-and-fast-5936145"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Introduction to Logic Programming with Clojure&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/ambrosebs"&gt;Ambrose Bonnaire-Sergeant&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/ambrose-bonnaire-sergeant-introduction-to-logic-programming-with-clojure-5936196"&gt;Video on blip.tv &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Hacking the Human Genome Using Clojure and Similarity Search&lt;/strong&gt; &lt;em&gt;Arnoldo Jose Muller-Molina&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/arnoldo-jose-muller-molina-hacking-the-human-genome-using-clojure-and-similarity-search-5936229"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Ousterhout's Dichotomy Isn't (Part 2 of the Simplicity/Power/Focus Series)&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/stuarthalloway"&gt;Stuart Halloway&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/stuart-halloway-ousterhout-s-dichotomy-isn-t-part-2-of-the-simplicity-power-focus-series-5936308"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;UnConj Recordings&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;miniKanren&lt;/strong&gt; &lt;em&gt;Dan Friedman and William Byrd&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/dan-friedman-and-william-byrd-minikanren-5936333"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Lightning Talks&lt;/strong&gt; &lt;em&gt;Alex Redington (&lt;a href="https://github.com/aredington/monotony"&gt;Monotony&lt;/a&gt;), Jim Crossley (&lt;a href="http://immutant.org/"&gt;Immutant&lt;/a&gt;), Alan Dipert and Jon Distad (&lt;a href="https://github.com/splatspace/uberlisp"&gt;Uberlisp&lt;/a&gt;), Chris Granger (&lt;a href="http://sqlkorma.com/"&gt;Korma&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/clojureconj-2011-lightning-talks-5936371"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Functional Relational Programming with Cascalog</title>
   <link href="http://clojure.com/blog/2012/02/03/functional-relational-programming-with-cascalog.html" />
   <updated>2012-02-03T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/02/03/functional-relational-programming-with-cascalog</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;(Updated Feb. 6 with corrections, below.)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2006, Ben Mosely and Peter Marks published a paper, &lt;a href="http://web.mac.com/ben_moseley/frp/paper-v1_01.pdf" title="Out of the Tar Pit, 2006 paper by Ben Mosely and Peter Marks [PDF]"&gt;Out of the Tar Pit&lt;/a&gt;, in which they coined the term &lt;a href="http://web.mac.com/ben_moseley/frp/frp.html" title="Functional Relational Programming, information site by Ben Mosely"&gt;Functional Relational Programming&lt;/a&gt;. "Out of the Tar Pit" was influential on Clojure's design, particularly its emphasis on immutability and the separation of state from behavior. Mosely and Marks went further, however, in recommending that data be manipulated as &lt;em&gt;relations&lt;/em&gt;. Relations are the abstract concept behind tables in a relational database or "facts" in some logic programming systems. Clojure does not enforce a relational model, but Clojure can be used for relational programming. For example, the &lt;a href="http://clojure.github.com/clojure/clojure.set-api.html" title="clojure.set namespace API documentation"&gt;clojure.set&lt;/a&gt; namespace defines relational algebra operations such as &lt;code&gt;project&lt;/code&gt; and &lt;code&gt;join&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the early aughts, Jeffrey Dean and Sanjay Ghemawat developed the &lt;a href="http://labs.google.com/papers/mapreduce.html" title="MapReduce technical papers from Google"&gt;MapReduce programming model&lt;/a&gt; at Google to optimize the process of ranking web pages. MapReduce works well for I/O-bound problems where the computation on each record is small but the number of records is large. It specifically addresses the performance characteristics of modern commodity hardware, especially &lt;a href="http://stuartsierra.com/2008/04/17/disk-is-the-new-tape" title="Disk is the New Tape, blog post by Stuart Sierra"&gt;"disk is the new tape."&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hadoop&lt;/strong&gt; &lt;a href="http://developer.yahoo.com/hadoop/" title="Hadoop on the Yahoo! Developer Network"&gt;began life at Yahoo!&lt;/a&gt; and is now an &lt;a href="http://hadoop.apache.org/" title="Hadoop Apache project home page"&gt;Apache open-source project&lt;/a&gt;. It consists of two parts: a distributed filesystem (HDFS) and a MapReduce implementation. Together, they form a powerful framework for running computations on large data sets (terabytes to petabytes) across hundreds or thousands of machines.&lt;/p&gt;

&lt;p&gt;Hadoop is written in Java, and writing MapReduce jobs in Clojure is possible. (I released a &lt;a href="http://stuartsierra.com/software/clojure-hadoop" title="Clojure-Hadoop, open-source library by Stuart Sierra."&gt;helper library&lt;/a&gt; a couple of years ago.) But writing "raw" MapReduce in any language is difficult: the conceptual model is primitive, and complex computations often require several MapReduce jobs chained together. This is where data-processing tools built on top of Hadoop come in handy. &lt;a href="http://www.cascading.org/" title="Cascading open-source project home page"&gt;Cascading&lt;/a&gt; is one such tool, others include &lt;a href="http://hive.apache.org/" title="Apache Hive project home page"&gt;Hive&lt;/a&gt; and &lt;a href="http://pig.apache.org/" title="Apache Pig project home page"&gt;Pig&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cascading&lt;/strong&gt; provides a dataflow-style API on top of Hadoop using a "pipe" metaphor, but computation steps within the pipes are still written in Java. Nathan Marz at BackType (now part of Twitter) added another layer by implementing Datalog on top of Cascading. He called the result &lt;a href="https://github.com/nathanmarz/cascalog"&gt;Cascalog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Datalog&lt;/strong&gt; is a logic programming language that dates back to the 1970s and has occasionally been used as a database query language. Strictly speaking, Datalog is a subset of Prolog, but it has interesting properties that differentiate it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All Datalog programs are guaranteed to terminate&lt;/li&gt;
&lt;li&gt;Order of statements in Datalog doesn't matter&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;As a result, Datalog programs are often easier to write than programs in Prolog-style logic systems, such as &lt;a href="https://github.com/clojure/core.logic"&gt;clojure.core.logic&lt;/a&gt;. Clojure-contrib once had an &lt;a href="https://github.com/clojure/clojure-contrib/blob/master/modules/datalog/src/examples/clojure/examples/datalog.clj" title="Datalog implementation in clojure-contrib"&gt;in-memory Datalog implementation&lt;/a&gt; written by by &lt;a href="http://jstraszheim.livejournal.com/" title="Jeffrey Straszheim's personal blog"&gt;Jeffrey Straszheim&lt;/a&gt;, but it is not actively maintained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/nathanmarz/cascalog"&gt;Cascalog&lt;/a&gt;&lt;/strong&gt; compiles a Datalog-like language into Cascading workflows that can be run on Hadoop MapReduce. For example, the following query (from the Cascalog documentation) joins two data sets named "age" and "gender" to find men over twenty-five:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(&amp;lt;- [?name ?age]
    (age ?name ?age)
    (gender ?name "male")
    (&amp;gt; ?age 25))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This program can be tested locally, on a single machine, then run on a Hadoop cluster of hundreds or thousands of machines. Joins across data sets are implicit and the order of expressions doesn't matter. Cascalog and Cascading accomplish the conversion into MapReduce programs.&lt;/p&gt;

&lt;p&gt;I think Cascalog is a valid implementation of Functional Relational Programming as laid out by Mosely and Marks. It's not for everyone: MapReduce is only applicable to certain problem domains. But it achieves the goals of FRP: state is separate from behavior and performance concerns are isolated. Naturally, there's a lot of complexity underneath it all, but Backtype has demonstrated that Cascalog works on Twitter-size data sets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CORRECTIONS February 6, 2012:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hadoop began as part of the &lt;a href="http://nutch.apache.org/"&gt;Nutch&lt;/a&gt; open-source search engine, with support from Yahoo!.&lt;/p&gt;

&lt;p&gt;Cascalog is only a partial realization of Functional Relational Programming as described in "Out of the Tar Pit." In particular, it does not provide means for inserting data into the system (what Mosely/Marks called &lt;em&gt;feeders&lt;/em&gt;) or reacting to that data (&lt;em&gt;observers&lt;/em&gt;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>First Conj 2011 Videos Available</title>
   <link href="http://clojure.com/blog/2012/01/31/first-conj-2011-videos-available.html" />
   <updated>2012-01-31T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/01/31/first-conj-2011-videos-available</id>
   <content type="html">&lt;p&gt;Five videos from Clojure Conj 2011 are now available. Clojure Conj
2011 recordings are available at
&lt;a href="http://clojure.blip.tv/"&gt;Clojure's blip.tv page&lt;/a&gt; and are also
directly accessible via the links below.&lt;/p&gt;

&lt;p&gt;We will continue to release Conj 2011 talks as they become available.&lt;/p&gt;

&lt;p&gt;Thank you to all of the speakers and attendees for making Clojure Conj
2011 a great event!  Watch this space for information about Clojure
Conj 2012, which is being planned.&lt;/p&gt;

&lt;h3&gt;Scheduled Talk Videos&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learning Clojure - Next Steps&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="http://twitter.com/stuartsierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/stuart-sierra-learning-clojure-next-steps-5921905"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Concurrent Stream Processing&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/david_mcneil"&gt;David McNeil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/david-mcneil-concurrent-stream-processing-5919702"&gt;Video on blip.tv &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;clojail: Life in the Clojure Prison&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/IORayne"&gt;Anthony Grimes&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/anthony-grimes-clojail-life-in-the-clojure-prison-5919720"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;ClojureScript&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/#!/chrishouser"&gt;Chris Houser&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/chris-houser-clojurescript-5919739"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Extending JavaScript Libraries from ClojureScript&lt;/strong&gt; &lt;em&gt;&lt;a target="_blank" href="https://twitter.com/#!/keminglabs"&gt;Kevin Lynagh&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://blip.tv/clojure/kevin-lynagh-extending-javascript-libraries-from-clojurescript-5919758"&gt;Video on blip.tv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>(take 4 arnoldo-jose-muller-molina)</title>
   <link href="http://clojure.com/blog/2012/01/25/take4-arnoldo-molina.html" />
   <updated>2012-01-25T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/01/25/take4-arnoldo-molina</id>
   <content type="html">&lt;p&gt;I met Arnoldo Jose Muller-Molina for the first time at the &lt;a href="http://clojure.com/blog/2011/11/17/second-conj.html"&gt;second Clojure Conj&lt;/a&gt; where he presented a fascinating talk entitled "Hacking the Human Genome using Clojure and Similarity Search".  As a speaker I enjoyed his engaging style and his grasp of and ability to clearly explain deep topics.  In this installment of the &lt;code&gt;(take ...)&lt;/code&gt; series we discuss the power of Lisp in general and Clojure specifically, starting a company built on Clojure, and the current barriers to entry for Clojure in data sciences.&lt;/p&gt;

&lt;h3&gt;How did you discover Clojure?&lt;/h3&gt;

&lt;p&gt;I learned about Clojure in &lt;a href="http://news.ycombinator.com"&gt;Hacker News&lt;/a&gt;. HN is the first site I open in the morning when I wake up. Someone linked a post written by a long-time Lisper saying many good things about Clojure so I decided to give it a try.&lt;/p&gt;

&lt;p&gt;The following three characteristics were instrumental in my decision in adopting Clojure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lisp (macro system): You can write programs that write programs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JVM ecosystem: Years of programs built for the JVM and also years of
effort put into the JVM itself make a very robust and complete
platform. You can fully harness the power of the JVM from Clojure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Many data science tools (Hadoop, Cassandra, etc) are built in Java
already. If you are doing big data projects , then it makes a lot of
sense to employ a JVM-based language.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Are you pushing for wider adoption of Clojure on your team?&lt;/h3&gt;

&lt;p&gt;I am in a transition period right now. I am starting a data science company &lt;a href="http://simmachines.com"&gt;simMachines&lt;/a&gt; that will be focused on providing solutions that turn data into money/time by using similarity functions as they are easier to understand by non-technical people.  I will be
using Clojure for data analysis and people who join simMachines will be using Clojure too.  In addition, I will be teaching a "Big Data" Clojure course from January using the book: &lt;em&gt;&lt;a href="http://joyofclojure.com"&gt;The Joy of Clojure&lt;/a&gt;&lt;/em&gt;. I will make my students handle very large biological datasets with Clojure!&lt;/p&gt;

&lt;h3&gt;What are your plans for using Clojure in the context of your work?&lt;/h3&gt;

&lt;p&gt;Widely. There is a strong preference towards Perl, Python, Matlab and R. The Java language is not that popular I would say. The fact that Java itself hasn't penetrated is already something that could hinder Clojure's adoption. Perhaps we need to further work on &lt;a href="http://incanter.org/"&gt;Incanter's&lt;/a&gt; plotting facilities so that we reach the customization capabilities of &lt;a href="http://had.co.nz/ggplot/"&gt;GGPlot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;People in life sciences are very visual, and the way of communicating complex ideas is with very elaborate illustrations, graphs and plots.  People could actually chose a language based only on this, because at the end, it helps a lot to explain complex ideas.&lt;/p&gt;

&lt;h3&gt;What are the problems that Clojure is suited to helping solve in your field?&lt;/h3&gt;

&lt;p&gt;Clojure is exceedingly good at handling data. You can parse complex raw files in a very declarative way. You can then extract useful bits of your stream, create records and then pass them on to an arbitrarily complex pipeline of transformations.  In OO languages, you need to write Iterators to traverse large files, whereas in Clojure you declaratively concatenate functions that efficiently handle your data with lazy evaluation. With Clojure, you can focus on the problem
and forget about error prone tasks like iterators, &lt;code&gt;while&lt;/code&gt; loop counters, etc. After you have processed data with Clojure, you will not want to go back to your previous programming language.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Introducing ClojureScript One</title>
   <link href="http://clojure.com/blog/2012/01/11/announcing-clojurescript-one.html" />
   <updated>2012-01-11T00:00:00-05:00</updated>
   <id>http://clojure.com/blog/2012/01/11/announcing-clojurescript-one</id>
   <content type="html">&lt;p&gt;Here at &lt;a href="http://thinkrelevance.com"&gt;Relevance&lt;/a&gt;, we spent some time
recently looking at the
&lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt; experience.
We were specifically concerned with finding the pain points in
ClojureScript development. To make the experience as real as possible,
we chose to rewrite a client application which had been written in
&lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We discovered that there are a lot of barriers to getting started,
mainly due to the number of unknowns that are always associated with
using a new technology. How should the code be organized? How should
the application itself be organized? How do the developers work with
the design team? How can the application be tested? What is the best
workflow? What is the best way to deal with dependencies?&lt;/p&gt;

&lt;p&gt;Ultimately, we found that although there are problems, good solutions
to all of them exist. I approached Relevance with the idea of doing
something to capture these ideas in a way that would benefit the
community and help others climb the same learning curve. That idea
grew into ClojureScript One.&lt;/p&gt;

&lt;h2&gt;Introducing ClojureScript One&lt;/h2&gt;

&lt;p&gt;ClojureScript One is a helpful resource for getting started with
ClojureScript. It is not a library or a framework. It is an example
with lots of documentation. We hope that by looking through this
example and reading the documentation we can remove the barriers that
are stopping you from experiencing how much fun ClojureScript
development can be. Once you have this experience, we think you will
be hooked.&lt;/p&gt;

&lt;p&gt;You can find ClojureScript One on the web at
&lt;a href="http://clojurescriptone.com"&gt;http://clojurescriptone.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Where you begin has a huge effect on where you end. We hope that this
project will help you to spend some time thinking about how to begin.
If the project succeeds, it will continue to be the place to go to get
guidance on how to start working with ClojureScript.&lt;/p&gt;

&lt;p&gt;I would like to thank Relevance for allowing me and other Relevance
employees to work on this project and for allowing us to release it as
open source.&lt;/p&gt;
</content>
 </entry>
 
 
</feed>

