<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0">
	<channel>
		<title>LispCast</title>
		<link>http://www.lispcast.com/</link>
		<description>A blog about the simple joys of functional programming.</description>
		<language>en</language>


                <item>
                  <title>Clojure vs. The Static Typing World</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-and-types</guid>
                  <link>http://www.lispcast.com/clojure-and-types</link>
                  <pubDate>Thu 26 Oct 2017 04:45:17 PM CDT</pubDate>
                  <description>
                    Rich Hickey explained the design choices behind Clojure and made many statements about static typing along the way. Share an interesting perspective and some stories from my time as a Haskell programmer. I conclude with a design challenge for the statically typed world.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-and-types"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Programming Paradigms and the Procedural Paradox</title>
                  <guid isPermalink="false">http://www.lispcast.com/procedural-paradox</guid>
                  <link>http://www.lispcast.com/procedural-paradox</link>
                  <pubDate>Wed 30 Aug 2017 14:07:44 AM CDT</pubDate>
                  <description>
                    I break down two perspectives (their features and their methodologies) for the three most common paradigms. I also explore why paradigms are so easy to argue about, and what we can do about it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/procedural-paradox"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Can I do FP in my language?</title>
                  <guid isPermalink="false">http://www.lispcast.com/fp-in-my-language</guid>
                  <link>http://www.lispcast.com/fp-in-my-language</link>
                  <pubDate>Tue 02 Aug 2017 02:24:20 PM CDT</pubDate>
                  <description>
                    We address the question directly, but then look deeper to the beliefs behind the question.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/fp-in-my-language"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>When in doubt, refactor at the bottom</title>
                  <guid isPermalink="false">http://www.lispcast.com/refactor-bottom</guid>
                  <link>http://www.lispcast.com/refactor-bottom</link>
                  <pubDate>Mon 26 Jun 2017 08:00:38 AM CDT</pubDate>
                  <description>
                    We explore when it is safe to extract out an abstraction and when you need to go deeper and rebuild it from scratch.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/refactor-bottom"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What is an abstraction?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-is-abstraction</guid>
                  <link>http://www.lispcast.com/what-is-abstraction</link>
                  <pubDate>Sun 25 Jun 2017 16:50:44 AM CDT</pubDate>
                  <description>
                    We explore some of the background behind the meaning of the word abstraction and why we do it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-is-abstraction"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What should a Clojure framework look like?</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-web-framework</guid>
                  <link>http://www.lispcast.com/clojure-web-framework</link>
                  <pubDate>Wed 21 Jun 2017 09:30:38 AM CDT</pubDate>
                  <description>
                    After exploring why frameworks and why not frameworks, I dive into the design priorities I think a web framework should have.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-web-framework"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The arguments against web frameworks</title>
                  <guid isPermalink="false">http://www.lispcast.com/arguments-against-frameworks</guid>
                  <link>http://www.lispcast.com/arguments-against-frameworks</link>
                  <pubDate>Tue 20 Jun 2017 06:30:36 AM CDT</pubDate>
                  <description>
                    We explore three arguments against frameworks, address them, then turn them into challenges to be overcome.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/arguments-against-frameworks"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why do we use Web Frameworks?</title>
                  <guid isPermalink="false">http://www.lispcast.com/why-web-frameworks</guid>
                  <link>http://www.lispcast.com/why-web-frameworks</link>
                  <pubDate>Mon 19 Jun 2017 08:15:33 AM CDT</pubDate>
                  <description>
                    While contemplating a Clojure web framework, I explore the reasons we use web frameworks in general. I conclude that the framework should support a learnable development process.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/why-web-frameworks"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Should Cognitect do More for Clojure?</title>
                  <guid isPermalink="false">http://www.lispcast.com/cognitect-clojure</guid>
                  <link>http://www.lispcast.com/cognitect-clojure</link>
                  <pubDate>Thu 25 May 2017 07:10:48 AM CDT</pubDate>
                  <description>
                    Poor open-source development practices, neglect for the beginner experience, and lack of communication have come up as complaints against how Cognitect stewards Clojure. I address the complaints with a plea that we do more as a community.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/cognitect-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Defn Podcast Transcript</title>
                  <guid isPermalink="false">http://www.lispcast.com/defn-podcast-transcript</guid>
                  <link>http://www.lispcast.com/defn-podcast-transcript</link>
                  <pubDate>Thu 11 May 2017 01:24:14 PM CDT</pubDate>
                  <description>
                    I was on the Defn Podcast. We talked about Clojure, testing, and PHP :) Here is a transcript.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/defn-podcast-transcript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Bootstrapping Mindset</title>
                  <guid isPermalink="false">http://www.lispcast.com/bootstrapping-mindset</guid>
                  <link>http://www.lispcast.com/bootstrapping-mindset</link>
                  <pubDate>Tue 16 Mar 2017 06:48:01 AM CDT</pubDate>
                  <description>
                    One of the great things about very robust and powerful abstractions is that they can give you tremendous leverage. The leverage can be so great that you can build something much greater than the sum of its parts. However, I worry that the web is an end to this kind of abstraction. I'd like to explore why that is and what we can do about it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/bootstrapping-mindset"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Idea of Lisp</title>
                  <guid isPermalink="false">http://www.lispcast.com/idea-of-lisp</guid>
                  <link>http://www.lispcast.com/idea-of-lisp</link>
                  <pubDate>Tue 13 Dec 2016 06:41:42 AM CDT</pubDate>
                  <description>
                    How a programming language can be an idea.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/idea-of-lisp"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Building Composable Abstractions Rehearsal 3</title>
                  <guid isPermalink="false">http://www.lispcast.com/building-composable-abstractions-3</guid>
                  <link>http://www.lispcast.com/building-composable-abstractions-3</link>
                  <pubDate>Sun 13 Nov 2016 03:36:36 PM CST</pubDate>
                  <description>
                    My third rehearsal for my upcoming Clojure/conj talk.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/building-composable-abstractions-3"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Two rehearsals for my Clojure/conj talk</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-conj-rehearsal</guid>
                  <link>http://www.lispcast.com/clojure-conj-rehearsal</link>
                  <pubDate>Sun 06 Nov 2016 08:30:54 PM CST</pubDate>
                  <description>
                    My upcoming Clojure/conj talk is fast approaching. I recorded two rehearsals in two days. Watch them!

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-conj-rehearsal"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>New Orleans Clojure Workshop Retrospective</title>
                  <guid isPermalink="false">http://www.lispcast.com/new-orleans-clojure-workshop-oct-2016</guid>
                  <link>http://www.lispcast.com/new-orleans-clojure-workshop-oct-2016</link>
                  <pubDate>Sun 23 Oct 2016 08:46:35 PM CDT</pubDate>
                  <description>
                    We organized a Clojure workshop. Here's what went right and what we should do next time.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/new-orleans-clojure-workshop-oct-2016"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Concurrency and Parallelism in the Real World</title>
                  <guid isPermalink="false">http://www.lispcast.com/concurrency-vs-parallelism</guid>
                  <link>http://www.lispcast.com/concurrency-vs-parallelism</link>
                  <pubDate>Mon 01 Aug 2016 06:20:00 PM CDT</pubDate>
                  <description>
                    Concurrency and parallelism are concepts that we make use of every day off of the computer. I give some real world examples and we analyze them for concurrency and parallelism.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/concurrency-vs-parallelism"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What do I have to learn to be hirable in Clojure?</title>
                  <guid isPermalink="false">http://www.lispcast.com/hirable-in-clojure</guid>
                  <link>http://www.lispcast.com/hirable-in-clojure</link>
                  <pubDate>Fri 22 Jul 2016 11:25:39 AM CDT</pubDate>
                  <description>
                    You actually need to learn nothing. But it's more complicated than that. This article will show you what can set you apart.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/hirable-in-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>5 Differences between clojure.spec and Schema</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure.spec-vs-schema</guid>
                  <link>http://www.lispcast.com/clojure.spec-vs-schema</link>
                  <pubDate>Sat 11 Jun 2016 01:06:47 PM CDT</pubDate>
                  <description>
                    Schema and clojure.spec aim to solve similar problems. There are significant differences, though, that might not be obvious at first.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure.spec-vs-schema"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure Hashmaps</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-hashmaps</guid>
                  <link>http://www.lispcast.com/clojure-hashmaps</link>
                  <pubDate>Thu 17 Mar 2016 11:10:52 AM CDT</pubDate>
                  <description>
                    Clojure hashmaps are one of the workhorse data structures in Clojure. There are two main patterns commonly used. We also discuss some interesting properties.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-hashmaps"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Installing Clojure on Windows 8+</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-windows-8</guid>
                  <link>http://www.lispcast.com/clojure-windows-8</link>
                  <pubDate>Fri 11 Mar 2016 11:29:43 AM CST</pubDate>
                  <description>
                    The ClojureBridge curriculum includes excellent instructions for installing Clojure on a variety of systems. They are well suited for beginners. I have adapted the Windows 8 instructions for my recommendations.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-windows-8"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Installing Clojure on Mac OS X</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-mac</guid>
                  <link>http://www.lispcast.com/clojure-mac</link>
                  <pubDate>Fri 11 Mar 2016 11:28:57 AM CST</pubDate>
                  <description>
                    The ClojureBridge curriculum includes excellent instructions for installing Clojure on a variety of systems. They are well suited for beginners. I have adapted the Mac OS X instructions for my recommendations.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-mac"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Installing Clojure on Ubuntu</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-ubuntu</guid>
                  <link>http://www.lispcast.com/clojure-ubuntu</link>
                  <pubDate>Fri 11 Mar 2016 11:27:10 AM CST</pubDate>
                  <description>
                    The ClojureBridge curriculum includes excellent instructions for installing Clojure on a variety of systems. They are well suited for beginners. I have adapted the Ubuntu instructions for my recommendations.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-ubuntu"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Installing Clojure on Windows 7</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-windows-7</guid>
                  <link>http://www.lispcast.com/clojure-windows-7</link>
                  <pubDate>Fri 11 Mar 2016 11:26:17 AM CST</pubDate>
                  <description>
                    The ClojureBridge curriculum includes excellent instructions for installing Clojure on a variety of systems. They are well suited for beginners. I have adapted the Windows 7 instructions for my recommendations.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-windows-7"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What my daughter's blocks teach us about learning</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-and-blocks</guid>
                  <link>http://www.lispcast.com/clojure-and-blocks</link>
                  <pubDate>Thu 10 Mar 2016 03:38:14 PM CST</pubDate>
                  <description>
                    My daughter's blocks taught her to match shapes with a lot of fast feedback. Fast feedback is a powerful tool to learn any skill. I analyze how the blocks helped my daughter learn and compare it to learning Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-and-blocks"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Master one skill at a time</title>
                  <guid isPermalink="false">http://www.lispcast.com/master-one-skill-at-a-time</guid>
                  <link>http://www.lispcast.com/master-one-skill-at-a-time</link>
                  <pubDate>Thu 10 Mar 2016 03:36:58 PM CST</pubDate>
                  <description>
                    Research shows that developing mastery of a large skill is best done by mastering smaller skills that you can achieve 90% accuracy in very quickly. LispCast Introduction to Clojure has broken the skills you need down for you.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/master-one-skill-at-a-time"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Practice as soon as possible</title>
                  <guid isPermalink="false">http://www.lispcast.com/start-practicing-soon</guid>
                  <link>http://www.lispcast.com/start-practicing-soon</link>
                  <pubDate>Thu 10 Mar 2016 02:56:26 PM CST</pubDate>
                  <description>
                    Much of the difficulty of learning a new language is caused by knowing more than you are comfortable doing. It's so important to get started practicing real programming as soon as possible.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/start-practicing-soon"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Importance of Embodied Metaphors</title>
                  <guid isPermalink="false">http://www.lispcast.com/interactive-baking</guid>
                  <link>http://www.lispcast.com/interactive-baking</link>
                  <pubDate>Fri 04 Mar 2016 08:48:52 PM CST</pubDate>
                  <description>
                    LispCast Introduction to Clojure teaches Clojure with an &quot;interactive bakery simulation&quot;. The reason is that metaphors that you can embody are a great way to learn abstract things like programming.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/interactive-baking"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why I start teaching Clojure with Imperative Programming</title>
                  <guid isPermalink="false">http://www.lispcast.com/imperative-intro</guid>
                  <link>http://www.lispcast.com/imperative-intro</link>
                  <pubDate>Thu 03 Mar 2016 09:58:50 PM CST</pubDate>
                  <description>
                    LispCast Introduction to Clojure starts with 30 minutes of imperative programming. We write programs for their effects, so imperative is a great place to start.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/imperative-intro"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>deftype vs defrecord</title>
                  <guid isPermalink="false">http://www.lispcast.com/deftype-vs-defrecord</guid>
                  <link>http://www.lispcast.com/deftype-vs-defrecord</link>
                  <pubDate>Thu 03 Mar 2016 06:08:29 PM CST</pubDate>
                  <description>
                    There are two commonly used ways to create new data types in Clojure, deftype and defrecord. They are similar but are intended to be used in two distinct use cases. deftype is for programming constructs and defrecord is for domain constructs.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/deftype-vs-defrecord"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What are macros?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-are-macros</guid>
                  <link>http://www.lispcast.com/what-are-macros</link>
                  <pubDate>Thu 03 Mar 2016 05:45:27 PM CST</pubDate>
                  <description>
                    Macros are one of the most talked about features of Lisp. They are a powerful way to extend the language without modifying the compiler.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-are-macros"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Locks vs Concurrency Primitives</title>
                  <guid isPermalink="false">http://www.lispcast.com/locks-v-concurrency-primitives</guid>
                  <link>http://www.lispcast.com/locks-v-concurrency-primitives</link>
                  <pubDate>Mon 29 Feb 2016 05:23:08 PM CST</pubDate>
                  <description>
                    Many people have asked me why Clojure has concurrency primitives. Aren't locks good enough? A humorous metaphor is elaborated.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/locks-v-concurrency-primitives"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>All about clojure.set</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-set</guid>
                  <link>http://www.lispcast.com/clojure-set</link>
                  <pubDate>Sun 29 Feb 2016 4:00:54 AM CST</pubDate>
                  <description>
                    clojure.set is part of the standard library that comes with Clojure. It has functions for doing set operations and relational algebra.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-set"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What is Clojure?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-is-clojure</guid>
                  <link>http://www.lispcast.com/what-is-clojure</link>
                  <pubDate>Sat 27 Feb 2016 10:19:45 AM CST</pubDate>
                  <description>
                    Clojure is a general purpose programming language designed for the fast-approaching future.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-is-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How can more layers be more efficient?</title>
                  <guid isPermalink="false">http://www.lispcast.com/more-layers</guid>
                  <link>http://www.lispcast.com/more-layers</link>
                  <pubDate>Sat 20 Feb 2016 06:19:12 PM CST</pubDate>
                  <description>
                    It's common that adding more layers of abstraction or indirection will make things slower. However, React and ClojureScript make web pages faster than doing it by hand -- essentially programming the bare web. The lesson is that if you choose your layers well, they can actually make your system faster.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/more-layers"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Reasoning About Code</title>
                  <guid isPermalink="false">http://www.lispcast.com/reasoning-about-code</guid>
                  <link>http://www.lispcast.com/reasoning-about-code</link>
                  <pubDate>Sat 20 Feb 2016 04:37:09 PM CST</pubDate>
                  <description>
                    Functional programmers often use the term &quot;reason about code&quot;. It's not very well defined generally, but I use it myself to refer to our ability to use our real-world intuition in our own code.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/reasoning-about-code"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Immutable Paper</title>
                  <guid isPermalink="false">http://www.lispcast.com/immutable-paper</guid>
                  <link>http://www.lispcast.com/immutable-paper</link>
                  <pubDate>Wed 10 Feb 2016 12:37:56 PM CST</pubDate>
                  <description>
                    Immutable data appear to contradict our observations of the real world. Things in the world are mutable, so shouldn't our data be mutable, too? It may be counterintuitive, but immutable data does a better job of modeling many of our expectations of the real world.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/immutable-paper"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Composable parts</title>
                  <guid isPermalink="false">http://www.lispcast.com/composable-parts</guid>
                  <link>http://www.lispcast.com/composable-parts</link>
                  <pubDate>Mon 08 Feb 2016 06:07:28 PM CST</pubDate>
                  <description>
                    Composition is an important idea in programming, and Functional Programming brings it to the forefront. But what does it mean to say things are composable?

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/composable-parts"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Recommendations for Next-Level Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-the-next-level</guid>
                  <link>http://www.lispcast.com/clojure-the-next-level</link>
                  <pubDate>Sun 24 Jan 2016 03:29:46 PM CST</pubDate>
                  <description>
                    There are many classics of functional programming that can help you take your thinking to the next level. My recommendations are for making you think in a new way.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-the-next-level"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Global Mutable State</title>
                  <guid isPermalink="false">http://www.lispcast.com/global-mutable-state</guid>
                  <link>http://www.lispcast.com/global-mutable-state</link>
                  <pubDate>Wed 06 Jan 2016 05:13:43 PM CST</pubDate>
                  <description>
                    Global mutable state is one of the biggest drivers of complexity in software systems. We tackle a definition and how to reduce our reliance on it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/global-mutable-state"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to Switch from the Imperative Mindset</title>
                  <guid isPermalink="false">http://www.lispcast.com/imperative-mindset</guid>
                  <link>http://www.lispcast.com/imperative-mindset</link>
                  <pubDate>Sat 12 Dec 2015 06:04:21 AM CST</pubDate>
                  <description>
                    Functional programming, from one perspective, is just a collection of habits that affect our programming. I've identified the cues for those habits and a routine for replacing imperative code with functional code.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/imperative-mindset"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure + Ruby</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-ruby-videos</guid>
                  <link>http://www.lispcast.com/clojure-ruby-videos</link>
                  <pubDate>Wed 03 Dec 2015 10:51:00 AM CST</pubDate>
                  <description>
                    If you're a Rubyist and you've heard some buzz about Clojure, these videos and links will be just for you. Rubyists teaching Clojure, Clojurists introducing Clojure to Ruby programmers, and Rubyists pontificating on Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-ruby-videos"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>2 Features of Clojure Editors Professionals Won't Do Without</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-editors</guid>
                  <link>http://www.lispcast.com/clojure-editors</link>
                  <pubDate>Sat 28 Nov 2015 12:00:45 AM CST</pubDate>
                  <description>
                    Professional Clojure programmers rely on certain features of their editors to help them program. When choosing an editor, it's important to pick one that has these two important features: REPL integration and structural editing.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-editors"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The 100 Most Used Clojure Expressions</title>
                  <guid isPermalink="false">http://www.lispcast.com/100-most-used-clojure-expressions</guid>
                  <link>http://www.lispcast.com/100-most-used-clojure-expressions</link>
                  <pubDate>Sat 14 Nov 2015 05:43:51 AM CST</pubDate>
                  <description>
                    Would you like to optimize your learning of Clojure? Would you like to focus on learning only the most useful parts of the language first? Take this lesson from second language learning: learn the expressions in order of frequency of use.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/100-most-used-clojure-expressions"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>SOLID Principles in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/solid-principles-in-clojure</guid>
                  <link>http://www.lispcast.com/solid-principles-in-clojure</link>
                  <pubDate>Sun 09 Nov 2015 3:22:01 PM CST</pubDate>
                  <description>
                    The SOLID principles are guidelines for writing good Object-Oriented code. It turns out that these principles are followed and embodied in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/solid-principles-in-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Where to find time to learn and practice Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/where-to-find-time-to-learn-clojure</guid>
                  <link>http://www.lispcast.com/where-to-find-time-to-learn-clojure</link>
                  <pubDate>Wed 04 Nov 2015 02:44:41 PM CST</pubDate>
                  <description>
                    Learning any new language is a challenge, and Clojure is no different. Finding the time to learn and practice is a real challenge, so we need to make the most of what time we have. These tips will help you immerse yourself in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/where-to-find-time-to-learn-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Parens vs Brackets in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/parens-vs-brackets-in-clojure</guid>
                  <link>http://www.lispcast.com/parens-vs-brackets-in-clojure</link>
                  <pubDate>Mon 02 Nov 2015 10:05:06 PM CST</pubDate>
                  <description>
                    Clojure uses both parentheses and square brackets as part of its syntax. It might at first appear to be arbitrary, but it's actually systematic. What's more, it reveals one of the coolest things about Clojure: expressions define how they interpret their arguments.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/parens-vs-brackets-in-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>clj-refactor cheatsheets</title>
                  <guid isPermalink="false">http://www.lispcast.com/clj-refactor</guid>
                  <link>http://www.lispcast.com/clj-refactor</link>
                  <pubDate>Wed 28 Oct 2015 05:31:10 PM CDT</pubDate>
                  <description>
                    I've made some cheatsheets to help me learn clj-refactor, some Emacs software that helps you make systematic changes to code.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clj-refactor"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to Read Clojure Code Like an Expert</title>
                  <guid isPermalink="false">http://www.lispcast.com/how-to-read-code-like-a-clojure-expert</guid>
                  <link>http://www.lispcast.com/how-to-read-code-like-a-clojure-expert</link>
                  <pubDate>Wed 14 Oct 2015 08:47:09 PM CDT</pubDate>
                  <description>
                    As you get better with Clojure, it becomes easier to read. Why not jump ahead of the learning curve and read like an expert? Focus on the first thing, use the indentation, and read the evaluation order.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/how-to-read-code-like-a-clojure-expert"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Knowing this one ClojureScript gotcha will save you hours</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojurescript-externs</guid>
                  <link>http://www.lispcast.com/clojurescript-externs</link>
                  <pubDate>Sat 20 Sep 2015 01:00:02 PM CDT</pubDate>
                  <description>
                    ClojureScript optimizes names by replacing them with shorter ones. Usually, that's a good thing. But it can get carried away. Externs are how you help it know what's unsafe to optimize.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojurescript-externs"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How can you test ClojureScript applications and libraries?</title>
                  <guid isPermalink="false">http://www.lispcast.com/testing-clojurescript</guid>
                  <link>http://www.lispcast.com/testing-clojurescript</link>
                  <pubDate>Fri 19 Sep 2015 01:41:04 PM CDT</pubDate>
                  <description>
                    Although it's still early, ClojureScript is rapidly maturing its testing story. There are a Leiningen plugin and a Boot task for autocompiling ClojureScript as it changes and running tests in a variety of engines.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/testing-clojurescript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Will having ClojureScript, yet another asset type, slow down my deploys?</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojurescript-build-times</guid>
                  <link>http://www.lispcast.com/clojurescript-build-times</link>
                  <pubDate>Wed 17 Sep 2015 1:14:49 PM CDT</pubDate>
                  <description>
                    ClojureScript builds can take a long time. But the extra time is worth it. It reduces the download size significantly.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojurescript-build-times"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Can building ClojureScript assets be integrated into my build process?</title>
                  <guid isPermalink="false">http://www.lispcast.com/building-clojurescript-process</guid>
                  <link>http://www.lispcast.com/building-clojurescript-process</link>
                  <pubDate>Wed 16 Sep 2015 03:52:12 PM CDT</pubDate>
                  <description>
                    ClojureScript's official build process is a simple shell command. There is also integration into Leiningen and Boot.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/building-clojurescript-process"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Are there any DOM manipulation libraries in ClojureScript?</title>
                  <guid isPermalink="false">http://www.lispcast.com/cljs-dom-manipulation</guid>
                  <link>http://www.lispcast.com/cljs-dom-manipulation</link>
                  <pubDate>Tue 15 Sep 2015 01:04:20 PM CDT</pubDate>
                  <description>
                    ClojureScript has some nice DOM manipulation options, including jQuery and more idiomatic libraries.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/cljs-dom-manipulation"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What is React?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-is-react</guid>
                  <link>http://www.lispcast.com/what-is-react</link>
                  <pubDate>Sun 14 Sep 2015 01:00:45 PM CDT</pubDate>
                  <description>
                    React is a view library for web pages that makes DOM rendering in a functional style really easy. React makes web programming fun again.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-is-react"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What's the fastest way to get started using ClojureScript?</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojurescript-fast-start</guid>
                  <link>http://www.lispcast.com/clojurescript-fast-start</link>
                  <pubDate>Sat 13 Sep 2015 01:51:28 PM CDT</pubDate>
                  <description>
                    If you know Clojure already and just want to experiment writing ClojureScript, using Figwheel can really help get you there quickly. I show you how in a few commands.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojurescript-fast-start"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Won't it be hard to debug ClojureScript in my browser?</title>
                  <guid isPermalink="false">http://www.lispcast.com/debugging-clojurescript</guid>
                  <link>http://www.lispcast.com/debugging-clojurescript</link>
                  <pubDate>Sat 12 Sep 2015 03:03:13 PM CDT</pubDate>
                  <description>
                    Even though ClojureScript adds another layer of abstraction, the tooling makes it easier to debug that plain JavaScript.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/debugging-clojurescript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What is ClojureScript?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-is-clojurescript</guid>
                  <link>http://www.lispcast.com/what-is-clojurescript</link>
                  <pubDate>Fri 11 Sep 2015 01:07:15 PM CDT</pubDate>
                  <description>
                    ClojureScript is Clojure that compiles to JavaScript. It combines the power of Clojure with the reach of JavaScript.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-is-clojurescript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Most Important Idea in Computer Science</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-most-important-idea-in-computer-science</guid>
                  <link>http://www.lispcast.com/the-most-important-idea-in-computer-science</link>
                  <pubDate>Fri 28 Aug 2015 01:22:35 AM CDT</pubDate>
                  <description>
                    Computer Science has ideas that are important to the broader world. The most important is the Universal Turing Machine. From one perspective, Lisp embodies the idea at its core. To really understand how, I ask you to implement your own Lisp interpreter.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-most-important-idea-in-computer-science"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Let's TDD clojure.core/reduce</title>
                  <guid isPermalink="false">http://www.lispcast.com/lets-tdd-clojure-core-reduce</guid>
                  <link>http://www.lispcast.com/lets-tdd-clojure-core-reduce</link>
                  <pubDate>Mon 17 Aug 2015 09:53:32 PM CDT</pubDate>
                  <description>
                    `clojure.core/reduce` is a powerful function, yet the code for it is so simple. It's four lines! We TDD our own implementation.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/lets-tdd-clojure-core-reduce"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>A reduce Example Explained</title>
                  <guid isPermalink="false">http://www.lispcast.com/reduce-example-explained</guid>
                  <link>http://www.lispcast.com/reduce-example-explained</link>
                  <pubDate>Mon 10 Aug 2015 09:46:29 PM CDT</pubDate>
                  <description>
                    A deep-dive into a single reduce example shows how much can happen in a short bit of code.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/reduce-example-explained"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Let's TDD clojure.core/map</title>
                  <guid isPermalink="false">http://www.lispcast.com/tdd-clojure-core-map</guid>
                  <link>http://www.lispcast.com/tdd-clojure-core-map</link>
                  <pubDate>Tue 04 Aug 2015 11:27:58 PM CDT</pubDate>
                  <description>
                    Learning to write map is a good lesson because it has recursion, list building, and higher order functions. It's everything that makes Lisp great.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/tdd-clojure-core-map"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Annotated map</title>
                  <guid isPermalink="false">http://www.lispcast.com/annotated-map</guid>
                  <link>http://www.lispcast.com/annotated-map</link>
                  <pubDate>Wed 29 Jul 2015 09:33:06 PM CDT</pubDate>
                  <description>
                    map is one of the staples of functional programming. It's totally useful and also surprisingly simple. Let's look at some examples and annotated code.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/annotated-map"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Some Annotated clojure.core/reduce Examples</title>
                  <guid isPermalink="false">http://www.lispcast.com/annotated-clojure-core-reduce</guid>
                  <link>http://www.lispcast.com/annotated-clojure-core-reduce</link>
                  <pubDate>Tue 21 Jul 2015 10:40:39 PM CDT</pubDate>
                  <description>
                    reduce is a very useful function. You can use it for many calculations over a collection. Code annotations are useful, as are physical metaphors.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/annotated-clojure-core-reduce"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Reduce Complexity with Variants</title>
                  <guid isPermalink="false">http://www.lispcast.com/reduce-complexity-with-variants</guid>
                  <link>http://www.lispcast.com/reduce-complexity-with-variants</link>
                  <pubDate>Wed 08 Jul 2015 11:09:35 PM EDT</pubDate>
                  <description>
                    The structure of our data should match the relevant structures in the real world. And to ensure that our data is structured well, we should reduce the potential for incorrect structure. Variants provide a great solution for it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/reduce-complexity-with-variants"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Avoid Naming at All Costs</title>
                  <guid isPermalink="false">http://www.lispcast.com/avoid-naming-at-all-costs</guid>
                  <link>http://www.lispcast.com/avoid-naming-at-all-costs</link>
                  <pubDate>Sun 05 Jul 2015 09:51:29 AM CDT</pubDate>
                  <description>
                    If naming is one of the two hardest things in programming, it follows that every other possible solution (except those few involving cache invalidation) should be attempted before naming something. As a corrolary, bad names are a code smell.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/avoid-naming-at-all-costs"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Mastering ClojureScript Routing with Secretary and goog.History</title>
                  <guid isPermalink="false">http://www.lispcast.com/mastering-client-side-routing-with-secretary-and-goog-history</guid>
                  <link>http://www.lispcast.com/mastering-client-side-routing-with-secretary-and-goog-history</link>
                  <pubDate>Wed 24 Jun 2015 11:27:14 PM CDT</pubDate>
                  <description>
                    The Google Closure Library provides a nice interface to the HTML5 History API. Coupling it with Secretary is very easy. But not all browsers support HTML5 History. In this post I'll talk about one way to make sure you have client-side routing in all browsers.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/mastering-client-side-routing-with-secretary-and-goog-history"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How I made my Clojure database tests 5x faster</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-database-test-faster</guid>
                  <link>http://www.lispcast.com/clojure-database-test-faster</link>
                  <pubDate>Wed 17 Jun 2015 05:12:05 PM CDT</pubDate>
                  <description>
                    Setting up and tearing down a test database can be slow. Use a rolled back transaction to quickly reset the database to a known state. You can do that in an `:each` fixture to run each test in isolation.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-database-test-faster"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>TDD Workflow in Clojure using Emacs with CIDER</title>
                  <guid isPermalink="false">http://www.lispcast.com/tdd-workflow-in-clojure-with-emacs-and-cider</guid>
                  <link>http://www.lispcast.com/tdd-workflow-in-clojure-with-emacs-and-cider</link>
                  <pubDate>Mon 08 Jun 2015 10:15:10 PM CDT</pubDate>
                  <description>
                    TDD is about fast feedback. CIDER tightens the feedback loop with quick commands for running tests and a powerful test reporting system.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/tdd-workflow-in-clojure-with-emacs-and-cider"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Lambda Abstraction</title>
                  <guid isPermalink="false">http://www.lispcast.com/lambda-abstraction</guid>
                  <link>http://www.lispcast.com/lambda-abstraction</link>
                  <pubDate>Sun 17 May 2015 11:40:36 PM CDT</pubDate>
                  <description>
                    Lambda abstractions are always leaky, but some are leakier than others. Clojure programmers recommend keeping most of your functions pure and containing the leaks as much as possible.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/lambda-abstraction"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Infinite Application</title>
                  <guid isPermalink="false">http://www.lispcast.com/infinite-application</guid>
                  <link>http://www.lispcast.com/infinite-application</link>
                  <pubDate>Sun 17 May 2015 10:26:44 PM CDT</pubDate>
                  <description>
                    Function application is a key concept in lambda calculus. While it is commonly expressed using parentheses in Clojure, it is also reified into a function which itself can be applied to another function.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/infinite-application"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>But the World is Mutable</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-world-is-mutable</guid>
                  <link>http://www.lispcast.com/the-world-is-mutable</link>
                  <pubDate>Mon 11 May 2015 11:46:58 PM CDT</pubDate>
                  <description>
                    The world may be mutable, but people have been using the notion of immutability to build reliable systems for a long time.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-world-is-mutable"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>clojure.test cheatsheet</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-test-cheatsheet</guid>
                  <link>http://www.lispcast.com/clojure-test-cheatsheet</link>
                  <pubDate>Sun 03 May 2015 10:59:22 PM CDT</pubDate>
                  <description>
                    I made a clojure.test cheatsheet that you can get for free.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-test-cheatsheet"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Ron Toland</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-ron-toland</guid>
                  <link>http://www.lispcast.com/pre-west-interview-ron-toland</link>
                  <pubDate>Tue 21 Apr 2015 10:10:26 AM CDT</pubDate>
                  <description>
                    Ront Toland will talk about developing large Clojure applications.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-ron-toland"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Nathaniel Smith and Ruth Linehan</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-nathaniel-smith-ruth-linehan</guid>
                  <link>http://www.lispcast.com/pre-west-interview-nathaniel-smith-ruth-linehan</link>
                  <pubDate>Tue 21 Apr 2015 10:10:14 AM CDT</pubDate>
                  <description>
                    Nathaniel Smith and Ruth Linehan will talk about developing large applications in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-nathaniel-smith-ruth-linehan"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Leon Barrett</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-leon-barrett</guid>
                  <link>http://www.lispcast.com/pre-west-interview-leon-barrett</link>
                  <pubDate>Sun 19 Apr 2015 10:46:07 AM CDT</pubDate>
                  <description>
                    Leon Barrett will talk about parallel programming in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-leon-barrett"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Priyatam Mudivarti</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-priyatam-mudivarti</guid>
                  <link>http://www.lispcast.com/pre-west-interview-priyatam-mudivarti</link>
                  <pubDate>Sun 19 Apr 2015 10:32:22 AM CDT</pubDate>
                  <description>
                    Priyatam Mudivarti is giving a talk about grid systems in Garden.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-priyatam-mudivarti"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Elango Cheran</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-elango-cheran</guid>
                  <link>http://www.lispcast.com/pre-west-interview-elango-cheran</link>
                  <pubDate>Sun 19 Apr 2015 10:32:10 AM CDT</pubDate>
                  <description>
                    Elango Cheran will talk about translating Clojure to other human languages.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-elango-cheran"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Robert Krahn</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-robert-krahn</guid>
                  <link>http://www.lispcast.com/pre-west-interview-robert-krahn</link>
                  <pubDate>Sun 19 Apr 2015 10:32:00 AM CDT</pubDate>
                  <description>
                    Robert Krahn will talk about bringin Smalltalk features to Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-robert-krahn"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Tom Faulhaber</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-tom-faulhaber</guid>
                  <link>http://www.lispcast.com/pre-west-interview-tom-faulhaber</link>
                  <pubDate>Sat 18 Apr 2015 02:11:52 PM CDT</pubDate>
                  <description>
                    Tom Faulhaber interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-tom-faulhaber"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Tyler Tallman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-tyler-tallman</guid>
                  <link>http://www.lispcast.com/pre-west-interview-tyler-tallman</link>
                  <pubDate>Sat 18 Apr 2015 01:59:13 PM CDT</pubDate>
                  <description>
                    Tyler Tallman interview by Nola Stowe.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-tyler-tallman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Bruce Hauman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-bruce-hauman</guid>
                  <link>http://www.lispcast.com/pre-west-interview-bruce-hauman</link>
                  <pubDate>Sat 18 Apr 2015 01:49:59 PM CDT</pubDate>
                  <description>
                    Bruce Hauman will talk about Figwheel

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-bruce-hauman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Christopher Small</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-christopher-small</guid>
                  <link>http://www.lispcast.com/pre-west-interview-christopher-small</link>
                  <pubDate>Thu 16 Apr 2015 09:09:46 AM CDT</pubDate>
                  <description>
                    Christopher Small will talk about automating chicken coops with Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-christopher-small"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Nathan Sorenson</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-nathan-sorenson</guid>
                  <link>http://www.lispcast.com/pre-west-interview-nathan-sorenson</link>
                  <pubDate>Wed 15 Apr 2015 11:43:27 PM CDT</pubDate>
                  <description>
                    Nathan Sorenson interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-nathan-sorenson"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: James MacAulay</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-james-macaulay</guid>
                  <link>http://www.lispcast.com/pre-west-interview-james-macaulay</link>
                  <pubDate>Wed 15 Apr 2015 11:43:16 PM CDT</pubDate>
                  <description>
                    James MacAulay interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-james-macaulay"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Zach Tellman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-zach-tellman</guid>
                  <link>http://www.lispcast.com/pre-west-interview-zach-tellman</link>
                  <pubDate>Wed 15 Apr 2015 11:43:01 PM CDT</pubDate>
                  <description>
                    Zach Tellman interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-zach-tellman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Nathan Sorenson</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-nathan-sorenson</guid>
                  <link>http://www.lispcast.com/pre-west-nathan-sorenson</link>
                  <pubDate>Wed 15 Apr 2015 11:10:22 PM CDT</pubDate>
                  <description>
                    Nathan Sorenson will talk about type systems and macros.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-nathan-sorenson"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: James MacAulay</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-james-macaulay</guid>
                  <link>http://www.lispcast.com/pre-west-james-macaulay</link>
                  <pubDate>Wed 15 Apr 2015 10:45:56 PM CDT</pubDate>
                  <description>
                    James MacAulay will talk about Zelkova and FRP.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-james-macaulay"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Zach Tellman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-zach-tellman</guid>
                  <link>http://www.lispcast.com/pre-west-zach-tellman</link>
                  <pubDate>Wed 15 Apr 2015 10:31:34 PM CDT</pubDate>
                  <description>
                    Zach Tellman will talk about Queueing Theory.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-zach-tellman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Fumiko Hanreich</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-fumiko-hanreich</guid>
                  <link>http://www.lispcast.com/pre-west-interview-fumiko-hanreich</link>
                  <pubDate>Wed 15 Apr 2015 09:30:06 PM CDT</pubDate>
                  <description>
                    Fumiko Hanreich interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-fumiko-hanreich"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Morgan Mullaney</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-morgan-mullaney</guid>
                  <link>http://www.lispcast.com/pre-west-interview-morgan-mullaney</link>
                  <pubDate>Wed 15 Apr 2015 01:35:01 PM CDT</pubDate>
                  <description>
                    Morgan Mullaney interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-morgan-mullaney"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Elena Machkasova</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-elena-machkasova</guid>
                  <link>http://www.lispcast.com/pre-west-interview-elena-machkasova</link>
                  <pubDate>Wed 15 Apr 2015 01:17:55 PM CDT</pubDate>
                  <description>
                    Elena Machkasova interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-elena-machkasova"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Luke VanderHart</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-luke-vanderhart</guid>
                  <link>http://www.lispcast.com/pre-west-interview-luke-vanderhart</link>
                  <pubDate>Wed 15 Apr 2015 12:57:28 PM CDT</pubDate>
                  <description>
                    Luke VanderHart interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-luke-vanderhart"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Ryan Neufeld</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-ryan-neufeld</guid>
                  <link>http://www.lispcast.com/pre-west-interview-ryan-neufeld</link>
                  <pubDate>Tue 14 Apr 2015 11:33:53 PM CDT</pubDate>
                  <description>
                    Ryan Neufeld interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-ryan-neufeld"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: John Hume</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-john-hume</guid>
                  <link>http://www.lispcast.com/pre-west-interview-john-hume</link>
                  <pubDate>Tue 14 Apr 2015 01:39:07 PM CDT</pubDate>
                  <description>
                    John Hume interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-john-hume"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Yoko Harada</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-yoko-harada</guid>
                  <link>http://www.lispcast.com/pre-west-interview-yoko-harada</link>
                  <pubDate>Fri 10 Apr 2015 09:35:05 PM CDT</pubDate>
                  <description>
                    Yoko Harada interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-yoko-harada"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Anthony Marcar</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-anthony-marcar</guid>
                  <link>http://www.lispcast.com/pre-west-interview-anthony-marcar</link>
                  <pubDate>Fri 10 Apr 2015 09:32:03 PM CDT</pubDate>
                  <description>
                    Anthony Marcar will talk about large-scale production Clojure applications.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-anthony-marcar"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Luke Vanderhart</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-luke-vanderhart</guid>
                  <link>http://www.lispcast.com/pre-west-luke-vanderhart</link>
                  <pubDate>Thu 09 Apr 2015 04:15:58 PM CDT</pubDate>
                  <description>
                    Luke Vanderhart will talk about ReactJS.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-luke-vanderhart"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Brandon Bloom</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-brandon-bloom</guid>
                  <link>http://www.lispcast.com/pre-west-interview-brandon-bloom</link>
                  <pubDate>Thu 09 Apr 2015 04:00:45 PM CDT</pubDate>
                  <description>
                    Brandon Bloom will talk about Om.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-brandon-bloom"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Gary Fredericks</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-gary-fredericks</guid>
                  <link>http://www.lispcast.com/pre-west-interview-gary-fredericks</link>
                  <pubDate>Thu 09 Apr 2015 01:45:04 PM CDT</pubDate>
                  <description>
                    Gary Fredericks interview by Nola.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-gary-fredericks"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Zachary Kim</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-zachary-kim</guid>
                  <link>http://www.lispcast.com/pre-west-zachary-kim</link>
                  <pubDate>Thu 09 Apr 2015 09:28:16 AM CDT</pubDate>
                  <description>
                    Zachary Kim will talk about mobile development in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-zachary-kim"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Tyler Tallman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-tyler-tallman</guid>
                  <link>http://www.lispcast.com/pre-west-tyler-tallman</link>
                  <pubDate>Wed 08 Apr 2015 06:12:04 PM CDT</pubDate>
                  <description>
                    Tyler Tallman will talk about modeling complex problems in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-tyler-tallman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Soren Macbeth</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-soren-macbeth</guid>
                  <link>http://www.lispcast.com/pre-west-soren-macbeth</link>
                  <pubDate>Mon 06 Apr 2015 11:30:52 PM CDT</pubDate>
                  <description>
                    Soren Macbeth will talk about data crunching in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-soren-macbeth"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Timothy Gardner and Ramsey Nasser</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-timothy-gardner-ramsey-nasser</guid>
                  <link>http://www.lispcast.com/pre-west-timothy-gardner-ramsey-nasser</link>
                  <pubDate>Mon 06 Apr 2015 11:30:52 PM CDT</pubDate>
                  <description>
                    Timothy Gardner and Ramsey Nasser will talk about Arcadia.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-timothy-gardner-ramsey-nasser"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Sean Johnson</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-sean-johnson</guid>
                  <link>http://www.lispcast.com/pre-west-sean-johnson</link>
                  <pubDate>Mon 06 Apr 2015 11:29:45 PM CDT</pubDate>
                  <description>
                    Sean Johnson will talk about pattern matching.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-sean-johnson"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Tom Faulhaber</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-tom-faulhaber</guid>
                  <link>http://www.lispcast.com/pre-west-tom-faulhaber</link>
                  <pubDate>Mon 06 Apr 2015 11:29:45 PM CDT</pubDate>
                  <description>
                    Tom Faulhaber will talk about generating Excel sheets.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-tom-faulhaber"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Ron Toland</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-ron-toland</guid>
                  <link>http://www.lispcast.com/pre-west-ron-toland</link>
                  <pubDate>Mon 06 Apr 2015 09:36:49 PM CDT</pubDate>
                  <description>
                    Ron Toland will talk about large-scale Clojure systems.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-ron-toland"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Colin Fleming</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-colin-fleming</guid>
                  <link>http://www.lispcast.com/pre-west-interview-colin-fleming</link>
                  <pubDate>Sun 05 Apr 2015 04:59:35 PM CDT</pubDate>
                  <description>
                    Colin Fleming will talk about debugging in Cursive.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-colin-fleming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Melanie Mitchell</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-melanie-mitchell</guid>
                  <link>http://www.lispcast.com/pre-west-interview-melanie-mitchell</link>
                  <pubDate>Sun 05 Apr 2015 04:26:48 PM CDT</pubDate>
                  <description>
                    Melanie Mitchell will talk about computer systems that recognize visual situations.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-melanie-mitchell"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Ryan Neufeld</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-ryan-neufeld</guid>
                  <link>http://www.lispcast.com/pre-west-ryan-neufeld</link>
                  <pubDate>Sun 05 Apr 2015 11:44:16 AM CDT</pubDate>
                  <description>
                    Ryan Neufeld will talk about simulation testing.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-ryan-neufeld"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Robert Krahn</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-robert-krahn</guid>
                  <link>http://www.lispcast.com/pre-west-robert-krahn</link>
                  <pubDate>Sun 05 Apr 2015 11:14:03 AM CDT</pubDate>
                  <description>
                    Robert Krahn will talk about cloxp.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-robert-krahn"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Priyatam Mudivarti</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-priyatam-mudivarti</guid>
                  <link>http://www.lispcast.com/pre-west-priyatam-mudivarti</link>
                  <pubDate>Sat 04 Apr 2015 10:54:48 PM CDT</pubDate>
                  <description>
                    Priyatam Mudivarti will talk about generating CSS with Garden.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-priyatam-mudivarti"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Nathaniel Smith and Ruth Linehan</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-nathaniel-smith-ruth-linehan</guid>
                  <link>http://www.lispcast.com/pre-west-nathaniel-smith-ruth-linehan</link>
                  <pubDate>Sat 04 Apr 2015 10:40:47 PM CDT</pubDate>
                  <description>
                    Nathaniel Smith and Ruth Linehan will talk about Trapperkeeper.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-nathaniel-smith-ruth-linehan"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Leon Barrett</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-leon-barrett</guid>
                  <link>http://www.lispcast.com/pre-west-leon-barrett</link>
                  <pubDate>Sat 04 Apr 2015 02:55:03 PM CDT</pubDate>
                  <description>
                    Leon Barrett will talk about parallelism in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-leon-barrett"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Morgan Mullaney</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-morgan-mullaney</guid>
                  <link>http://www.lispcast.com/pre-west-morgan-mullaney</link>
                  <pubDate>Sat 04 Apr 2015 02:07:28 PM CDT</pubDate>
                  <description>
                    Morgan Mullaney will talk about functional game programming.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-morgan-mullaney"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Jeanine Adkisson</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-jeanine-adkisson</guid>
                  <link>http://www.lispcast.com/pre-west-jeanine-adkisson</link>
                  <pubDate>Fri 03 Apr 2015 11:49:08 PM CDT</pubDate>
                  <description>
                    Jeanine Adkisson will talk about prototyping a language in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-jeanine-adkisson"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Elena Machkasova</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-elena-machkasova</guid>
                  <link>http://www.lispcast.com/pre-west-elena-machkasova</link>
                  <pubDate>Fri 03 Apr 2015 10:07:16 PM CDT</pubDate>
                  <description>
                    Elena Machkasova will talk about teaching Clojure to novice programmers.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-elena-machkasova"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Gary Fredericks</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-gary-fredericks</guid>
                  <link>http://www.lispcast.com/pre-west-gary-fredericks</link>
                  <pubDate>Fri 03 Apr 2015 10:07:16 PM CDT</pubDate>
                  <description>
                    Gary Fredericks will talk about functional random number generators.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-gary-fredericks"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Interview: Alan Dipert and Micha Niskin</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-interview-alan-dipert-micha-niskin</guid>
                  <link>http://www.lispcast.com/pre-west-interview-alan-dipert-micha-niskin</link>
                  <pubDate>Fri 03 Apr 2015 10:07:08 PM CDT</pubDate>
                  <description>
                    Alan Dipert and Micha Niskin will talk about Boot.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-interview-alan-dipert-micha-niskin"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Fumiko Hanreich</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-fumiko-hanreich</guid>
                  <link>http://www.lispcast.com/pre-west-fumiko-hanreich</link>
                  <pubDate>Mon 30 Mar 2015 11:09:44 PM EDT</pubDate>
                  <description>
                    Fumiko Hanreich will talk about HoneySQL.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-fumiko-hanreich"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure Test Directory</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-test-directory</guid>
                  <link>http://www.lispcast.com/clojure-test-directory</link>
                  <pubDate>Mon 30 Mar 2015 10:55:57 PM EDT</pubDate>
                  <description>
                    Where to put your tests is a common question. You could put them anywhere, but you want to pick a place that makes it easy to find, easy to exclude from production, and work well with your tools. My recommendation is to follow what most projects do, which takes care of all of these requirements.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-test-directory"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: John Hume</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-john-hume</guid>
                  <link>http://www.lispcast.com/pre-west-john-hume</link>
                  <pubDate>Sun 29 Mar 2015 07:18:19 PM CDT</pubDate>
                  <description>
                    Life of a clojure expression: a quick tour of clojure internals

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-john-hume"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Yoko Harada</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-yoko-harada</guid>
                  <link>http://www.lispcast.com/pre-west-yoko-harada</link>
                  <pubDate>Sun 29 Mar 2015 07:05:22 PM CDT</pubDate>
                  <description>
                    Yoko Harada will be speaking on ClojureBridge and the challenges of writing a curriculum for beginner programmers.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-yoko-harada"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>LispCast Intro to clojure.test</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-test-launch</guid>
                  <link>http://www.lispcast.com/clojure-test-launch</link>
                  <pubDate>Sat 28 Mar 2015 01:36:41 PM CDT</pubDate>
                  <description>
                    LispCast Intro to clojure.test will launch this week.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-test-launch"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Example-based Unit Testing in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/unit-testing-in-functional-languages</guid>
                  <link>http://www.lispcast.com/unit-testing-in-functional-languages</link>
                  <pubDate>Thu 26 Mar 2015 11:36:28 AM CDT</pubDate>
                  <description>
                    Unit testing in Clojure is straightforward. Here are a few testing ideas as they apply to Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/unit-testing-in-functional-languages"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The conj Mental Bump</title>
                  <guid isPermalink="false">http://www.lispcast.com/conj-mental-bump</guid>
                  <link>http://www.lispcast.com/conj-mental-bump</link>
                  <pubDate>Mon 23 Mar 2015 11:18:42 PM CDT</pubDate>
                  <description>
                    conj can be confusing if you're used to other languages. It is not a commonly defined operation. Most languages define common positional adding operations. conj, however, has more useful semantics. How do you use conj usefully if you can't guarantee the position?

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/conj-mental-bump"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Elango Cheran</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-elango-cheran</guid>
                  <link>http://www.lispcast.com/pre-west-elango-cheran</link>
                  <pubDate>Sat 21 Mar 2015 11:28:46 PM CDT</pubDate>
                  <description>
                    Elango Cheran will talk about writing Clojure in other spoken languages.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-elango-cheran"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Dan Lidral-Porter</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-dan-lidral-porter</guid>
                  <link>http://www.lispcast.com/pre-west-dan-lidral-porter</link>
                  <pubDate>Sat 21 Mar 2015 10:33:56 PM CDT</pubDate>
                  <description>
                    Dan Lidral-Porter will talk about computer-generated art in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-dan-lidral-porter"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Colin Fleming</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-colin-fleming</guid>
                  <link>http://www.lispcast.com/pre-west-colin-fleming</link>
                  <pubDate>Sat 21 Mar 2015 09:35:14 PM CDT</pubDate>
                  <description>
                    Colin Fleming will talk about debugging in Cursive.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-colin-fleming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Christopher Small</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-christopher-small</guid>
                  <link>http://www.lispcast.com/pre-west-christopher-small</link>
                  <pubDate>Fri 20 Mar 2015 11:01:14 PM CDT</pubDate>
                  <description>
                    Christopher Small will speak about raising chickens with Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-christopher-small"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Bruce Hauman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-bruce-hauman</guid>
                  <link>http://www.lispcast.com/pre-west-bruce-hauman</link>
                  <pubDate>Fri 20 Mar 2015 10:28:55 PM CDT</pubDate>
                  <description>
                    Bruce Hauman will speak about Figwheel.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-bruce-hauman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Brandon Bloom</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-brandon-bloom</guid>
                  <link>http://www.lispcast.com/pre-west-brandon-bloom</link>
                  <pubDate>Fri 20 Mar 2015 01:57:40 AM CDT</pubDate>
                  <description>
                    Brandon Bloom will talk about Om.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-brandon-bloom"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Boris Kourtoukov</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-boris-kourtoukov</guid>
                  <link>http://www.lispcast.com/pre-west-boris-kourtoukov</link>
                  <pubDate>Wed 18 Mar 2015 09:56:01 PM CDT</pubDate>
                  <description>
                    Boris Kourtoukov will talk about Clojure and wearables.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-boris-kourtoukov"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Anthony Marcar</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-anthony-marcar</guid>
                  <link>http://www.lispcast.com/pre-west-anthony-marcar</link>
                  <pubDate>Wed 18 Mar 2015 09:21:45 PM CDT</pubDate>
                  <description>
                    Anthony Marcar will talk about Clojure in the enterprise.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-anthony-marcar"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Alan Dipert and Micha Niskin</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-alan-dipert-micha-niskin</guid>
                  <link>http://www.lispcast.com/pre-west-alan-dipert-micha-niskin</link>
                  <pubDate>Wed 18 Mar 2015 09:26:24 AM CDT</pubDate>
                  <description>
                    Alan Dipert and Micha Niskin will talk about Boot.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-alan-dipert-micha-niskin"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep: Melanie Mitchell</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-melanie-mitchell</guid>
                  <link>http://www.lispcast.com/pre-west-melanie-mitchell</link>
                  <pubDate>Tue 17 Mar 2015 11:22:56 PM CDT</pubDate>
                  <description>
                    Melanie Mitchell will talk about computer systems that recognize visual situations.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-melanie-mitchell"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-West Prep 2015</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-west-2015</guid>
                  <link>http://www.lispcast.com/pre-west-2015</link>
                  <pubDate>Tue 17 Mar 2015 05:03:06 PM CDT</pubDate>
                  <description>
                    Prepare for Clojure/West with media from around the web and interviews.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-west-2015"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to avoid &quot;Makes sense if you already understand it.&quot;</title>
                  <guid isPermalink="false">http://www.lispcast.com/learning-is-about-skills</guid>
                  <link>http://www.lispcast.com/learning-is-about-skills</link>
                  <pubDate>Fri 13 Mar 2015 10:10:30 PM CDT</pubDate>
                  <description>
                    Most technical writing is obtuse unless you already know the topic. Focus on the learner and their skills and it will clarify your writing.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/learning-is-about-skills"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Exponential Backoff</title>
                  <guid isPermalink="false">http://www.lispcast.com/exponential-backoff</guid>
                  <link>http://www.lispcast.com/exponential-backoff</link>
                  <pubDate>Fri 13 Mar 2015 02:01:59 PM CDT</pubDate>
                  <description>
                    A common failure in distributed systems is a server with a rate limit or with no limit but begins failing due to load. A standard solution is to retry after waiting a small time, increasing that time after each failure. We create a macro to handle this waiting and retrying.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/exponential-backoff"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Solarized Cheat Sheet</title>
                  <guid isPermalink="false">http://www.lispcast.com/solarized-cheat-sheet</guid>
                  <link>http://www.lispcast.com/solarized-cheat-sheet</link>
                  <pubDate>Wed 11 Mar 2015 06:22:48 PM CDT</pubDate>
                  <description>
                    Solarized is an awesome color scheme that I use all the time. I was tired of looking up the hex codes, so I made my own cheat sheet. You can download it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/solarized-cheat-sheet"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Object-Oriented Dispatch is the Dual of Functional Dispatch</title>
                  <guid isPermalink="false">http://www.lispcast.com/object-function-duals-dispatch</guid>
                  <link>http://www.lispcast.com/object-function-duals-dispatch</link>
                  <pubDate>Wed 11 Mar 2015 02:56:53 PM CDT</pubDate>
                  <description>
                    Object-oriented dispatch is contrasted with functional dispatch, but they are shown to be two one-dimensional projections of the same two-dimensional data. Clojure does not provide the two-dimensional representation, but does interesting things to transcend the one-dimensional views.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/object-function-duals-dispatch"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Use Task Analysis to Break a Skill Into Steps</title>
                  <guid isPermalink="false">http://www.lispcast.com/task-analysis</guid>
                  <link>http://www.lispcast.com/task-analysis</link>
                  <pubDate>Sat 07 Mar 2015 11:29:06 PM CST</pubDate>
                  <description>
                    Many technical books skip very important skills you need to complete a task. To avoid skipping those skills, use task analysis to break a skill into steps.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/task-analysis"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Try Three Times</title>
                  <guid isPermalink="false">http://www.lispcast.com/try-three-times</guid>
                  <link>http://www.lispcast.com/try-three-times</link>
                  <pubDate>Thu 05 Mar 2015 03:44:38 PM CST</pubDate>
                  <description>
                    Distributed systems fail in indistinguishable ways. Often, retrying is a good solution to intermittent errors. We create a retry macro to handle the retries in a generic way.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/try-three-times"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Data-First Programming</title>
                  <guid isPermalink="false">http://www.lispcast.com/data-first-programming</guid>
                  <link>http://www.lispcast.com/data-first-programming</link>
                  <pubDate>Fri 27 Feb 2015 05:08:54 PM CST</pubDate>
                  <description>
                    If something is important, you should deal with it sooner and more often. That's the approach Clojure takes to data representations. It means serialization of internal data is a non-issue.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/data-first-programming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Paper Metaphor</title>
                  <guid isPermalink="false">http://www.lispcast.com/paper-metaphor</guid>
                  <link>http://www.lispcast.com/paper-metaphor</link>
                  <pubDate>Fri 27 Feb 2015 12:57:38 PM CST</pubDate>
                  <description>
                    Functional programs follow a simple rule: never write on the same paper twice. Imperative programs are free to define their own rules. Both have interesting consequences.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/paper-metaphor"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>On sale now: Intro to clojure.test Early Access</title>
                  <guid isPermalink="false">http://www.lispcast.com/intro-clojure-test-peap</guid>
                  <link>http://www.lispcast.com/intro-clojure-test-peap</link>
                  <pubDate>Fri 27 Feb 2015 09:06:45 AM CST</pubDate>
                  <description>
                    LispCast Intro to clojure.test is on sale now for a limited time through the PurelyFunctional.tv Early Access Program.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/intro-clojure-test-peap"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>PurelyFunctional.tv Early Access Program</title>
                  <guid isPermalink="false">http://www.lispcast.com/purelyfunctional-tv-early-access-program</guid>
                  <link>http://www.lispcast.com/purelyfunctional-tv-early-access-program</link>
                  <pubDate>Wed 25 Feb 2015 12:43:10 PM CST</pubDate>
                  <description>
                    The PurelyFunctional.tv Early Access Program is a way to make courses in a more iterative and interactive way. I'll be publishing Intro to clojure.test this week under PEAP.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/purelyfunctional-tv-early-access-program"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Hiccup Tips</title>
                  <guid isPermalink="false">http://www.lispcast.com/hiccup-tips</guid>
                  <link>http://www.lispcast.com/hiccup-tips</link>
                  <pubDate>Tue 24 Feb 2015 11:53:48 AM CST</pubDate>
                  <description>
                    Hiccup is a Clojure DSL for generating HTML. If you're using it, you might like these tips.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/hiccup-tips"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Announcing: LispCast Intro to clojure.test</title>
                  <guid isPermalink="false">http://www.lispcast.com/announcing-lispcast-intro-to-clojure-test</guid>
                  <link>http://www.lispcast.com/announcing-lispcast-intro-to-clojure-test</link>
                  <pubDate>Mon 23 Feb 2015 09:37:54 PM CST</pubDate>
                  <description>
                    The next course will be about clojure.test. Sign up to be notified when it is published.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/announcing-lispcast-intro-to-clojure-test"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>New Course Format</title>
                  <guid isPermalink="false">http://www.lispcast.com/new-course-format</guid>
                  <link>http://www.lispcast.com/new-course-format</link>
                  <pubDate>Fri 20 Feb 2015 03:01:08 PM CST</pubDate>
                  <description>
                    LispCast video courses have a new, interactive format. It's easier for me to make courses (read: more, faster) and it's a better experience for learners.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/new-course-format"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Parts of Ring</title>
                  <guid isPermalink="false">http://www.lispcast.com/parts-of-ring</guid>
                  <link>http://www.lispcast.com/parts-of-ring</link>
                  <pubDate>Wed 18 Feb 2015 11:12:29 PM CST</pubDate>
                  <description>
                    Ring, the Clojure Web library, defines three main concepts that you use to construct web applications.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/parts-of-ring"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Object-Oriented Programming is the Dual of Functional Programming</title>
                  <guid isPermalink="false">http://www.lispcast.com/object-oriented-vs-functional-duals</guid>
                  <link>http://www.lispcast.com/object-oriented-vs-functional-duals</link>
                  <pubDate>Sun 08 Feb 2015 11:22:31 AM CST</pubDate>
                  <description>
                    Object-Oriented Programming is often shown in contrast to Functional Programming. But they are so exactly opposite that they are duals, and so equivalent in important ways. Which one to use should be left up to the programmer, as is done in Clojure and Javascript.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/object-oriented-vs-functional-duals"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure Gazette Looking Forward</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-gazette-looking-forward-2015</guid>
                  <link>http://www.lispcast.com/clojure-gazette-looking-forward-2015</link>
                  <pubDate>Mon 19 Jan 2015 02:18:48 PM CST</pubDate>
                  <description>
                    I am looking for more sponsors for the Clojure Gazette and I need your help.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-gazette-looking-forward-2015"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to Write Software</title>
                  <guid isPermalink="false">http://www.lispcast.com/how-to-write-software</guid>
                  <link>http://www.lispcast.com/how-to-write-software</link>
                  <pubDate>Thu 08 Jan 2015 11:22:27 AM CST</pubDate>
                  <description>
                    Writing software alone and in a long term sustainable manner requires a lot of discipline. Upfront planning and avoidance of feature creep can turn a stressful project into a pleasure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/how-to-write-software"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Data &gt; Functions &gt; Macros. But why?</title>
                  <guid isPermalink="false">http://www.lispcast.com/data-functions-macros-why</guid>
                  <link>http://www.lispcast.com/data-functions-macros-why</link>
                  <pubDate>Tue 23 Dec 2014 11:29:44 PM CST</pubDate>
                  <description>
                    &quot;Prefer data over functions&quot; is a common adage in Clojure circles. It is poorly debated because it is a terse statement in generalities. A valuable perspective is that data is transparent at runtime, while functions are not. This perspective gives a firm ground for discussion and design.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/data-functions-macros-why"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Ultimate Guide to Learning Clojure for Free</title>
                  <guid isPermalink="false">http://www.lispcast.com/ultimate-guide-to-learning-clojure-for-free</guid>
                  <link>http://www.lispcast.com/ultimate-guide-to-learning-clojure-for-free</link>
                  <pubDate>Thu 11 Dec 2014 09:34:58 AM CST</pubDate>
                  <description>
                    There are many great resources out there for learning Clojure. Some of the resources are paid, but fortunately many of the best resources are absolutely free.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ultimate-guide-to-learning-clojure-for-free"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj: Scheme Workshop</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-scheme-workshop</guid>
                  <link>http://www.lispcast.com/pre-conj-scheme-workshop</link>
                  <pubDate>Mon 17 Nov 2014 11:12:36 PM CST</pubDate>
                  <description>
                    Jason Hemann talks about the Scheme Workshop.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-scheme-workshop"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Elm FRP in Clojure core.async</title>
                  <guid isPermalink="false">http://www.lispcast.com/elm-frp-clojure-core-async</guid>
                  <link>http://www.lispcast.com/elm-frp-clojure-core-async</link>
                  <pubDate>Fri 14 Nov 2014 04:15:34 PM CST</pubDate>
                  <description>
                    Elm is an exciting FRP language. I implemented the FRP part in Clojure using core.async.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/elm-frp-clojure-core-async"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Conveyor Belts: Nature's core.async Channels</title>
                  <guid isPermalink="false">http://www.lispcast.com/core-async-conveyor-belts-true-history</guid>
                  <link>http://www.lispcast.com/core-async-conveyor-belts-true-history</link>
                  <pubDate>Thu 13 Nov 2014 01:25:18 PM CST</pubDate>
                  <description>
                    Conveyor belts are strikingly similar to Clojure core.async channels. While it could be a coincidence, there is speculation that conveyor belts were influenced by a deep understanding of core.async.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/core-async-conveyor-belts-true-history"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Token Buckets with core.async</title>
                  <guid isPermalink="false">http://www.lispcast.com/token-buckets-in-core-async</guid>
                  <link>http://www.lispcast.com/token-buckets-in-core-async</link>
                  <pubDate>Mon 10 Nov 2014 08:58:57 PM CST</pubDate>
                  <description>
                    Token Bucket is a simple algorithm for rate limiting a resource. It's easy to understand because you can reason about it in terms of real-world objects. core.async makes this algorithm very clear and easy.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/token-buckets-in-core-async"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Steven Yi</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-steven-yi</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-steven-yi</link>
                  <pubDate>Mon 27 Oct 2014 09:44:13 AM CDT</pubDate>
                  <description>
                    Steven Yi interview about his music composition and synthesis systems.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-steven-yi"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Bozhidar Batsov</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-bozhidar-batsov</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-bozhidar-batsov</link>
                  <pubDate>Sun 26 Oct 2014 09:38:02 AM CDT</pubDate>
                  <description>
                    Bozhidar Batsov interview about CIDER.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-bozhidar-batsov"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Paul deGrandis</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-paul-degrandis</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-paul-degrandis</link>
                  <pubDate>Sat 25 Oct 2014 09:59:39 AM CDT</pubDate>
                  <description>
                    Paul deGrandis interview about data-driven systems.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-paul-degrandis"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Anna Pawlicka</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-anna-pawlicka</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-anna-pawlicka</link>
                  <pubDate>Fri 24 Oct 2014 10:35:29 PM CDT</pubDate>
                  <description>
                    Anna Pawlicka interview about Om.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-anna-pawlicka"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Julian Gamble</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-julian-gamble</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-julian-gamble</link>
                  <pubDate>Fri 24 Oct 2014 10:34:36 PM CDT</pubDate>
                  <description>
                    Julian Gamble interview about core.async and ClojureScript.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-julian-gamble"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Zach Tellman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-zach-tellman</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-zach-tellman</link>
                  <pubDate>Thu 23 Oct 2014 11:29:13 AM CDT</pubDate>
                  <description>
                    Zach Tellman interview about his talk about composition.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-zach-tellman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Zach Oakes</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-zach-oakes</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-zach-oakes</link>
                  <pubDate>Wed 22 Oct 2014 09:11:47 AM CDT</pubDate>
                  <description>
                    Zach Oakes interview about games in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-zach-oakes"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Colin Fleming</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-colin-fleming</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-colin-fleming</link>
                  <pubDate>Tue 21 Oct 2014 10:04:32 AM CDT</pubDate>
                  <description>
                    Colin Fleming interview about Cursive Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-colin-fleming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Ashton Kemerling</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-ashton-kemerling</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-ashton-kemerling</link>
                  <pubDate>Mon 20 Oct 2014 09:36:09 AM CDT</pubDate>
                  <description>
                    Ashton Kemerling interview about generative testing.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-ashton-kemerling"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Steve Miner</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-steve-miner</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-steve-miner</link>
                  <pubDate>Sun 19 Oct 2014 09:15:48 AM CDT</pubDate>
                  <description>
                    Steve Miner talk about generating test.check generators.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-steve-miner"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Jeanine Adkisson</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-jeanine-adkisson</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-jeanine-adkisson</link>
                  <pubDate>Sat 18 Oct 2014 01:43:27 PM CDT</pubDate>
                  <description>
                    Jeanine Adkisson interview about variants.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-jeanine-adkisson"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: Lucas Cavalcanti</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-lucas-cavalcanti</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-lucas-cavalcanti</link>
                  <pubDate>Fri 17 Oct 2014 10:59:24 AM CDT</pubDate>
                  <description>
                    Lucas Cavalcanti interview about Datomic superpowers.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-lucas-cavalcanti"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-Conj Interview: David Pick</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-interview-david-pick</guid>
                  <link>http://www.lispcast.com/pre-conj-interview-david-pick</link>
                  <pubDate>Wed 15 Oct 2014 09:04:25 AM CDT</pubDate>
                  <description>
                    David Pick interview about Kafka and Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-interview-david-pick"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Zach Tellman</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-zach-tellman</guid>
                  <link>http://www.lispcast.com/pre-conj-zach-tellman</link>
                  <pubDate>Mon 13 Oct 2014 12:50:39 PM CDT</pubDate>
                  <description>
                    Zach Tellman will talk about building composable software.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-zach-tellman"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Zach Oakes</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-zach-oakes</guid>
                  <link>http://www.lispcast.com/pre-conj-zach-oakes</link>
                  <pubDate>Sun 12 Oct 2014 08:29:03 PM CDT</pubDate>
                  <description>
                    Zach Oakes will talk about making games at runtime.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-zach-oakes"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Paul deGrandis</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-paul-degrandis</guid>
                  <link>http://www.lispcast.com/pre-conj-paul-degrandis</link>
                  <pubDate>Sun 12 Oct 2014 08:28:45 PM CDT</pubDate>
                  <description>
                    Paul deGrandis will talk about Data-Driven Systems.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-paul-degrandis"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Steven Yi</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-steven-yi</guid>
                  <link>http://www.lispcast.com/pre-conj-steven-yi</link>
                  <pubDate>Fri 10 Oct 2014 02:40:26 PM CDT</pubDate>
                  <description>
                    Steven Yi will talk about music systems on the JVM.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-steven-yi"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Willy Wonka and the core.async Guidelines</title>
                  <guid isPermalink="false">http://www.lispcast.com/willy-wonka-core-async</guid>
                  <link>http://www.lispcast.com/willy-wonka-core-async</link>
                  <pubDate>Fri 10 Oct 2014 12:08:19 PM CDT</pubDate>
                  <description>
                    There are a few conventions in core.async that are not hard to use once you've learned them. But learning them without help can be tedious. This article presents three guidelines that will get you through the learning curve.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/willy-wonka-core-async"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Steve Miner</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-steve-miner</guid>
                  <link>http://www.lispcast.com/pre-conj-steve-miner</link>
                  <pubDate>Thu 09 Oct 2014 08:54:32 AM CDT</pubDate>
                  <description>
                    Steve Miner will talk about generating test.check generators.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-steve-miner"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Nathan Herzing and Chris Shea</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-nathan-herzing-chris-shea</guid>
                  <link>http://www.lispcast.com/pre-conj-nathan-herzing-chris-shea</link>
                  <pubDate>Tue 07 Oct 2014 10:40:13 AM CDT</pubDate>
                  <description>
                    Nathan Herzing and Chris Shea will talk about Pedestal, Om, Datomic, and core.async.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-nathan-herzing-chris-shea"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Content of Your Code</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-content-of-your-code</guid>
                  <link>http://www.lispcast.com/the-content-of-your-code</link>
                  <pubDate>Mon 06 Oct 2014 02:25:46 PM CDT</pubDate>
                  <description>
                    Code style is important, but way less important than content. Yet everyone talks about style because it's easier. Let's talk about content.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-content-of-your-code"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Michał Marczyk</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-michal-marczyk</guid>
                  <link>http://www.lispcast.com/pre-conj-michal-marczyk</link>
                  <pubDate>Mon 06 Oct 2014 10:50:02 AM CDT</pubDate>
                  <description>
                    Michał Marczyk will talk about Persistent Data Structures.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-michal-marczyk"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Julian Gamble</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-julian-gamble</guid>
                  <link>http://www.lispcast.com/pre-conj-julian-gamble</link>
                  <pubDate>Sat 04 Oct 2014 06:26:54 PM CDT</pubDate>
                  <description>
                    Julian Gamble will give a talk about core.async in ClojureScript.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-julian-gamble"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Rich Hickey</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-rich-hickey</guid>
                  <link>http://www.lispcast.com/pre-conj-rich-hickey</link>
                  <pubDate>Fri 03 Oct 2014 09:02:39 PM CDT</pubDate>
                  <description>
                    Rich Hickey will talk about Transducers.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-rich-hickey"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Jeanine Adkisson</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-jeanine-adkisson</guid>
                  <link>http://www.lispcast.com/pre-conj-jeanine-adkisson</link>
                  <pubDate>Fri 03 Oct 2014 09:13:42 AM CDT</pubDate>
                  <description>
                    Jeanine Adkisson will give a talk about Variants in Clojure at the Clojure/conj 2014.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-jeanine-adkisson"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Glenn Vanderburg</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-glenn-vanderburg</guid>
                  <link>http://www.lispcast.com/pre-conj-glenn-vanderburg</link>
                  <pubDate>Thu 02 Oct 2014 09:04:18 AM CDT</pubDate>
                  <description>
                    Glenn Vanderburg will talk about implementing the TeX algorithms in Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-glenn-vanderburg"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Lucas Cavalcanti and Edward Wible</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-lucas-cavalcanti-edward-wible</guid>
                  <link>http://www.lispcast.com/pre-conj-lucas-cavalcanti-edward-wible</link>
                  <pubDate>Wed 01 Oct 2014 02:25:56 PM CDT</pubDate>
                  <description>
                    Lucas Cavalcanti and Edward Wible will talk about Datomic.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-lucas-cavalcanti-edward-wible"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Ghadi Shayban</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-ghadi-shayban</guid>
                  <link>http://www.lispcast.com/pre-conj-ghadi-shayban</link>
                  <pubDate>Wed 01 Oct 2014 09:31:49 AM CDT</pubDate>
                  <description>
                    Ghadi Shayban will talk about the JVM.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-ghadi-shayban"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: David Pick</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-david-pick</guid>
                  <link>http://www.lispcast.com/pre-conj-david-pick</link>
                  <pubDate>Tue 30 Sep 2014 11:18:21 PM CDT</pubDate>
                  <description>
                    David Pick will talk about using Kafka from Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-david-pick"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Colin Fleming</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-colin-fleming</guid>
                  <link>http://www.lispcast.com/pre-conj-colin-fleming</link>
                  <pubDate>Mon 29 Sep 2014 10:49:29 AM CDT</pubDate>
                  <description>
                    Colin Fleming will talk about Cursive Clojure.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-colin-fleming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Brian Goetz</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-brian-goetz</guid>
                  <link>http://www.lispcast.com/pre-conj-brian-goetz</link>
                  <pubDate>Sun 28 Sep 2014 10:45:08 AM CDT</pubDate>
                  <description>
                    Brian Goetz will give the keynote at Clojure/conj.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-brian-goetz"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Bozhidar Batsov</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-bozhidar-batsov</guid>
                  <link>http://www.lispcast.com/pre-conj-bozhidar-batsov</link>
                  <pubDate>Sat 27 Sep 2014 09:29:50 AM CDT</pubDate>
                  <description>
                    Bozhidar Batsov will talk about CIDER, the Clojure IDE for Emacs.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-bozhidar-batsov"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Ashton Kemerling</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-ashton-kemerling</guid>
                  <link>http://www.lispcast.com/pre-conj-ashton-kemerling</link>
                  <pubDate>Fri 26 Sep 2014 07:20:33 AM CDT</pubDate>
                  <description>
                    Ashton Kemerling will talk about Generative Integration Tests.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-ashton-kemerling"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep: Anna Pawlicka</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-anna-pawlicka</guid>
                  <link>http://www.lispcast.com/pre-conj-anna-pawlicka</link>
                  <pubDate>Thu 25 Sep 2014 09:00:28 AM CDT</pubDate>
                  <description>
                    Anna Pawlicka will give a talk about Om.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-anna-pawlicka"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Pre-conj Prep 2014</title>
                  <guid isPermalink="false">http://www.lispcast.com/pre-conj-2014</guid>
                  <link>http://www.lispcast.com/pre-conj-2014</link>
                  <pubDate>Sat 20 Sep 2014 11:12:51 PM CDT</pubDate>
                  <description>
                    Prepare for the Clojure/conj with media from around the web.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/pre-conj-2014"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>4 Features Javascript can steal from Clojure(Script)</title>
                  <guid isPermalink="false">http://www.lispcast.com/four-features-javascript-can-steal-from-clojure</guid>
                  <link>http://www.lispcast.com/four-features-javascript-can-steal-from-clojure</link>
                  <pubDate>Wed 17 Sep 2014 11:52:22 AM CDT</pubDate>
                  <description>
                    ClojureScript adds a lot of value on top of the Javascript platform. But some of that value can be had directly in Javascript without using a new language.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/four-features-javascript-can-steal-from-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Convince your boss to use Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/convince-your-boss-to-use-clojure</guid>
                  <link>http://www.lispcast.com/convince-your-boss-to-use-clojure</link>
                  <pubDate>Tue 16 Sep 2014 04:29:06 PM CDT</pubDate>
                  <description>
                    Clojure has been successfully adopted by many companies. There are many resources available by people who did the hard work of introducing Clojure to their team.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/convince-your-boss-to-use-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Just Hack Something Together</title>
                  <guid isPermalink="false">http://www.lispcast.com/just-hack-something-together</guid>
                  <link>http://www.lispcast.com/just-hack-something-together</link>
                  <pubDate>Thu 04 Sep 2014 10:54:53 PM CDT</pubDate>
                  <description>
                    Lisp is viewed as difficult and academic but it is a great language for hacking a solution together.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/just-hack-something-together"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Atom code explanation</title>
                  <guid isPermalink="false">http://www.lispcast.com/atom-problem</guid>
                  <link>http://www.lispcast.com/atom-problem</link>
                  <pubDate>Thu 28 Aug 2014 05:43:39 PM CDT</pubDate>
                  <description>
                    I go over a real-world example of how atoms and immutable values allow you to compose constructs in ways that are easy to reason about and less prone to error.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/atom-problem"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Two Kinds of Bootstrapping</title>
                  <guid isPermalink="false">http://www.lispcast.com/two-kinds-of-bootstrapping</guid>
                  <link>http://www.lispcast.com/two-kinds-of-bootstrapping</link>
                  <pubDate>Sat 23 Aug 2014 10:43:37 AM CDT</pubDate>
                  <description>
                    I like languages with a small core that is extensible. The languages tend to be weird and require less code to bootstrap.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/two-kinds-of-bootstrapping"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure is Imperative</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-is-imperative</guid>
                  <link>http://www.lispcast.com/clojure-is-imperative</link>
                  <pubDate>Fri 22 Aug 2014 11:51:19 PM CDT</pubDate>
                  <description>
                    Clojure is an imperative language. Its operations are defined in terms of concrete actions. But those actions are often the same actions available to the programmer at runtime. This makes it easy to bootstrap.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-is-imperative"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Complex Syntax</title>
                  <guid isPermalink="false">http://www.lispcast.com/complex-syntax</guid>
                  <link>http://www.lispcast.com/complex-syntax</link>
                  <pubDate>Tue 19 Aug 2014 09:48:13 AM CDT</pubDate>
                  <description>
                    Lisps are revered for their simple syntax, but parens are complex. They complect function calls and macro calls, which have drastically different semantics.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/complex-syntax"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Is core.async Against the Clojure Philosophy?</title>
                  <guid isPermalink="false">http://www.lispcast.com/is-core-async-against-clojure-philosophy</guid>
                  <link>http://www.lispcast.com/is-core-async-against-clojure-philosophy</link>
                  <pubDate>Wed 06 Aug 2014 07:32:36 AM CDT</pubDate>
                  <description>
                    Clojure core.async is a way to manage mutable state. Isn't that against functional programming?

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/is-core-async-against-clojure-philosophy"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Reification</title>
                  <guid isPermalink="false">http://www.lispcast.com/reification</guid>
                  <link>http://www.lispcast.com/reification</link>
                  <pubDate>Tue 05 Aug 2014 10:39:50 PM CDT</pubDate>
                  <description>
                    Reification means making an abstraction into a concrete value that can be manipulated at runtime. Reification is the core of what makes a language dynamic. Three types of reification in Clojure are discussed.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/reification"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>core.async in Browsers</title>
                  <guid isPermalink="false">http://www.lispcast.com/core-async-browser-motivation</guid>
                  <link>http://www.lispcast.com/core-async-browser-motivation</link>
                  <pubDate>Tue 29 Jul 2014 04:36:36 PM CDT</pubDate>
                  <description>
                    Javascript's concurrency model forces code to give up control of when a callback will be called. `core.async` gives you back that control and hence lets you code in a more natural style.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/core-async-browser-motivation"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Stop Refactoring and Start Factoring</title>
                  <guid isPermalink="false">http://www.lispcast.com/stop-refactoring-and-start-factoring</guid>
                  <link>http://www.lispcast.com/stop-refactoring-and-start-factoring</link>
                  <pubDate>Thu 24 Jul 2014 04:12:16 PM CDT</pubDate>
                  <description>
                    Refactoring is focused on the quality of code, while factoring aims to uncover the underlying beauty of the problem domain, as expressed in code. Instead of cleaning up your code, try factoring.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/stop-refactoring-and-start-factoring"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Ring 1.3</title>
                  <guid isPermalink="false">http://www.lispcast.com/ring-1-3</guid>
                  <link>http://www.lispcast.com/ring-1-3</link>
                  <pubDate>Tue 22 Jul 2014 11:53:00 PM CDT</pubDate>
                  <description>
                    Ring is great because it closely models the HTTP message format using native Clojure data structures. It strictly defines a message format that any software can use and rely on. With Ring 1.3, the specification has gotten even closer to the HTTP spec.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ring-1-3"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Church vs Curry Types</title>
                  <guid isPermalink="false">http://www.lispcast.com/church-vs-curry-types</guid>
                  <link>http://www.lispcast.com/church-vs-curry-types</link>
                  <pubDate>Tue 15 Jul 2014 10:26:15 PM CDT</pubDate>
                  <description>
                    Static vs dynamic typing debates often flounder because the debators see from two different perspectives without knowing it. Learning to identify the two perspectives can calm the discussion. The tension between the two perspectives has led to Gradual Typing and other technologies.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/church-vs-curry-types"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>JSON Serialization for APIs in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/json-serialization-api-clojure</guid>
                  <link>http://www.lispcast.com/json-serialization-api-clojure</link>
                  <pubDate>Thu 10 Jul 2014 10:42:08 PM CDT</pubDate>
                  <description>
                    Clojure is well-suited for processing JSON, but there are some decisions you have to make to suit your application. The major decisions are actually easy, though they took me a while to figure out.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/json-serialization-api-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What is Functional Programming?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-is-functional-programming</guid>
                  <link>http://www.lispcast.com/what-is-functional-programming</link>
                  <pubDate>Tue 01 Jul 2014 10:47:20 AM CDT</pubDate>
                  <description>
                    I prefer to define Functional Programming as making a distinction between pure and impure code. With this definition, you can program functionally in any language. What differentiates the functional languages is how much help they give you to make the distinction.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-is-functional-programming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>core.async Code Style</title>
                  <guid isPermalink="false">http://www.lispcast.com/core-async-code-style</guid>
                  <link>http://www.lispcast.com/core-async-code-style</link>
                  <pubDate>Tue 10 Jun 2014 11:03:57 PM CDT</pubDate>
                  <description>
                    If your functions return `core.async` channels instead of taking callbacks, you encourage them to be used within `go` blocks. Unchecked, this encouragement could proliferate your use of `go` blocks unnecessarily. There are some coding conventions that can minimize this problem.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/core-async-code-style"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Regexes in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-regex</guid>
                  <link>http://www.lispcast.com/clojure-regex</link>
                  <pubDate>Thu 03 Jun 2014 08:45:37 PM CDT</pubDate>
                  <description>
                    With a few functions from the standard library, Clojure lets you do most of what you want with regular expressions with no muss.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-regex"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Warty Lists in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/lists-in-clojure</guid>
                  <link>http://www.lispcast.com/lists-in-clojure</link>
                  <pubDate>Tue 27 May 2014 08:31:51 PM CDT</pubDate>
                  <description>
                    Lists are kind of warty in Clojure. Care should be taken, especially by those coming from other Lisps.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/lists-in-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>CSS and the Lambda Calculus</title>
                  <guid isPermalink="false">http://www.lispcast.com/css-and-the-lambda-calculus</guid>
                  <link>http://www.lispcast.com/css-and-the-lambda-calculus</link>
                  <pubDate>Fri 09 May 2014 10:58:51 AM CDT</pubDate>
                  <description>
                    Using LESS, we can almost achieve the expressive power of the Lambda Calculus as applied to styling. The expressive power is enough to create reusable styles applied to reusable HTML components.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/css-and-the-lambda-calculus"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Separation of Presentation and Content</title>
                  <guid isPermalink="false">http://www.lispcast.com/separation-of-presentation-and-content</guid>
                  <link>http://www.lispcast.com/separation-of-presentation-and-content</link>
                  <pubDate>Thu 17 Apr 2014 01:56:15 PM CDT</pubDate>
                  <description>
                    One reason to separate style from content is to reuse HTML or CSS. Ultimately, we would like a solution where we can reuse both.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/separation-of-presentation-and-content"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure Web Security</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-web-security</guid>
                  <link>http://www.lispcast.com/clojure-web-security</link>
                  <pubDate>Sat 05 Apr 2014 04:35:56 PM CDT</pubDate>
                  <description>
                    Use the OWASP Top Ten Project to minimize security vulnerabilities in your Clojure web application.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-web-security"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>A Ring Spec to Hang on the Wall</title>
                  <guid isPermalink="false">http://www.lispcast.com/ring-spec-hang-on-wall</guid>
                  <link>http://www.lispcast.com/ring-spec-hang-on-wall</link>
                  <pubDate>Fri 28 Mar 2014 09:16:16 PM CDT</pubDate>
                  <description>
                    The Ring SPEC is the core of the Clojure web ecosystem. The standard is small and a reference is handy.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ring-spec-hang-on-wall"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What Web Framework Should I Use in Clojure?</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-web-framework-should-i-use</guid>
                  <link>http://www.lispcast.com/what-web-framework-should-i-use</link>
                  <pubDate>Sun 23 Mar 2014 05:03:04 PM PDT</pubDate>
                  <description>
                    There are a number of web frameworks in Clojure, but beginners should roll their own server stack themselves to tap into the Ring ecosystem.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-web-framework-should-i-use"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>When To Use a Macro in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/when-to-use-a-macro</guid>
                  <link>http://www.lispcast.com/when-to-use-a-macro</link>
                  <pubDate>Fri 07 Mar 2014 03:45:07 PM CST</pubDate>
                  <description>
                    Macros should be avoided to the extent possible. There are three circumstances where they are required.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/when-to-use-a-macro"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>LESS has Better Forms of Abstraction than CSS</title>
                  <guid isPermalink="false">http://www.lispcast.com/less-abstraction-combination</guid>
                  <link>http://www.lispcast.com/less-abstraction-combination</link>
                  <pubDate>Wed 12 Feb 2014 10:16:42 PM CST</pubDate>
                  <description>
                    LESS has obviously better forms of abstraction and combination than CSS. It has recursive style definitions, which is enough to consider it a &quot;powerful language&quot;.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/less-abstraction-combination"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>CSS has Weak Forms of Abstraction and Combination</title>
                  <guid isPermalink="false">http://www.lispcast.com/css-abstraction-combination</guid>
                  <link>http://www.lispcast.com/css-abstraction-combination</link>
                  <pubDate>Sat 08 Feb 2014 01:44:44 PM CST</pubDate>
                  <description>
                    According to the requirements proposed by Abelson and Sussman, CSS does not provide adequate means of combination and abstraction to be considered a powerful language.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/css-abstraction-combination"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Hindley-Milner in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/Hindley-Milner-in-Clojure</guid>
                  <link>http://www.lispcast.com/Hindley-Milner-in-Clojure</link>
                  <pubDate>Mon 13 Jan 2014 08:48:37 AM CST</pubDate>
                  <description>
                    I wrote a lambda-calculus interpreter and an implementation of Hindley-Milner to type check it.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/Hindley-Milner-in-Clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>React: Another Level of Indirection</title>
                  <guid isPermalink="false">http://www.lispcast.com/react-another-level-of-indirection</guid>
                  <link>http://www.lispcast.com/react-another-level-of-indirection</link>
                  <pubDate>Tue 31 Dec 2013 01:01:25 PM CST</pubDate>
                  <description>
                    React provides a better abstraction over the DOM than MVC frameworks ever can. React is the last piece of the puzzle for ClojureScript web frontend development.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/react-another-level-of-indirection"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Deconstructing Functional Programming</title>
                  <guid isPermalink="false">http://www.lispcast.com/deconstructing-functional-programming</guid>
                  <link>http://www.infoq.com/presentations/functional-pros-cons</link>
                  <pubDate>Sun 22 Dec 2013 04:33:32 PM CST</pubDate>
                  <description>
                    
&lt;blockquote&gt;
&lt;p&gt;Because if you think about it, the stack itself is just an optimization. Right? There are these frames which contain information about each invocation. Each stack frame. Each activation record. And that's what they are--they're activation records. They're sort of objects. If you really have objects on the brain, like I do, then you realize that they're all just objects.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And they should be treated uniformly. You can even build a language that works this way--as I have. If that's the case, this is really a garbage collection problem. Right? Your stack traces might go away if you don't need them. You do need them when it's not a tail call because you need to go back there and use that information. But if it's a tail call, you don't need them, you don't need a tail call back to that frame. You need a pointer back to the last frame that wasn't a tail call. And they might get collected.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Which doesn't mean you actually have to implement it that way. Erlang sort of does. And there are many implementations that do that. They are not noted for their speed. If you can have real stacks, what happens when you run out of space? If you don't run out of space, it didn't really matter if you optimized the tail calls or not.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;When you run out of space, you should GC the damned stack. You shouldn't just throw up your hands and say you're dead. And for all the normal programs that people write where it didn't matter, they won't care. And for your tail recursive programs, well, they might be a bit slower, but they will work. And then it's a matter of flags to the garbage collector if in production you don't want to debug it if you're sure it's all going to be fine--then go ahead and tell it to don't bother and just slam it and overwrite those frames directly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Why is this so hard for implementers to do? Optimization is an optimization and should be optional.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It's a cool algorithm, but there's nothing nice that I'm prepared to say about Hindley-Milner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He nails a lot of things I didn't like about Haskell.&lt;/p&gt;
&lt;p&gt;All in all, this talk gets a lot of things right.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/composable-parts&quot;&gt;Composable parts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/fp-in-my-language&quot;&gt;Can I do FP in my language?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/global-mutable-state&quot;&gt;Global Mutable State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/hirable-in-clojure&quot;&gt;What do I have to learn to be hirable in Clojure?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/deconstructing-functional-programming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to Use New Relic with Clojure on Heroku</title>
                  <guid isPermalink="false">http://www.lispcast.com/how-to-use-new-relic-with-clojure-on-heroku</guid>
                  <link>http://www.lispcast.com/how-to-use-new-relic-with-clojure-on-heroku</link>
                  <pubDate>Tue 03 Dec 2013 10:02:23 AM CST</pubDate>
                  <description>
                    New Relic lets you get more out of Heroku. Install it in 7 steps.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/how-to-use-new-relic-with-clojure-on-heroku"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>What to look for in validations</title>
                  <guid isPermalink="false">http://www.lispcast.com/what-to-look-for-in-validations</guid>
                  <link>http://logaan.github.io/clojure/validations/vlad/2013/11/25/what-to-look-for-in-validations.html</link>
                  <pubDate>Mon 25 Nov 2013 10:29:19 AM CST</pubDate>
                  <description>
                    
&lt;p&gt;Nice validation library plus very good motivational blog post.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/100-most-used-clojure-expressions&quot;&gt;The 100 Most Used Clojure Expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/3-things-java-can-steal-from-clojure&quot;&gt;3 Things Java Programmers Can Steal from Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/annotated-clojure-core-reduce&quot;&gt;Some Annotated clojure.core/reduce Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/annotated-map&quot;&gt;Annotated map&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/what-to-look-for-in-validations"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Healthcare.gov and the Gulf Between Planning and Reality</title>
                  <guid isPermalink="false">http://www.lispcast.com/healthcare-gov-gulf-between-planning-and-reality</guid>
                  <link>http://www.shirky.com/weblog/2013/11/healthcare-gov-and-the-gulf-between-planning-and-reality/</link>
                  <pubDate>Sun 24 Nov 2013 12:31:04 AM CST</pubDate>
                  <description>
                    
&lt;p&gt;Clay Shirky nails it with nice, narrative style.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/arguments-against-frameworks&quot;&gt;The arguments against web frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/bootstrapping-mindset&quot;&gt;The Bootstrapping Mindset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/cascading-separation-abstraction&quot;&gt;Separation, Abstraction, and Cascading in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/clojure-web-framework&quot;&gt;What should a Clojure framework look like?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/healthcare-gov-gulf-between-planning-and-reality"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>On Type Unity</title>
                  <guid isPermalink="false">http://www.lispcast.com/on-type-unity</guid>
                  <link>http://www.lispcast.com/on-type-unity</link>
                  <pubDate>Sat 02 Nov 2013 04:52:12 PM CDT</pubDate>
                  <description>
                    Languages with strong, dynamic types (like Scheme) are actually single-typed languages, not untyped languages. Some would say this is restrictive, but this unity of type is a source of their strength.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/on-type-unity"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Maciej Cegłowski, Pinboard - XOXO Festival (2013)</title>
                  <guid isPermalink="false">http://www.lispcast.com/maciej-ceglowski-pinboard-xoxo-2013</guid>
                  <link>http://www.youtube.com/watch?v=eky5uKILXtM</link>
                  <pubDate>Fri 18 Oct 2013 05:52:16 PM CDT</pubDate>
                  <description>
                    
&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/eky5uKILXtM&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;blockquote&gt;
&lt;p&gt;Henry David Thoreau was a content creator active in the 1850s.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Classic.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/deconstructing-functional-programming&quot;&gt;Deconstructing Functional Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/maciej-ceglowski-pinboard-xoxo-2013"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Scala: sharp and gets things cut</title>
                  <guid isPermalink="false">http://www.lispcast.com/sharp-and-gets-things-cut</guid>
                  <link>http://blog.fogus.me/2013/10/07/scala-sharp-and-gets-things-cut/</link>
                  <pubDate>Tue 08 Oct 2013 11:47:58 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Michael Fogus is right (as usual) about this one. Someone with Odersky's stature should not fear lack of humility but instead lack of confidence.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/church-vs-curry-types&quot;&gt;Church vs Curry Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/Hindley-Milner-in-Clojure&quot;&gt;Hindley-Milner in Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/on-type-unity&quot;&gt;On Type Unity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/pre-west-nathan-sorenson&quot;&gt;Pre-West Prep: Nathan Sorenson&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/sharp-and-gets-things-cut"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Ambrose Bonnaire-Sergeant interviewed about Typed Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/ambrose-interview-typed-clojure</guid>
                  <link>http://us4.campaign-archive2.com/?u=a33b5228d1b5bf2e0c68a83f4&amp;id=c43c157edd</link>
                  <pubDate>Tue 08 Oct 2013 03:34:23 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Way back in May 2012, Ambrose was beginning work on Typed Clojure for Google Summer of Code. I interviewed him to get an idea of what kind of type system we could expect. Since he's now running a very successful &lt;a href=&quot;http://www.indiegogo.com/projects/typed-clojure&quot;&gt;crowd funding campaign&lt;/a&gt;, I thought I'd bring up this blast from the past.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/100-most-used-clojure-expressions&quot;&gt;The 100 Most Used Clojure Expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/3-things-java-can-steal-from-clojure&quot;&gt;3 Things Java Programmers Can Steal from Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/annotated-clojure-core-reduce&quot;&gt;Some Annotated clojure.core/reduce Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/annotated-map&quot;&gt;Annotated map&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ambrose-interview-typed-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Lisp with Macros is Two Languages</title>
                  <guid isPermalink="false">http://www.lispcast.com/lisp-with-macros-language-stack</guid>
                  <link>http://www.lispcast.com/lisp-with-macros-language-stack</link>
                  <pubDate>Tue 08 Oct 2013 10:47:27 AM CDT</pubDate>
                  <description>
                    Lisp with macros can be seen as two languages, each with different semantics. The base language can be interpreted directly, whereas the result of interpreting the macro language is to produce a new program in the base language.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/lisp-with-macros-language-stack"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Making True/False Questions Easy</title>
                  <guid isPermalink="false">http://www.lispcast.com/making-true-false-easy</guid>
                  <link>http://www.lispcast.com/making-true-false-easy</link>
                  <pubDate>Sat 21 Sep 2013 09:09:14 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;When I was training as a teacher, I gave a simple quiz with True/False (T/F) questions. The results were terrible. Worse than chance. On one question, &lt;strong&gt;about 20% of the class got it right&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I had asked a simple question involving a logical AND:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;True or False?&lt;br /&gt;A parallelogram has parallel opposite sides AND it has five sides.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eighty percent of the class chose 'True', even though all parallelograms have four sides. The other teachers told me the question was difficult because it was a T/F question. &lt;strong&gt;They said they never give T/F questions because they only confuse the kids.&lt;/strong&gt; They said I should just forget about T/F and try a different type of question. But it was my class and my time to explore teaching and I knew that this question was not that hard. Several connections became clear in my mind: &lt;a href=&quot;http://lispcast.com/why-technical-explanation-alone-is-not-enough&quot;&gt;using the right part of their brains&lt;/a&gt;, &lt;a href=&quot;http://lispcast.com/tap-into-your-social-brain&quot;&gt;making the problem about people&lt;/a&gt;, and &lt;a href=&quot;http://lispcast.com/use-your-imagination&quot;&gt;using their imaginations effectively&lt;/a&gt;. I wanted to give it a shot.&lt;/p&gt;
&lt;p&gt;I planned the next class around answering True/False questions. There would be an &lt;strong&gt;experiment&lt;/strong&gt; to confirm my suspicion (that the kids were using the wrong part of their brains), a lesson using an &lt;strong&gt;imaginative process&lt;/strong&gt;, and then a &lt;strong&gt;similar quiz&lt;/strong&gt; to see how it worked.&lt;/p&gt;
&lt;p&gt;The next morning in class, I wrote the T/F question on the blackboard and called a student up to answer it. He read it and said 'True' (the wrong answer). I asked him &amp;quot;what about this part?&amp;quot;, pointing to the false part. He was clearly confused. The part about five sides was obviously false to him. He then began &lt;em&gt;looking around&lt;/em&gt;&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; through the question and stopped at the first part (the true part). He pointed at it and said 'True', as if it negated the fact that the other part was false. It's hard to describe, but I was convinced that he was simply looking for something that was true to make the whole question true. &lt;strong&gt;And he thought that it was the right answer.&lt;/strong&gt; My hypothesis was confirmed: he was using a visual strategy when it was not called for.&lt;/p&gt;
&lt;p&gt;I then demonstrated an imagination process for solving True/False questions. It went like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When solving a True/False question, I first imagine someone standing in front of me. He says the statement from the question to me. If he is lying, the answer is &lt;em&gt;False&lt;/em&gt;. If he is telling the truth, the answer is &lt;em&gt;True&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I asked a couple of people to carry out the process while narrating it to me. They seemed to be able to do it (and they got it right). So then I gave the quiz.&lt;/p&gt;
&lt;p&gt;The result? Correct answers went &lt;strong&gt;from 20% to 80%&lt;/strong&gt;. I felt like I was finally testing their knowledge of the material and not their understanding of test-taking strategies.&lt;/p&gt;
&lt;p&gt;How did it work? By &lt;strong&gt;converting the problem from a logic skill to a social skill&lt;/strong&gt;, the students could totally bypass the need to process difficult symbolic rules. And we could solve it as a social problem by using a structured process of imagination.&lt;/p&gt;
&lt;p&gt;True/False questions are difficult because there are &lt;strong&gt;so many levels of binary confusion&lt;/strong&gt;. First, you are looking for the correct (as opposed to the incorrect) answer. Then you must determine the truth value of the whole statement, which is a function of the truth values of the sub-statements. It's just a lot of levels to keep in your head.&lt;/p&gt;
&lt;p&gt;The imaginative process cuts through all of that and asks one question: is he lying. &lt;strong&gt;You are offloading the processing to the social part of your brain&lt;/strong&gt;, which can easily do it if framed in the right way.&lt;sup&gt;&lt;a href=&quot;#fn2&quot; class=&quot;footnoteRef&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/100-most-used-clojure-expressions&quot;&gt;The 100 Most Used Clojure Expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/interactive-baking&quot;&gt;The Importance of Embodied Metaphors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/learning-is-about-skills&quot;&gt;How to avoid &amp;quot;Makes sense if you already understand it.&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/new-orleans-clojure-workshop-oct-2016&quot;&gt;New Orleans Clojure Workshop Retrospective&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;Looking indicates visual thinking. &lt;a href=&quot;http://lispcast.com/why-technical-explanation-alone-is-not-enough&quot;&gt;Use the right part of the brain.&lt;/a&gt;&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot;&gt;&lt;p&gt;In my last post, I hinted at a better way to teach how to determine whether a function is a pure function. The better way is to imagine a robot in front of you. Can he run that function &amp;quot;in his head&amp;quot;? Or does he need to effect the outside world?&lt;a href=&quot;#fnref2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/making-true-false-easy"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Use Your Imagination</title>
                  <guid isPermalink="false">http://www.lispcast.com/use-your-imagination</guid>
                  <link>http://www.lispcast.com/use-your-imagination</link>
                  <pubDate>Tue 17 Sep 2013 10:22:44 PM CDT</pubDate>
                  <description>
                    You can transfer the outline of a skill by guiding someone through a structured use of their imagination.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/use-your-imagination"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Nil Punning (Or Null Pointers Considered Not So Bad)</title>
                  <guid isPermalink="false">http://www.lispcast.com/nil-punning</guid>
                  <link>http://www.lispcast.com/nil-punning</link>
                  <pubDate>Thu 12 Sep 2013 04:44:34 PM CDT</pubDate>
                  <description>
                    Null pointers are still a problem in Clojure, but several design decisions have made them less problematic than other languages.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/nil-punning"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Tap Into Your Social Brain</title>
                  <guid isPermalink="false">http://www.lispcast.com/tap-into-your-social-brain</guid>
                  <link>http://www.lispcast.com/tap-into-your-social-brain</link>
                  <pubDate>Wed 11 Sep 2013 12:50:02 PM CDT</pubDate>
                  <description>
                    We can solve social problems much more easily than logic problems, even when they are equivalent. Convert a logic problem into a social problem to make it easier to solve.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/tap-into-your-social-brain"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure for the Brave and True</title>
                  <guid isPermalink="false">http://www.lispcast.com/brave-clojure</guid>
                  <link>http://www.braveclojure.com/</link>
                  <pubDate>Wed 11 Sep 2013 12:43:47 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I am pretty excited about this project. Please check it out.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/100-most-used-clojure-expressions&quot;&gt;The 100 Most Used Clojure Expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/3-things-java-can-steal-from-clojure&quot;&gt;3 Things Java Programmers Can Steal from Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/annotated-clojure-core-reduce&quot;&gt;Some Annotated clojure.core/reduce Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/annotated-map&quot;&gt;Annotated map&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/brave-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>A Personal Lisp Crisis</title>
                  <guid isPermalink="false">http://www.lispcast.com/a-personal-lisp-crisis</guid>
                  <link>http://blog.jacius.info/2012/05/29/a-personal-lisp-crisis/</link>
                  <pubDate>Wed 11 Sep 2013 12:20:58 PM CDT</pubDate>
                  <description>
                    
&lt;blockquote&gt;
&lt;p&gt;There are other languages with healthier communities, more momentum, cleaner cores, and features on par with CL. So I have to ask myself, why bother with CL?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had a similar experience with Common Lisp. Great language, snobby community, little progress, needs more modern amenities.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/bootstrapping-mindset&quot;&gt;The Bootstrapping Mindset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/idea-of-lisp&quot;&gt;The Idea of Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/infinite-application&quot;&gt;Infinite Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/just-hack-something-together&quot;&gt;Just Hack Something Together&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/a-personal-lisp-crisis"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why technical explanation alone is not enough</title>
                  <guid isPermalink="false">http://www.lispcast.com/why-technical-explanation-alone-is-not-enough</guid>
                  <link>http://www.lispcast.com/why-technical-explanation-alone-is-not-enough</link>
                  <pubDate>Mon 09 Sep 2013 08:18:29 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Here's a problem you might see on a standardized test:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img src=&quot;http://www.lispcast.com/img/logic-puzzle.png&quot; alt=&quot;Choose the answer that makes the following statement FALSE: If the Triangle is Red, then the Square is Blue.&quot; /&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Go ahead and try to solve it. Choose an answer.&lt;/p&gt;
&lt;p&gt;When people answer this question on a test, the most common answer is C. Yellow triangle and red square. They try to make the statement false by negating all of the colors.&lt;/p&gt;
&lt;p&gt;This is wrong. Actually, the correct answer is A. It is the only one that makes the statement false. Why?&lt;/p&gt;
&lt;p&gt;This is a propositional logic problem. The colors and shapes are a red herring. The rule for implication (if-then statement) is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An implication is false if the antecedant is true and the consequent is false.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kind of boring and therefore hard to understand if you don't already know the rule. It is unlikely that any amount of explanation will help, though you should try to understand if you don't already. Here, try this. If the triangle isn't red, then the statement doesn't apply, so it is true by irrelevance. That eliminates C and D. B obviously makes the statement true, so it must be A.&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Researchers found that explanations alone do not help. I read an article&lt;sup&gt;&lt;a href=&quot;#fn2&quot; class=&quot;footnoteRef&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; about a study where similar questions were asked to a group of students. The students were hooked up to &lt;a href=&quot;http://en.wikipedia.org/wiki/Electroencephalography&quot;&gt;EEG (Electroencephalography)&lt;/a&gt; machines to measure what parts of their brains were active during each question. They also asked them to say which ones they thought they got right.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;img src=&quot;http://www.lispcast.com/img/eeg.jpg&quot; alt=&quot;EEG setup also labeling reasoning/visual areas.&quot; /&gt;
&lt;/center&gt;  
Photo credit: &lt;a href=&quot;http://en.wikipedia.org/wiki/File:EEG_recording.jpg&quot;&gt;Petter Kallioinen&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;What they found was that most of the people who answered A were &lt;em&gt;using their frontal and temporal lobes&lt;/em&gt;: the parts of the brain responsible for &lt;em&gt;logic, reasoning, and language&lt;/em&gt;. Most of the people who answered C were using their &lt;em&gt;occipital lobes&lt;/em&gt;, which is responsible for &lt;em&gt;vision&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moral #1:&lt;/strong&gt; Recognize what type of problem you need to solve. If possible, use the right part of your brain for that problem.&lt;/p&gt;
&lt;p&gt;The people who used their vision centers were doing visual pattern matching, &lt;em&gt;looking for shapes and colors&lt;/em&gt;. This is typical of a fight-or-flight response, where you are running from a tiger and need to quickly spot it in the jungle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moral #2:&lt;/strong&gt; Don't get nervous during a test. Anxiety makes some parts of your brain more active--usually the wrong ones.&lt;/p&gt;
&lt;p&gt;In addition, the people who used their vision center to answer the question &lt;em&gt;thought they got the answer right&lt;/em&gt; just as much as the people who actually got it right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moral #3:&lt;/strong&gt; The different parts of your brain are good at different tasks. If you ask the occipital lobe to do pattern matching, it will, and it will think it did a good job--even if it is not a pattern matching task.&lt;/p&gt;
&lt;p&gt;The second part of the study tried to teach those who got it wrong to do it better next time. They broke them into a control group and an experimental group. The control group got an explanation like the boring one above on how to make an implication false. The experimental group got the same explanation plus they were trained with a little &lt;em&gt;bio-feedback to use the right part of the brain&lt;/em&gt;.&lt;sup&gt;&lt;a href=&quot;#fn3&quot; class=&quot;footnoteRef&quot; id=&quot;fnref3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The result was that the control group didn't make any gains. And they &lt;em&gt;still&lt;/em&gt; thought they got it right. The experimental group did significantly better. They scored higher and were more likely to say they got the wrong answer when they did get the wrong answer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moral #4:&lt;/strong&gt; Explanation alone is basically worthless. Even practice is not enough. The key is to recognize what type of problem it is, use the right part of your brain, and don't listen to the rest of your brain. Only then is explanation useful.&lt;/p&gt;
&lt;p&gt;Now, this is easier said than done. I don't have an EEG machine. I've never done bio-feedback. But the &lt;em&gt;idea&lt;/em&gt; has helped me tremendously when teaching math. &lt;em&gt;It is not hard to recognize when someone is using the wrong part of their brain.&lt;/em&gt; First, they &lt;em&gt;confidently&lt;/em&gt; get the wrong answer. Second, they are getting the basic mechanics of the problem wrong. They're &lt;em&gt;looking&lt;/em&gt; for something. They find the closest thing to what they want. They're done.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Logic problems aren't about looking.&lt;/em&gt; They're more abstract. Common helpers for doing logic problems are mouthing words, making gestures, and looking &lt;em&gt;away&lt;/em&gt; from the problem.&lt;/p&gt;
&lt;p&gt;Recognizing whether someone is using the right part of their brain is easy. But now you know explaining won't help. The hard part is to get them &lt;strong&gt;to use the correct part of the brain&lt;/strong&gt;. That's what I'll talk about next time.&lt;/p&gt;
&lt;h3 id=&quot;you-might-also-like&quot;&gt;You might also like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/100-most-used-clojure-expressions&quot;&gt;The 100 Most Used Clojure Expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/interactive-baking&quot;&gt;The Importance of Embodied Metaphors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/learning-is-about-skills&quot;&gt;How to avoid &amp;quot;Makes sense if you already understand it.&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/making-true-false-easy&quot;&gt;Making True/False Questions Easy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;If you still don't get it, I'll share one more trick. Convert it into a purely symbolic puzzle to switch off your occipital lobe.&lt;/p&gt;
&lt;p&gt;Choose the answer that makes the following statement FALSE:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X -&amp;gt; Y

A.  X &amp;amp; ~Y  
B.  X &amp;amp;  Y  
C. ~X &amp;amp; ~Y  
D. ~X &amp;amp;  Y  &lt;/code&gt;&lt;/pre&gt;
&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot;&gt;&lt;p&gt;I read it back in 2002 and have lost the reference. I tried searching for it and could not find it. The reason I bring it up, even without a citation, is that it has been very important to my thinking about learning. If you know this or a similar study, please let me know.&lt;a href=&quot;#fnref2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn3&quot;&gt;&lt;p&gt;Yes, it was double-blind. In fact, if I remember correctly, they were all in the same classroom listening to the same lecture. The control group was moved to a room to practice. The experimental group was moved to a different room to practice with EEG bio-feedback machines. Then they took a similar test again.&lt;a href=&quot;#fnref3&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/why-technical-explanation-alone-is-not-enough"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Functors, Applicatives, And Monads In Pictures</title>
                  <guid isPermalink="false">http://www.lispcast.com/functors-applicatives-and-monads-in-pictures</guid>
                  <link>http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html</link>
                  <pubDate>Wed 22 May 2013 06:41:39 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;This is a nice, short post. It does the job well, though it might need a few readings if you have never seen these concepts before.&lt;/p&gt;
&lt;p&gt;Learn these ideas and get on with your life. The sooner we get over this Functor/Applicative/Monad obsession, the better.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/functors-applicatives-and-monads-in-pictures"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>3 Things Java Programmers Can Steal from Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/3-things-java-can-steal-from-clojure</guid>
                  <link>http://www.lispcast.com/3-things-java-can-steal-from-clojure</link>
                  <pubDate>Sat 09 Mar 2013 03:38:24 PM CST</pubDate>
                  <description>
                    Many of the cool parts of Clojure are written in Java. That means you can access those parts from any Java code. Just include the Clojure JAR, import the classes, and you've got better tools.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/3-things-java-can-steal-from-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>4 Things Java Programmers Can Learn from Clojure without learning Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/java-learn-from-clojure</guid>
                  <link>http://www.lispcast.com/java-learn-from-clojure</link>
                  <pubDate>Wed 06 Mar 2013 09:34:48 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;I was trained in Java at University. The OOP matrix was firmly implanted in my thinking. I wanted to share some things that I have learned from Clojure that were certainly possible in Java but never became fundamental to my programming practice.&lt;/p&gt;
&lt;p&gt;Clojure certainly has learned a lot from Java. It might be cool if the learning went both ways. These are universal principles. In fact, these principles are actually well known in the OOP world. You probably already know them, so learning Clojure is not required (but it is recommended!).&lt;/p&gt;
&lt;h3 id=&quot;use-immutable-values&quot;&gt;1. Use immutable values&lt;/h3&gt;
&lt;p&gt;One of Clojure's claim to fame is its immutable data structures. But immutable values were appreciated even in the very early days of Java. &lt;code&gt;String&lt;/code&gt; is immutable and was a bit controversial when Java came out. Back then, C and C++ strings were simply arrays which could be changed. Immutable Strings were seen as inefficient.&lt;/p&gt;
&lt;p&gt;However, looking back, immutable Strings seem to have been the right choice. Many of the mutable Java classes are now seen as mistakes. Take, for example, &lt;code&gt;java.util.Date&lt;/code&gt;. What does it mean to change the month of a date?&lt;/p&gt;
&lt;p&gt;Let's go a little further. Let's imagine that I'm an object. You ask me when my birthday is. I hand you a piece of paper with July 18, 1981. You take that home, store it somewhere, and even let other people access that piece of paper.&lt;/p&gt;
&lt;p&gt;One of those people says &amp;quot;cool, a date!&amp;quot; And changes it to his birthday, April 2, 1976 using &lt;a href=&quot;http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#setTime(long)&quot;&gt;&lt;code&gt;setTime&lt;/code&gt;&lt;/a&gt;. Now the next person who asks for my birthday actually gets that guy's birthday. What a disaster! Why did I give away that magic paper that changes my birthday?&lt;/p&gt;
&lt;p&gt;By making values mutable, this magical-changing-at-a-distance is always a possibility. One way to look at the reason it is actually wrong to use mutable values is that it breaks &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Information_hiding&quot;&gt;the information hiding principle&lt;/a&gt;&lt;/em&gt;. My birthdate is part of the state of my object. By giving direct access to the month, day, and year, I'm actually letting any class have direct access to my internal state.&lt;/p&gt;
&lt;p&gt;The answer, of course, is to not have any setters on an object. After construction, the object can't change. That way, my internal state remains encapsulated.&lt;/p&gt;
&lt;p&gt;This applies to collections as well. Have you ever read the docs for &lt;code&gt;Iterator&lt;/code&gt;. Can you tell what happens when the underlying list changes? Neither can I. An immutable list would not have such a complicated interface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Don't write setter methods. For collections, you have a couple of options. One easy thing to do is use the &lt;a href=&quot;https://code.google.com/p/guava-libraries/&quot;&gt;Google Guava&lt;/a&gt; &lt;code&gt;Immutable...&lt;/code&gt; classes. If using Guava is not an option, whenever you are returning a collection, make a copy, wrap it in a &lt;code&gt;java.util.Collections.unmodifiable...()&lt;/code&gt;, and throw away the reference to the copy.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public static Map immutableMap(Map m) {
  return Collections.unmodifiableMap(new HashMap(m));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To learn more about immutable values, I suggest watching &lt;a href=&quot;http://www.youtube.com/watch?v=-6BsiVyC1kM&quot;&gt;The Value of Values&lt;/a&gt;, a talk by Rich Hickey, the creator of Clojure.&lt;/p&gt;
&lt;iframe width=&quot;900&quot; height=&quot;506&quot; src=&quot;http://www.youtube.com/embed/-6BsiVyC1kM&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;do-no-work-in-the-constructor&quot;&gt;2. Do no work in the constructor&lt;/h3&gt;
&lt;p&gt;Imagine this situation. Your &lt;code&gt;Person&lt;/code&gt; class has a constructor that takes a bunch of information (first name, last name, address, etc.) and stores it in the object's state. Someone on your team needs to store that data to a file, so stores it as JSON. For convenience in creating a Person, you add a constructor that takes an &lt;code&gt;InputStream&lt;/code&gt; and parses it as JSON, then sets up the state. Just because, you also add one that takes a &lt;code&gt;File&lt;/code&gt;, reads in the file, then parses it. And then one that reads in a web request given a &lt;code&gt;URL&lt;/code&gt;. Great! You've got a very convenient class.&lt;/p&gt;
&lt;p&gt;But wait! What is the responsibility of the &lt;code&gt;Person&lt;/code&gt; class? Originally, it was &amp;quot;represent personal information about a person&amp;quot;. Now it is also responsible for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parsing JSON&lt;/li&gt;
&lt;li&gt;Making web requests&lt;/li&gt;
&lt;li&gt;Reading files&lt;/li&gt;
&lt;li&gt;Handling errors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What's more is that the class is now harder to test. How can you test the &lt;code&gt;File&lt;/code&gt; constructor? First, you write a temporary file to the file system. Not too bad. How do you test the web request? Set up a web server, configure it to serve the file, then call the constructor.&lt;/p&gt;
&lt;p&gt;The problem is that &lt;code&gt;Person&lt;/code&gt; violates &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Single_responsibility_principle&quot;&gt;the single responsibility principle&lt;/a&gt;&lt;/em&gt;. &lt;code&gt;Person&lt;/code&gt; is about keeping bits of information together, not permanent storage or serialization. It should be a data object, no more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE: Solution&lt;/strong&gt;: Keep your constructor free of logic. Separate out convenience constructors (like the one that parses JSON) into static factory methods.&lt;/p&gt;
&lt;p&gt;To learn more about this idea (and more!), I suggest you watch &lt;a href=&quot;http://www.youtube.com/watch?v=acjvKJiOvXw&quot;&gt;OO Design for Testability&lt;/a&gt; by Miško Hevery, the creator of &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&quot;900&quot; height=&quot;675&quot; src=&quot;http://www.youtube.com/embed/acjvKJiOvXw&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;program-to-small-interfaces&quot;&gt;3. Program to small interfaces&lt;/h3&gt;
&lt;p&gt;One thing that Clojure has done very well is to define a set of very powerful, small interfaces which abstract a pattern of access. The interface allows many different types to participate in an &amp;quot;ecosystem&amp;quot;. Any function which applies to the interface can act on any type that implements that interface. Any new type can take advantage of all of the existing functionality already built in.&lt;/p&gt;
&lt;p&gt;Take for instance the &lt;code&gt;Iterable&lt;/code&gt; interface. It generalizes anything that can be accessed sequentially (such as a list or set). If all a method needs to do is operate on something sequentially, it only needs to know that it implements this interface. That means it can operate on types that were not known to the programmer when the method was written.&lt;/p&gt;
&lt;p&gt;This aspect follows from &lt;em&gt;&lt;a href=&quot;http://www.oodesign.com/dependency-inversion-principle.html&quot;&gt;the dependency inversion principle&lt;/a&gt;&lt;/em&gt; which states that high-level logic should be written in terms of abstractions instead of the details of the lower-level logic. Interfaces capture this principle well. High-level logic should operate on interfaces which are implemented by the lower-level logic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Think hard about the access patterns for classes and see if you can't abstract out small interfaces which pinpoint those access patterns. Then program to those interfaces. Remember, it takes two to use an interface: the implementor and the client. Make sure you use them from both sides as much as possible.&lt;/p&gt;
&lt;p&gt;Nothing increases maintainability and the future cost of code more than good interfaces. To learn more about this, I suggest watching &lt;a href=&quot;https://www.youtube.com/watch?v=aAb7hSCtvGw&quot;&gt;How To Design A Good API and Why It Matters&lt;/a&gt;. It's an older (but good) talk by Joshua Bloch.&lt;/p&gt;
&lt;iframe width=&quot;900&quot; height=&quot;675&quot; src=&quot;http://www.youtube.com/embed/aAb7hSCtvGw&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;represent-computation-not-the-world&quot;&gt;4. Represent computation, not the world&lt;/h3&gt;
&lt;p&gt;When I was in college, the teacher taught us that you should use classes to model objects in the world. The quintessential modeling problem was students registering for courses.&lt;/p&gt;
&lt;p&gt;A course can have many students and a student can be registered in many courses. A many-to-many relationship.&lt;/p&gt;
&lt;p&gt;The obvious choice is to make a &lt;code&gt;Student&lt;/code&gt; class and a &lt;code&gt;Course&lt;/code&gt; class. Each has a list of the other. Inclusion in that list represents registration. Methods like &lt;code&gt;register&lt;/code&gt; and &lt;code&gt;listCourses&lt;/code&gt; let a Student register or list the courses he's registered in.&lt;/p&gt;
&lt;p&gt;Professors would present this problem in order to discuss the tradeoffs of different design choices. None of the configurations of Student and Course were ideal. An astute data modeler would see the pattern of the many-to-many relationship and abstract that out. You can create a class called &lt;code&gt;ManyToMany&amp;lt;X,Y&amp;gt;&lt;/code&gt; that manages the relationship. You can create a &lt;code&gt;ManyToMany&amp;lt;CourseID, StudentID&amp;gt;&lt;/code&gt; and it solves your problem exactly.&lt;/p&gt;
&lt;p&gt;The issue is that this directly contradicts the teacher's lesson. A relationship is not an object in the real world. At best it is an abstract concept.&lt;/p&gt;
&lt;p&gt;What's more is that it solves the more general abstract problem as well. The &lt;code&gt;ManyToMany&lt;/code&gt; class can be reused anywhere it is suited. Even better would be to make &lt;code&gt;ManyToMany&lt;/code&gt; an interface with many possible implementations.&lt;/p&gt;
&lt;p&gt;I think my professor was wrong. The Java standard library contains many classes that are purely computational. Why can't application programmers write them as well? Further, look at the &lt;a href=&quot;http://www.amazon.com/gp/product/0201633612/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0201633612&amp;amp;linkCode=as2&amp;amp;tag=lisp0b-20&quot;&gt;GOF Design Patterns Book&lt;/a&gt;. Most (if not all) of the patterns are about abstracting computation, not &amp;quot;objects in the real world&amp;quot;. Take, for instance, &lt;a href=&quot;http://en.wikipedia.org/wiki/Chain_of_responsibility_pattern&quot;&gt;Chain-of-responsibility&lt;/a&gt;, which Wikipedia describes as &amp;quot;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: look for repetitive patterns of code and build classes that take care of those patterns. Use those classes instead of repeating the pattern over and over in code.&lt;/p&gt;
&lt;p&gt;One reason I like Clojure is that it has a lot to teach. If you'd like to learn Clojure, you might like my &lt;a href=&quot;http://www.purelyfunctional.tv/intro-to-clojure&quot;&gt;Introduction to Clojure video course&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;subscribe-form-wrapper&quot;&gt;
  &lt;form action=&quot;https://www.getdrip.com/forms/1194631/submissions&quot; method=&quot;post&quot; data-drip-embedded-form=&quot;1194631&quot;
        class=&quot;subscribe-form&quot;&gt;
    &lt;h3 data-drip-attribute=&quot;headline&quot;&gt;
Free Clojure Learning Resources
&lt;/h3&gt;
    &lt;div data-drip-attribute=&quot;description&quot;&gt;
      &lt;div style=&quot;float:right; width:250px; max-width:25%&quot;&gt;
        
&lt;img src=&quot;http://www.lispcast.com/img/clojure expr flashcard.png&quot; style=&quot;width:100%&quot;&gt; &lt;img src=&quot;http://www.lispcast.com/img/clj-refactor cheatsheet.png&quot; style=&quot;width:100%&quot;&gt;
&lt;/div&gt;
      
Sign up below and you'll get access to the &lt;em&gt;Clojure Resource Center&lt;/em&gt; where I collect reference sheets and flashcards for learning Clojure, including the &lt;b&gt;Top 100 Clojure Expressions&lt;/b&gt; flashcards and the &lt;b&gt;clj-refactor cheatsheet&lt;/b&gt;. I'll also send you other information about learning Clojure and figuring out if Clojure is for you.
&lt;/div&gt;
    
&lt;br&gt;
&lt;div&gt;
      
&lt;label for=&quot;fields[email]&quot;&gt;Email Address: &lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;fields[email]&quot; value=&quot;&quot;
             id=&quot;fields[email]&quot;
             placeholder=&quot;Email&quot; /&gt; &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Sign Up&quot;
             data-drip-attribute=&quot;sign-up-button&quot;
             class=&quot;subscribe-button&quot;/&gt;
&lt;/div&gt;
  &lt;/form&gt;
&lt;/div&gt;




                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/java-learn-from-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Existing Clojure Introductory Videos</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-screencasts</guid>
                  <link>http://www.lispcast.com/clojure-screencasts</link>
                  <pubDate>Sun 03 Mar 2013 06:19:49 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;As you probably know, I am running a &lt;a href=&quot;http://www.kickstarter.com/projects/376627045/lispcast-introduction-to-clojure-videos&quot;&gt;Kickstarter project to create Introduction to Clojure videos&lt;/a&gt;. The project is still going (it runs until March 14, 2013). Please support it if you want the videos.&lt;/p&gt;
&lt;p&gt;I know that there are many great videos out there that teach the basics of Clojure. Allow me to present my selection.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=P6S_1nCfjWA&quot;&gt;Jim Slaterry is creating video walkthroughs&lt;/a&gt; of the &lt;a href=&quot;http://clojurekoans.com/&quot;&gt;Clojure Koans&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vimeo.com/channels/fulldisclojure&quot;&gt;Full Disclojure was a long series of screencasts by Sean Devlin&lt;/a&gt; that dives deep into Clojure. There are many lessons about Clojure and functional programming, screencasts explaining how to install editors, and a few explorations of katas. Most of the material should still be current.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=Aoeav_T1ARU&amp;amp;list=PLAC43CFB134E85266&quot;&gt;Brian Will created a series of videos introducing Clojure&lt;/a&gt; back in 2009 which explains the basics of the language. The basics have changed somewhat, but this is still a good way to get into the language.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=dGVqrGmwOAw&quot;&gt;Rich Hickey&lt;/a&gt; gave &lt;a href=&quot;http://www.youtube.com/watch?v=P76Vbsk_3J0&quot;&gt;some talks&lt;/a&gt; a long time ago teaching Clojure. Again, a little old, but I learned a lot from them when they were new.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-screencasts"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>ClojureSphere</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojuresphere</guid>
                  <link>http://www.clojuresphere.com/</link>
                  <pubDate>Fri 01 Mar 2013 06:17:09 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;Pretty cool.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojuresphere"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why Functional Code is Shorter</title>
                  <guid isPermalink="false">http://www.lispcast.com/why-functional-code-is-shorter</guid>
                  <link>http://pchiusano.blogspot.ca/2013/02/why-functional-code-is-shorter.html</link>
                  <pubDate>Mon 25 Feb 2013 01:24:12 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;Paul Chiusano:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The real decrease in code size when using FP comes from there being exponentially more code reuse possible due to the compositionality of pure code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I totally agree. John Carmack has it wrong.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/why-functional-code-is-shorter"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>An interview</title>
                  <guid isPermalink="false">http://www.lispcast.com/interview-alex-konetchy</guid>
                  <link>http://www.alexkonetchy.net/2013/02/eric-normand.html</link>
                  <pubDate>Sun 24 Feb 2013 12:20:34 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;I was interviewed last week by Alex Konetchy about my Kickstarter project.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/interview-alex-konetchy"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Highest-Level Feature of C</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-highest-level-feature-of-c</guid>
                  <link>http://prog21.dadgum.com/166.html</link>
                  <pubDate>Sat 23 Feb 2013 10:17:13 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;I like James Hague's writing. He writes concisely and offers a clear perspective on muddy subjects.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-highest-level-feature-of-c"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Monads and Objects</title>
                  <guid isPermalink="false">http://www.lispcast.com/monads-and-objects</guid>
                  <link>http://www.lispcast.com/monads-and-objects</link>
                  <pubDate>Fri 22 Feb 2013 11:28:45 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;If you went back to 1990 and asked a random programmer what an object was (as in OOP) what would he say? I bet he'd say something like &amp;quot;I don't know. I want to learn them but I don't know where to start.&amp;quot; If you told him &amp;quot;Well, they're easy. Each object has a class. The class defines methods. The object encapsulates state . . .&amp;quot;, then his eyes would glaze over. He receives a maelstrom of concepts and their relationships. In the end, he would learn nothing. &lt;strong&gt;It actually took a long time for OO to become the norm.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is analagous to what is happening currently with monads. &lt;strong&gt;People want to learn, they get some high-concept explanation, they are unsatisfied.&lt;/strong&gt; People try to explain. They really do. I still remember when I did not get monads, so I have a lot of sympathy.&lt;/p&gt;
&lt;p&gt;Perhaps, like with OOP, &lt;strong&gt;it will take a generation to become understandable to the mainstream&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The best way I can think of to teach monads to a programmer is &lt;strong&gt;jQuery&lt;/strong&gt;. You have to know jQuery to understand this example. And frankly, if you don't know jQuery, it is easier to go learn it and come back than to go read a monad tutorial.&lt;/p&gt;
&lt;p&gt;Here's a (not-so-)secret: &lt;strong&gt;jQuery objects are a monad&lt;/strong&gt;. When you do &lt;code&gt;$('div')&lt;/code&gt;, you get an object which &amp;quot;contains&amp;quot; all of the &lt;code&gt;div&lt;/code&gt; elements in the document. There are many methods on the jQuery object which modify the set of elements contained in the object and return it. That's what makes it a monad: the methods return a value of the same type.&lt;/p&gt;
&lt;p&gt;Without the jQuery object, you have to follow (and re-follow--potentially repeating code) the logic of collections. The jQuery object controls the logic by which operations on the contained set of elements gets executed. You call a method, it changes all of the elements. If there is no element, nothing happens. If there is one element, it alone is changed. If there are many elements, they are all changed. And you don't need to know. If you call &lt;code&gt;$('&amp;lt;div /&amp;gt;')&lt;/code&gt;, even though you are constructing an object with only one element, jQuery internally turns it into a list. &lt;strong&gt;jQuery is making sure you don't have to know if you have 0, 1, or many elements.&lt;/strong&gt; And this turns out to be a useful abstraction.&lt;/p&gt;
&lt;p&gt;This logic is simple. You write this code all the time when you are dealing with collections of objects. But &lt;strong&gt;you have to write this all the time, over and over&lt;/strong&gt;. And you have to remember to write it. The jQuery object does that for you.&lt;/p&gt;
&lt;p&gt;That is the job of the monad. It gives you a single place to express the logic for access (in this case, a kind of collection logic). &lt;strong&gt;Now we are going to make a monad and show how we can write this logic in only one place.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To make a monad, you actually need two things. One is typically called &lt;code&gt;return&lt;/code&gt;, but &lt;strong&gt;in OOP it's the constructor&lt;/strong&gt;. We know that the jQuery constructor is the &lt;code&gt;$&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The second thing you need is &lt;strong&gt;a way to chain methods&lt;/strong&gt;. All you need is to return a value constructed with that constructor. Then you can chain. In Haskell, this is called &lt;code&gt;bind&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But I promised that monads got rid of repetition. If &lt;strong&gt;all of your jQuery methods have to contain this collection logic and return logic&lt;/strong&gt;, how does that get rid of repetition? Well, if you did it the way it's done in Haskell, you'd get rid of the repetition.&lt;/p&gt;
&lt;p&gt;Let's do it that way. Let's define a method on the jQuery called &lt;code&gt;bind&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jQuery.prototype.bind = function (f) {
  return $(f(this.get()));
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We construct a new jQuery object with the elements transformed by &lt;code&gt;f&lt;/code&gt;. So I can write:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function filter_divs(els) {
  var arr = [];
  var i;
  for(i = 0; i &amp;lt; els.length; i++)
    if(els[i].tagName === &amp;#39;div&amp;#39;)
      arr.push(els[i]);
  return arr;
}

$(&amp;#39;.x&amp;#39;).bind(filter_divs).addClass(&amp;#39;hello&amp;#39;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let's take it further. We can bind the function and store it in the prototype:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jQuery.prototype.bind_def = function (name, f) {
  jQuery.prototype[name] = function () {
    return $(f(this.get()));
  };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now &lt;strong&gt;we can call it like a method&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.bind_def(&amp;#39;filter_divs&amp;#39;, filter_divs);

$(&amp;#39;.x&amp;#39;).filter_divs().addClass(&amp;#39;hello&amp;#39;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, now we can chain. &lt;strong&gt;We only have to write the logic once (in &lt;code&gt;bind&lt;/code&gt; or &lt;code&gt;bind_def&lt;/code&gt;).&lt;/strong&gt; And we have a constructor. That's a monad.&lt;/p&gt;
&lt;p&gt;Now, imagine other bits of logic you could build into a method chain. What happens if a method returns &lt;code&gt;null&lt;/code&gt;? If you call a method on it, it will throw an exception. &lt;strong&gt;You can capture the null check in a monad.&lt;/strong&gt; That is called the Maybe Monad.&lt;/p&gt;
&lt;p&gt;There are other useful monads, but they all are simply &lt;strong&gt;structured ways of chaining&lt;/strong&gt; by giving controlled access to the internals of the object.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://www.youtube.com/watch?v=dkZFtimgAcM&quot;&gt;Douglas Crockford&lt;/a&gt; for some of these ideas.&lt;/p&gt;
&lt;p&gt;If you liked this essay, please check out the &lt;a href=&quot;http://clojuregazette.org/&quot;&gt;Clojure Gazette&lt;/a&gt;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/monads-and-objects"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Monads &amp; Gonads</title>
                  <guid isPermalink="false">http://www.lispcast.com/monads-and-gonads</guid>
                  <link>http://www.youtube.com/watch?v=dkZFtimgAcM</link>
                  <pubDate>Thu 21 Feb 2013 05:44:59 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;Douglas Crockford gives his version of the obligatory monad tutorial. His version is in Javascript with hopes of needed demystification.&lt;/p&gt;
&lt;p&gt;I have to appreciate the freshness of his approach. He says a monad is just an object with certain properties (the monad laws). That's a great way to explain it in an object-oriented context. Objects are the unit of encapsulation. Monads serve the purpose of encapsulating state and allowing structured access to that state.&lt;/p&gt;
&lt;p&gt;There is one thing that bothers me about his presentation. He uses mutable objects. I guess that is to be expected in Javascript. But mutating state in a monad seriously limits their possibilities, as mutation does in most uses.&lt;/p&gt;
&lt;p&gt;Either way, it is an entertaining watch and a good explanation of monads. Perhaps the most down-to-earth I have seen.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/monads-and-gonads"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Redline Smalltalk</title>
                  <guid isPermalink="false">http://www.lispcast.com/redline-smalltalk</guid>
                  <link>http://www.indiegogo.com/projects/redline-smalltalk-v1-0?website_name=smalltalk</link>
                  <pubDate>Thu 21 Feb 2013 05:39:59 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;I've been talking to James Ladd about this project and it looks really cool. If you don't know, Smalltalk was the language for which the term &lt;em&gt;Object Oriented&lt;/em&gt; was coined. It has a rich history and is one of the most powerful languages ever written.&lt;/p&gt;
&lt;p&gt;Redline is an implementation of Smalltalk for the JVM. James and his team have some big plans for Redline, but first they want to get to v1.0 with a robust, professional distribution. By running on the JVM, Redline will be able to tap into the amazing ecosystem that is growing around the JVM. That means that interop is incredibly easy between Smalltalk, Java, and Clojure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.indiegogo.com/projects/redline-smalltalk-v1-0?website_name=smalltalk&quot;&gt;Please check it out.&lt;/a&gt;&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/redline-smalltalk"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Refactor your tests</title>
                  <guid isPermalink="false">http://www.lispcast.com/refactor-your-tests</guid>
                  <link>http://www.lispcast.com/refactor-your-tests</link>
                  <pubDate>Thu 21 Feb 2013 05:36:19 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;Just a reminder, guys. I always forget. I thought you might, too.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/refactor-your-tests"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure Screencasts</title>
                  <guid isPermalink="false">http://www.lispcast.com/screencasts</guid>
                  <link>http://www.lispcast.com/screencasts</link>
                  <pubDate>Tue 12 Feb 2013 01:56:54 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;I would like to announce the launch of &lt;a href=&quot;http://www.kickstarter.com/projects/376627045/lispcast-introduction-to-clojure-videos&quot;&gt;my Kickstarter project&lt;/a&gt;. It is a project to develop screencasts to introduce Clojure to programmers everywhere.&lt;/p&gt;
&lt;p&gt;Video is a great way to learn programming. For one, you get to watch the program being developed organically, not as a static artifact (as in a book). Also, a voiceover gives a direct stream into the thought process of the programmer as he types. Finally, you can stop and replay as much as you want to learn at your own pace. Those things, combined with video's ability to engage a large part of your brain make it a great learning tool.&lt;/p&gt;
&lt;p&gt;This blog was first created to host screencasts I made for Common Lisp, way back when. I transitioned to Clojure after watching a talk by Rich Hickey at &lt;a href=&quot;http://lisp50.blogspot.com/&quot;&gt;Lisp50&lt;/a&gt; in 2008. I was very impressed and have not looked back.&lt;/p&gt;
&lt;p&gt;I have loved education ever since I taught math in the Peace Corps. I really enjoyed making those Common Lisp videos as well. I wanted to turn it into something like &lt;a href=&quot;https://peepcode.com/&quot;&gt;PeepCode&lt;/a&gt;, but my day job interceded and I didn't have the comfort level with Clojure that I did with Common Lisp. The videos got put on hold.&lt;/p&gt;
&lt;p&gt;That was almost five years ago and I feel very confident with my ability to teach Clojure. Plus, video production has advanced a lot. I will be able to produce very high-quality videos much more easily than five years ago. And Kickstarter has provided a nearly risk-free way to test the market.&lt;/p&gt;
&lt;p&gt;If this project does well, I hope to make it into a profitable business and produce more and more videos, especially videos about deeper topics. But only if the project proves itself in the very large beginner's market. Let your friends know about this &lt;a href=&quot;http://www.kickstarter.com/projects/376627045/lispcast-introduction-to-clojure-videos&quot;&gt;great opportunity&lt;/a&gt; to learn Clojure. You can find the Kickstarter project &lt;a href=&quot;http://www.kickstarter.com/projects/376627045/lispcast-introduction-to-clojure-videos&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My ultimate goal, if the project proves out, is to provide exceptional educational materials to build a strong developer culture. &lt;a href=&quot;http://clojuregazette.com/&quot;&gt;Clojure Gazette&lt;/a&gt; shares this same goal.&lt;/p&gt;
&lt;p&gt;One hour of video will cost $5 to the Kickstarter supporters. After that, the price will go up to $12. This is a very good value for one hour of instructional video. There is also a company sponsorship level. See the &lt;a href=&quot;http://www.kickstarter.com/projects/376627045/lispcast-introduction-to-clojure-videos&quot;&gt;Kickstarter page&lt;/a&gt; for more details. The project ends March 14, 2013.&lt;/p&gt;
&lt;p&gt;Please support the project and let other people know.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/screencasts"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Separation, Abstraction, and Cascading in CSS</title>
                  <guid isPermalink="false">http://www.lispcast.com/cascading-separation-abstraction</guid>
                  <link>http://www.lispcast.com/cascading-separation-abstraction</link>
                  <pubDate>Sat 29 Dec 2012 12:29:33 AM CST</pubDate>
                  <description>
                    LESS and Sass (and similar solutions) have saved CSS for three reasons: separation, abstraction, and cascading. While I welcome them, CSS still has other problems which I believe can be solved.

                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/cascading-separation-abstraction"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Case Against Curly Quotes</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-case-against-curly-quotes</guid>
                  <link>http://www.lispcast.com/the-case-against-curly-quotes</link>
                  <pubDate>Mon 05 Nov 2012 01:52:46 PM CST</pubDate>
                  <description>
                    
&lt;p&gt;A lot of web software converts ASCII single- and double-quote characters into special, non-ASCII open and close versions. These are sometimes referred to as &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Quotation_mark_glyphs&quot;&gt;smart quotes&lt;/a&gt;&amp;quot;. Their less intelligent ASCII equivalents are &amp;quot;dumb quotes&amp;quot;. Smart quotes undoubtedly look better.&lt;/p&gt;
&lt;p&gt;Here is an example.&lt;/p&gt;
&lt;p&gt;&amp;quot;Some text&amp;quot; becomes “Some text”.&lt;/p&gt;
&lt;p&gt;Very pretty, no? There is no smart quote key on your keyboard, so in order to make them, your software will convert them automagically. I say &amp;quot;automagically&amp;quot; because they are often converted incorrectly. There are no simple rules to convert them correctly.&lt;/p&gt;
&lt;p&gt;I used to upgrade my dumb quotes to smart, but a couple of years ago I decided against it. Although I would like to have prettier quotes, they annoy me on other people's sites, even when they are correctly chosen.&lt;/p&gt;
&lt;p&gt;Specifically, they &lt;a href=&quot;http://stackoverflow.com/questions/1088506/smart-quotes-without-breaking-copy-and-paste&quot;&gt;break copy-paste&lt;/a&gt;. When you copy text with smart quotes (and smart apostrophes, smart dashes, and other smart characters), you get crap in your text. I like copy-paste and I do not want it broken on my site. In fact, I would love it if the world stopped using smart quotes.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-case-against-curly-quotes"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Google Common Lisp Style Guide</title>
                  <guid isPermalink="false">http://www.lispcast.com/google-common-lisp-style-guide</guid>
                  <link>https://google-styleguide.googlecode.com/svn/trunk/lispguide.xml</link>
                  <pubDate>Thu 11 Oct 2012 12:06:36 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;In April 2011, Google acquired ITA Software. ITA provides airline flight search for several of the major companies. The interesting thing is that ITA's search engine was written in Common Lisp.&lt;/p&gt;
&lt;p&gt;This style guide shows that Google is adopting the existing Lisp code base instead of rewriting it. Not so surprising since the code is, from what I have heard, well-engineered. But a bit surprising since Google chose Python over Lisp some time ago. Peter Norvig explains the choice a bit on &lt;a href=&quot;http://www.youtube.com/watch?v=hE7k0_9k0VA#t=03m20s&quot;&gt;Reddit&lt;/a&gt; and &lt;a href=&quot;http://news.ycombinator.com/item?id=1803815&quot;&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition, it also shows that Google is affecting ITA with its culture, to some degree. Google uses this format for &lt;a href=&quot;https://google-styleguide.googlecode.com/svn/trunk/&quot;&gt;all of its style guides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I love style guides!&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/google-common-lisp-style-guide"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure/ClojureScript: One Language to Rule the Web</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-clojurescript-one-language-to-rule-the-web</guid>
                  <link>https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3242</link>
                  <pubDate>Thu 11 Oct 2012 11:34:53 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Nice intro to Clojurescript.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-clojurescript-one-language-to-rule-the-web"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Static vs. Dynamic Typing</title>
                  <guid isPermalink="false">http://www.lispcast.com/static-vs-dynamic-typing</guid>
                  <link>http://www.lispcast.com/static-vs-dynamic-typing</link>
                  <pubDate>Fri 05 Oct 2012 05:13:06 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I was reading &lt;a href=&quot;http://programmers.stackexchange.com/questions/167305/what-functionality-does-dynamic-typing-allow&quot;&gt;this question&lt;/a&gt; on Stack Exchange asking what is possible in a dynamically typed language that is impossible in a statically typed language. Most of the responses were terrible. It reminded me that &lt;strong&gt;the level of discussion surrounding the topic of types in general is very disappointing.&lt;/strong&gt; Basically, most people do not know what they are talking about.&lt;/p&gt;
&lt;p&gt;Luckily, one of the answerers posted a link to &lt;a href=&quot;http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html&quot;&gt;this post about debating type systems&lt;/a&gt;. I had never read it before and I am glad I have, now.&lt;/p&gt;
&lt;p&gt;The author takes the approach of describing how people generally use typing terms as opposed to prescribing a definition. His main point is that the terms are generally misunderstood so much that trying to discuss them is not productive. &lt;strong&gt;There is no agreed-upon definition in most contexts.&lt;/strong&gt; I agree. I wish it were not the case, though.&lt;/p&gt;
&lt;p&gt;But there was also another gem in the article.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dynamic and static type systems are two completely different things, whose goals happen to partially overlap.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think this point is right on. Static type checking is only one possible form of static analysis. And the goal of static analysis is to detect errors as soon as possible. Dynamic typing is used more to perform dynamic type dispatch (that is, runtime polymorphism). Because they have such different goals, why are we even comparing them?&lt;/p&gt;
&lt;p&gt;I think a lot of it is C++'s fault. C++ took the idea of Classes and inheritance from OOP and conflated them into static types. But I'm not an expert. Maybe someone did that before C++. By the way, this is probably 90% of why people hate static typing. When static typing prevents something useful (like &lt;a href=&quot;http://en.wikipedia.org/wiki/Duck_typing&quot;&gt;duck typing&lt;/a&gt;) but does not present an alternative to that use, you wish you did not have static typing.&lt;/p&gt;
&lt;p&gt;The real point is that &lt;strong&gt;static typing and dynamic typing are not inherently mutually exclusive&lt;/strong&gt;. For instance, Java has static and dynamic typing. That is, you can ask for the type of an object at runtime, and the types of variables are checked at compile time. Clojure has some form of static analysis (no static type analysis) and inherits the runtime types from Java.&lt;/p&gt;
&lt;p&gt;The question &amp;quot;which is a subset of the other?&amp;quot; is actually meaningless. &lt;strong&gt;But the question &amp;quot;if you had to choose a language that only had one, then add the other to it, which would you pick?&amp;quot; is becoming increasingly relevant.&lt;/strong&gt; &lt;a href=&quot;http://www.lispcast.com/deferring-type-errors-to-runtime&quot;&gt;Haskell recently added what some consider to be dynamic typing behavior (throwing type errors at runtime instead of at compile time).&lt;/a&gt; &lt;a href=&quot;http://us4.campaign-archive2.com/?u=a33b5228d1b5bf2e0c68a83f4&amp;amp;id=c43c157edd&quot;&gt;And people are working on static type systems for Clojure.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do not think that this is a subjective question. I think it has one possible answer in the general case. And I would like to present the argument to open up the discussion. I will use Haskell (with the most advanced static type system in the world) and Clojure (it is comparable to Haskell and dynamically typed).&lt;/p&gt;
&lt;p&gt;In Clojure, type information is purely informational. It does have Java's inheritance hierarchy, but that is a mere legacy to interoperate with Java. The important part of Clojure is that every value has a type and the program can know the type at runtime. This could be considered the minimal possible dynamic type system: present types at runtime and defer to the program to do what it wishes with them. &lt;strong&gt;The semantics of evaluation are independent of the type system.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In Haskell, type information exists only at compile time. That is, the compiler figures out the type of everything, decides whether to allow the program, then compiles it (if it is allowed). &lt;strong&gt;Types are complected with semantics.&lt;/strong&gt; Types determine what code is run. Further, because the type checker has to be able to infer all types, the language has been limited to the subset of possible programs that are checkable. The semantics of the language are limited by the type system.&lt;/p&gt;
&lt;p&gt;So what we have is a semantics that is independent of types (Clojure) which we can augment with different static type analyses and potentially catch errors, or we have a language that has already compromised its semantics to the type system and add runtime type annotations, which are effectively useless.&lt;/p&gt;
&lt;p&gt;Just one last word: I am not a dynamic typing zealot. I use Haskell more than Clojure. And I am very excited to see static analysis come to Clojure. However, the static typing crowd seems to have the rhetorical upper hand at the moment. I just want to have better discussions.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/static-vs-dynamic-typing"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Impedance Mismatch is Our Fault</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-impedance-mismatch-is-our-fault</guid>
                  <link>http://www.infoq.com/presentations/Impedance-Mismatch</link>
                  <pubDate>Fri 05 Oct 2012 01:43:26 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Stuart Halloway continues the world-round campaign of iconoclastic and well-argumented presentations that spring from Clojure's programming model and now Datomic's architecture. Stuart gives hard-hitting, reasoned practices that make our software better in measurable ways.&lt;/p&gt;
&lt;p&gt;This is just one of the many ways Clojure is having (and will have) a huge impact on programming in any language. Immutable data by default is obvious. A model of time, while not so obvious, will seem like manual memory management does now. Sure, you can work with it, but who would give up garbage collection? Similarly, having a better model of state change (transactional or otherwise) enforced by the language will be something we will not want to live without.&lt;/p&gt;
&lt;p&gt;Separating data from code will take years, maybe a generation, to catch on. Our field has drilled the Java model of Object-Orientation into students for years. But the change has already started. Though not being led by Clojure, JSON is now a universal data format accepted by nearly every language, and the fact that the standard does not allow code in JSON is significant.&lt;/p&gt;
&lt;p&gt;But this talk goes a little further and proposes that we think of databases differently. Stuart does a good job of breaking down why OO and RDBMS don't fit well together, and proposes a solution that leaves them both in the dust.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-impedance-mismatch-is-our-fault"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>David Nolen on Clojure's core.logic</title>
                  <guid isPermalink="false">http://www.lispcast.com/david-nolen-on-clojure.core.logic</guid>
                  <link>http://www.youtube.com/watch?v=A7de6pC-tnU</link>
                  <pubDate>Fri 28 Sep 2012 03:47:41 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;A bootleg video of a talk from Strange Loop 2012.&lt;/p&gt;
&lt;p&gt;I do not think the official videos are up yet. For those of us who could not make it to the conference, this is great, even though it was recorded with an iPhone. You can hear Nolen well and see the slides.&lt;/p&gt;
&lt;p&gt;The presentation starts with a short review of how to use &lt;a href=&quot;https://github.com/clojure/core.logic&quot;&gt;core.logic&lt;/a&gt; before Nolen goes into the implementation details. I still need to spend some time understanding the code myself. core.logic is based on miniKanren, described in &lt;a href=&quot;http://www.amazon.com/Reasoned-Schemer-Daniel-P-Friedman/dp/0262562146?tag=lisp0b-20&quot;&gt;&lt;em&gt;The Reasoned Schemer&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Actually, I have just bought a copy of &lt;a href=&quot;http://www.amazon.com/Little-Schemer-Daniel-P-Friedman/dp/0262560992?tag=lisp0b-20&quot;&gt;&lt;em&gt;The Little Schemer&lt;/em&gt;&lt;/a&gt;, the first book in the series of which &lt;a href=&quot;http://www.amazon.com/Reasoned-Schemer-Daniel-P-Friedman/dp/0262562146?tag=lisp0b-20&quot;&gt;&lt;em&gt;The Reasoned Schemer&lt;/em&gt;&lt;/a&gt; is a part. I am trying to catch up on all of these Lisp classics. I will write a review when I am finished, but so far so good.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/david-nolen-on-clojure.core.logic"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>ClojureScript Anatomy</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojurescript-anatomy</guid>
                  <link>http://www.infoq.com/presentations/ClojureScript</link>
                  <pubDate>Thu 27 Sep 2012 10:53:24 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Michael Fogus:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What is the greatest limitation of Haskell's type system? The greatest limitation in Haskell's type system is it only does Haskell's type system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I totally agree. Almost two years of working in Haskell has convinced me of the benefit of static type analysis. It can catch a lot of bugs. But Haskell's type system also increases the amount of code and the surface area of your interface. The types become a point of coupling. They become hard to change without changing everything that uses them.&lt;/p&gt;
&lt;p&gt;This rigidity is where their power comes from, and also their annoyance. Well-chosen types can stabilize a system in a good way. Mistakes in the types, or changes in their requirements, stabilize the system in a bad way.&lt;/p&gt;
&lt;p&gt;I would love to see a type checker that could handle non-discriminated union types (Haskell has discriminated unions, which force you to box and unbox values, adding to code size and coupling to the types). It would be nice to have the type checker say &amp;quot;Function foo takes either a String or a Number, but on line 34 you pass it a String or Number or HashMap.&amp;quot;&lt;/p&gt;
&lt;p&gt;Another type of analysis I would like to see is whether a function is pure, does IO, or accesses mutable state. You can tag all basic IO operations as IO. Then anything that calls one of those operations also gets the tag IO. Similarly for mutable state. Haskell makes IO a type so that it can be statically checked, because Haskell only does type checking. It is not really a type, though, and does not need static type analysis.&lt;/p&gt;
&lt;p&gt;Another great advantage of static checking in a dynamic language is that the definition of functions can change at any time. So function foo could compile, but with a warning that it calls function bar incorrectly. When you correct function bar, the warning goes away automatically.&lt;/p&gt;
&lt;p&gt;Those are some ideas I had watching that video and thinking about static analysis in Clojure. I am quite excited.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojurescript-anatomy"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Douglas Crockford on Javascript</title>
                  <guid isPermalink="false">http://www.lispcast.com/douglas-crockford-amazing</guid>
                  <link>http://www.youtube.com/playlist?list=PL7664379246A246CB&amp;feature=plcp</link>
                  <pubDate>Fri 21 Sep 2012 08:04:47 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;These are amazing. I learned so much about the browser and Javascript that I want to weep for the web.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/douglas-crockford-amazing"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>On the configurations of data and functions</title>
                  <guid isPermalink="false">http://www.lispcast.com/data-reusability</guid>
                  <link>http://www.lispcast.com/data-reusability</link>
                  <pubDate>Fri 21 Sep 2012 07:21:06 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Rich Hickey recently commented (I cannot remember where) that there are a limited number of useful configurations of data. He claimed that the Clojure literal syntax is just about right. The one thing to add to it is the extensibility that we now have with 1.4.&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Part of the context was that we as programmers should be separating data from process. The separation makes our data more reusable. A string is a string in any language. An array is an array. Data is data and should be regarded as such. This allows for much more reuse than object oriented programming ever has. We can see the tremendous success of JSON as a case in point: a well-defined, constrained data language that gets it mostly right.&lt;/p&gt;
&lt;p&gt;But Hickey's point goes a little farther, I think. It is not just data that is reusable, but functions as well. Look at the enormous savings in the amount of code required to get a Swing app running when you use &lt;a href=&quot;https://github.com/daveray/seesaw&quot;&gt;Seesaw&lt;/a&gt;. I am not just talking only about the incessant boilerplate anonymous class declarations Swing forces you to write. I am talking also about the fact that I can use any function to handle an event. I do not need to figure out what class the thing is expecting. Defining a subclass of a single class is inherently non-reusable.&lt;/p&gt;
&lt;p&gt;And it is not just that I don't need to know the class. I can use a function written in a library that has no dependencies on Swing or Seesaw at all. A function is just a function. It is universal and reusable, not because of some well-modeled domain classes, but because it is abstract and applies to no domain in particular.&lt;/p&gt;
&lt;p&gt;While Hickey is working on a universal, extensible data format, who is working on the universal function format?&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;See also &lt;a href=&quot;https://github.com/edn-format/edn&quot;&gt;EDN&lt;/a&gt;&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/data-reusability"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Class AbstractSingletonProxyFactoryBean</title>
                  <guid isPermalink="false">http://www.lispcast.com/class-abstractsingletonproxyfactorybean</guid>
                  <link>http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/aop/framework/AbstractSingletonProxyFactoryBean.html</link>
                  <pubDate>Thu 20 Sep 2012 10:46:17 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;From the docs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Convenient proxy factory bean superclass for proxy factory beans that create only singletons.&lt;/p&gt;
&lt;p&gt;Manages pre- and post-interceptors (references, rather than interceptor names, as in ProxyFactoryBean) and provides consistent interface management.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Good thing this is &amp;quot;convenient&amp;quot;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/class-abstractsingletonproxyfactorybean"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Datomic Architecture and Data Model</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-datomic-architecture-and-data-model</guid>
                  <link>https://vimeo.com/45136212</link>
                  <pubDate>Thu 20 Sep 2012 06:36:36 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Rich Hickey:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is not a schema&lt;em&gt;less&lt;/em&gt; system. There's no such thing as a schema&lt;em&gt;less&lt;/em&gt; system. There are systems where you write your schema down and ones where you don't. There's no such thing as a schemaless database. So we do require you to be explicit about this part of your database.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The issue is not whether a database needs an explicit schema. The issue is whether the language you write down your schema in can express the data model you would like to use.&lt;/p&gt;
&lt;p&gt;That said, the &lt;a href=&quot;http://docs.datomic.com/schema.html&quot;&gt;Datomic schemas&lt;/a&gt;, along with the &amp;quot;datom&amp;quot; model, do look expressive.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-datomic-architecture-and-data-model"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The DCI Architecture: Lean and Agile at the Code Level</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-dci-architecture-lean-and-agile-at-the-code-level</guid>
                  <link>http://www.infoq.com/presentations/The-DCI-Architecture</link>
                  <pubDate>Thu 20 Sep 2012 01:59:10 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;James Coplien's criticism of Java (that it cannot do proper object-oriented programming) is my essential criticism of static languages in general: &lt;em&gt;what if the model of programs that your language enforces does not allow you to program well?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Coplien describes a style of programming that, although not especially encouraged by Smalltalk, was at least possible as an architectural convention. And listening to Alan Kay, I get the impression that the early Smalltalk group was programming with a concept like Roles in mind, though there was no explicit construct for it in the language.&lt;/p&gt;
&lt;p&gt;That concept was what we now refer to as &amp;quot;duck typing&amp;quot;. To fulfill a &amp;quot;methodful role&amp;quot;, you simply needed to have all of the required methods defined.&lt;/p&gt;
&lt;p&gt;Now, how would Clojure handle DCI? Well, quite naturally, actually. There are three building block concepts in DCI described in the video, each with a terrible name.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;Classes (data)&lt;/li&gt;
&lt;li&gt;Methodful Roles (interfaces)&lt;/li&gt;
&lt;li&gt;Methodless Roles (variables)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In Clojure, &amp;quot;classes&amp;quot; are simply data, perhaps validated to conform to a schema, perhaps wrapped in a &lt;code&gt;ref&lt;/code&gt; to get state. &amp;quot;Methodful roles&amp;quot; are groups of functions that can operate on data. If you're feeling frisky, you can use protocols. &amp;quot;Methodless roles&amp;quot; are variables in your program, each assigned to the data which will play that role.&lt;/p&gt;
&lt;p&gt;Let's look at the main example in Clojure.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; money source role: debit and balance
(defn debit [source amount]
  (update-in source [:balance] #(- % amount)))

(defn balance [source]
  (:balance source))

;; money destination role: credit
(defn credit [dest amount]
    (update-in dest [:balance] #(+ % amount)))

;; the use case for doing a transfer    
(defn transfer [amount source destination]
  (dosync
    (when (&amp;lt; (balance @source) amount)
      (throw (ex-info &amp;quot;Insufficient funds.&amp;quot; {:account @source :amount amount})))
    (alter   source       debit amount) ;; debiting is not commutative if we check balance
    (commute destination credit amount)))

;; our two accounts
(def savings  (ref {:balance 1000}))
(def checking (ref {:balance 25}))

;; we can transfer 20 bucks from savings to checking
(transfer 20 savings checking)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I wrote this just to make sure I was not kidding myself that &amp;quot;DCI&amp;quot; is dead-obvious if your language does not get in the way. Object-oriented conventions today make this complicated enough that you need to read books on it to understand. How many files would you need to write in Java to do this?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;MoneySource interface&lt;/li&gt;
&lt;li&gt;MondeyDestination interface&lt;/li&gt;
&lt;li&gt;Transfer Use Case&lt;/li&gt;
&lt;li&gt;Account Class (or two, depending on the differences between savings and checking)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you can modify the account class(es) to implement the interfaces, you should be ok with those files. But if you can't, you'll have to use the &amp;quot;Bridge&amp;quot; pattern that I learned in school. Basically, you make a new class for each combination of class and interface. So you would have SavingsAccountMoneySource, SavingsAccountMoneyDestination, CheckingAccountMoneySource, and CheckingAccountMoneyDestination. And OOP was supposed to need less code!&lt;/p&gt;
&lt;p&gt;This video tells me that object-oriented programming as it is taught today has been going way down the wrong track. The lessons the static object-oriented languages have learned from the dynamic ones are the wrong lessons. Duck typing allowed programmers to elegantly implement these ideas without restrictions from the compiler. And inheritance was about reuse more than subtyping. Modern OO style takes and does not give back.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-dci-architecture-lean-and-agile-at-the-code-level"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Deferring Type Errors to Runtime</title>
                  <guid isPermalink="false">http://www.lispcast.com/deferring-type-errors-to-runtime</guid>
                  <link>http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/defer-type-errors.html</link>
                  <pubDate>Fri 07 Sep 2012 06:23:40 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Haskell just got a whole lot more useful for prototyping. One of my biggest gripes with Haskell was how much code had to be changed if a single type was altered&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, since the compiler was always looking for consistent types. There were ways to work around it&lt;sup&gt;&lt;a href=&quot;#fn2&quot; class=&quot;footnoteRef&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, but they were always tedious and unsatisfactory.&lt;/p&gt;
&lt;p&gt;This new development in 7.6 lets you compile and run the code, changing type signatures many times, before you have to propagate the change through the rest of the code.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;This is the classical definition of tight coupling. That's right: static typing introduces coupling.&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot;&gt;&lt;p&gt;How to do it? Never change a type signature. Instead, create a new name with the same value, and modify that. Then, when it has settled into its permanent type signature, rename it to the old name, recompile, and let the error messages guide you.&lt;a href=&quot;#fnref2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/deferring-type-errors-to-runtime"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Wat</title>
                  <guid isPermalink="false">http://www.lispcast.com/wat</guid>
                  <link>https://github.com/manuel/wat-js</link>
                  <pubDate>Fri 07 Sep 2012 07:52:03 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;A Lisp written in Javascript with first-class environments and first-class continuations. The README claims it starts in 50ms on modern browsers. Looks interesting.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/wat"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Liberator</title>
                  <guid isPermalink="false">http://www.lispcast.com/liberator</guid>
                  <link>http://clojure-liberator.github.com/</link>
                  <pubDate>Thu 06 Sep 2012 12:56:02 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Writing HTTP compliant servers is hard in any language. There is a lot to do for each request: content type negotiation, handling the wide variety of problems with requests, and the rest of the HTTP spec goodness. Usually, we just ignore it and simplify down to three types of responses: 200 Ok and 404 Not Found and 500 Server Error. There is a lot more to the spec than this, but it often costs more to implement it correctly than to stick with this limited set of statuses.&lt;/p&gt;
&lt;p&gt;Liberator looks like it might have found the leverage point between navigating the essential complexity of HTTP and managing the requirements of your server.&lt;/p&gt;
&lt;p&gt;Two things look promising:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;&lt;p&gt;There seems to be a lot of potential for reuse. That means you can&lt;br /&gt; decide server-wide policies instead of per-handler policies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Behavior can change incrementally. You can still get up and running&lt;br /&gt; using the defaults and adapt the server's behavior to suit the problem&lt;br /&gt; later.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I look forward to trying it out.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/liberator"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why should I have written ZeroMQ in C, not C++ (part II)</title>
                  <guid isPermalink="false">http://www.lispcast.com/why-should-i-have-written-zeromq-in-c</guid>
                  <link>http://www.250bpm.com/blog:8</link>
                  <pubDate>Thu 30 Aug 2012 01:45:04 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;In this post, Martin Sústrik makes a point about the performance of C compared to C++ (C++ is slower than C). While the performance point is valid, he makes some strong, dubious statements about Object-orientation and procedural programming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Object-orientedness is after all just a syntactic sugar on the top of procedural language, making the code more understandable to the human brain which seems to have evolved natural ability to deal with objects at the expense of dealing with entities such as flows, relations etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Object-orientation is more than just syntactic sugar. OO uses message passing as its computational semantic, while procedural programming uses procedure calls.&lt;/p&gt;
&lt;p&gt;He then goes on to describe a scheme where one class can define fields in another class that only it can access, which he calls &amp;quot;private in X&amp;quot;. In this way, you can define a list which stores its pointers in the same memory as items of the list which still encapsulates the concerns.&lt;/p&gt;
&lt;p&gt;The benefit of OO is that by separating out concerns, you achieve more reuse. You write one list class and one person class, and now you can share persons in different lists. The problem with Sústrik's proposal is that it only allows for an item to be in one list at a time (or you have to write a new list class for every list you want them to be in). This is not Object-oriented. It is merely yet another feature bolted onto C++.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/why-should-i-have-written-zeromq-in-c"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Monads in Pictures</title>
                  <guid isPermalink="false">http://www.lispcast.com/monads-in-pictures</guid>
                  <link>http://newartisans.com/2012/08/monads-in-pictures/</link>
                  <pubDate>Wed 22 Aug 2012 12:29:57 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Monads are not hard. But they are entirely abstract, and that makes them hard to grasp. Just as it requires a whole year of Algebra to accept that you can do math with letters instead of numbers, Monads usually defy written explanation.&lt;/p&gt;
&lt;p&gt;In this post, John Wiegly does a good job of explaining how Monads work with pictures. The visual explanation is slightly better than words. I think, though, that it just takes time, practice, and patience to build the necessary abstraction structures in your brain.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/monads-in-pictures"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Faith, Evolution, and Programming Languages</title>
                  <guid isPermalink="false">http://www.lispcast.com/faith-evolution-and-programming-languages</guid>
                  <link>http://www.infoq.com/presentations/Faith-Evolution-Programming-Languages</link>
                  <pubDate>Tue 21 Aug 2012 12:24:48 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Philip Wadler explains the relationship between logic and programming, why everything is discovered twice, and what a programming language in an alternate universe might look like. (Hint: it's lambda calculus).&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/faith-evolution-and-programming-languages"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Dynamic Languages Wizards Series - Panel on Language Design</title>
                  <guid isPermalink="false">http://www.lispcast.com/dynamic-languages-wizards-series</guid>
                  <link>http://www.youtube.com/watch?v=agw-wlHGi0E</link>
                  <pubDate>Mon 20 Aug 2012 10:23:31 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Cool talk on programming languages from 2001 featuring Paul Graham, John Maeda, Jonathan Reeves, and Guy Steele.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/dynamic-languages-wizards-series"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Introducing playnice</title>
                  <guid isPermalink="false">http://www.lispcast.com/introducing-playnice</guid>
                  <link>http://www.lispcast.com/introducing-playnice</link>
                  <pubDate>Mon 20 Aug 2012 06:24:30 PM CDT</pubDate>
                  <description>
                    
&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Today I am happy to announce &lt;a href=&quot;https://github.com/ericnormand/playnice&quot;&gt;&lt;code&gt;playnice&lt;/code&gt;&lt;/a&gt;, a Clojure library of tools to help build HTTP standards compliant servers.&lt;/p&gt;
&lt;p&gt;Existing libraries for developing web services focus mainly on ease. They try to make it easy to get started. They implement a naive, yet functional, version of the HTTP spec. It is basically the simplified understanding of HTTP that we all think in. A client makes requests to URLs, and the server responds with either an error or content.&lt;/p&gt;
&lt;p&gt;But the HTTP spec is more complete than merely matching URLs and methods. There are many error classes defined in the spec and much functionality dealing with the meta-level of the capabilities of the server itself. In addition, there are many &lt;em&gt;de facto&lt;/em&gt; standards and workarounds that should be baked into the server.&lt;/p&gt;
&lt;h3 id=&quot;philosophy&quot;&gt;Philosophy&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;Make it easier to serve HTTP standard responses without confounding HTTP logic with business logic.&lt;/li&gt;
&lt;li&gt;Make it easier for limited or non-standard clients to access resources.&lt;/li&gt;
&lt;li&gt;As much as possible separate orthogonal functionality into composable chunks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;playnice&lt;/code&gt; was named because it plays nice with others. The Web is a wide world, and there are lots of clients out there. You should follow the spec as closely as possible, but accept that not all clients are so strict. Also, there is a variety of input and output formats. You should play nice with them, if you can. &lt;code&gt;playnice&lt;/code&gt; is a library to help Clojure programs play nice with the rest of the web.&lt;/p&gt;
&lt;h3 id=&quot;playnice-opinions&quot;&gt;&lt;code&gt;playnice&lt;/code&gt; Opinions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;URL first, method second.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;HTTP is about resources, which are identified by URLs. Different resources accept different methods. If a GET at a URL responds 200, but a POST is not supported, a 405 should be returned, not a 404.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Routes are values that do not exist in the global namespace.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Routes are immutable and first-class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;The order of defining routes should not matter.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Reordering my routes should not change the behavior of my server. Routes are declarative.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Servers should support the OPTIONS method and correct handling of unsupported methods.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;OPTIONS returns the methods that are defined for a given URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Servers should support the Accept and Content-type headers of requests.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The handler is the wrong place to parse the Content-type header to figure out what kind of data you have been given. &lt;code&gt;playnice&lt;/code&gt; currently supports HTML, JSON, TXT, and Clojure literals. I hope to have XML soon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Servers should support &lt;em&gt;de facto&lt;/em&gt; standards and common workarounds.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;Redirecting after form post&amp;quot; is a &lt;em&gt;de facto&lt;/em&gt; standard for browsers. IE does not support DELETE method in AJAX, so the workaround is to do a POST with a special query parameter set to DELETE.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;status&quot;&gt;Status&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;playnice&lt;/code&gt; is still in early development, but it already contains the following components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route + method dispatch (replacing Compojure).&lt;/li&gt;
&lt;li&gt;Middleware for abstracting away input and output formats.&lt;/li&gt;
&lt;li&gt;Middleware for handling &amp;quot;redirect after form post&amp;quot;.&lt;/li&gt;
&lt;li&gt;Middleware for working around browser limitations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please check out &lt;a href=&quot;https://github.com/ericnormand/playnice&quot;&gt;&lt;code&gt;playnice&lt;/code&gt;&lt;/a&gt; if you need an HTTP compliant web server.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/introducing-playnice"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>I remember the time before monads</title>
                  <guid isPermalink="false">http://www.lispcast.com/I-remember-the-time-before-monads</guid>
                  <link>http://www.free-variable.org/2012/08/i-remember-the-time-before-monads/</link>
                  <pubDate>Fri 17 Aug 2012 07:07:10 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Paul Callaghan:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Callaghan’s 1st Law: the need for mutable state in a language is inversely proportional to its flexibility in manipulating data&lt;/p&gt;
&lt;p&gt;Put another way, mutable state is a lower-level idea and becomes less important when your language supports higher-level ways of working.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Agreed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Experienced Haskell programmers know that the type system is a tool for getting work done, and a great language for playing with designs, and they exploit these aspects to help them get their work done.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The key word in the sentence above is &amp;quot;Experienced&amp;quot;. It does take a long time to begin using the type system to your advantage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was however a time of exploration, when researchers explored various ideas to find a good way of both having our cake and eating it. Monads are one of the solutions they found, and essentially gave us a small but flexible API for working with “computations” (like IO operations or state modifications, or various combinations thereof) as opposed to simple data values, and did so elegantly &lt;em&gt;within&lt;/em&gt; the standard langage (ie. no ad hoc extensions needed). It got even better when syntactic sugar was added.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nice history lesson.&lt;/p&gt;
&lt;p&gt;The piece ends with some good advice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a new explorer (very warm welcome, by the way!), when you look at Haskell material you may see some very unusual or scary-looking stuff. But do bear in mind that a lot of it is just playing around with abstractions on top of the core language, and probably does translate to something more intelligible. Try to work out what is being said about the data being manipulated, and then it might not look so bad.&lt;/p&gt;
&lt;/blockquote&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/I-remember-the-time-before-monads"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Light Table reaches 0.1.0</title>
                  <guid isPermalink="false">http://www.lispcast.com/light-table-reaches-1.0</guid>
                  <link>http://www.chris-granger.com/2012/08/17/light-table-reaches-010/</link>
                  <pubDate>Fri 17 Aug 2012 06:55:50 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Chris Granger:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Clojure now has a true double click experience for getting started.&lt;/p&gt;
&lt;/blockquote&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/light-table-reaches-1.0"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How The JVM Spec Came To Be</title>
                  <guid isPermalink="false">http://www.lispcast.com/how-the-jvm-spec-came-to-be</guid>
                  <link>http://www.infoq.com/presentations/gosling-jvm-lang-summit-keynote</link>
                  <pubDate>Fri 17 Aug 2012 02:32:57 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;James Gosling speaking about what influenced the JVM. Fascinating. The world was a different place, then. And the amount of optimization that the JVM does is truly impressive.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/how-the-jvm-spec-came-to-be"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>JSON and Algebraic Data Types</title>
                  <guid isPermalink="false">http://www.lispcast.com/json-and-adt</guid>
                  <link>http://www.lispcast.com/json-and-adt</link>
                  <pubDate>Thu 16 Aug 2012 05:01:41 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I recently wrote about the &lt;a href=&quot;http://www.lispcast.com/yahoos-doug-crockford-on-javascript&quot;&gt;birth of JSON&lt;/a&gt;, which describes how JSON came to be and the story of its success. Crawford talks about how JSON (or a very close equivalent) was reinvented several times throughout the years.&lt;/p&gt;
&lt;p&gt;What strikes me is that JSON turned out to be an &lt;a href=&quot;http://en.wikipedia.org/wiki/Algebraic_data_type&quot;&gt;Algrebraic Data Type&lt;/a&gt; (ADT). Specifically, it is a tagged union.&lt;/p&gt;
&lt;p&gt;JSON ADT variants:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;Null&lt;/li&gt;
&lt;li&gt;Boolean&lt;/li&gt;
&lt;li&gt;Number&lt;/li&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;List&lt;/li&gt;
&lt;li&gt;Dictionary&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these six constructors, you can make all of JSON.&lt;/p&gt;
&lt;p&gt;It's interesting because JSON is a point of intersection between Javascript and Haskell. Javascript is very dynamic, with a very weak sense of type. Haskell has strong typing. On close analysis, JSON is statically and strongly typed. In fact, JSON &lt;em&gt;is&lt;/em&gt; a type.&lt;/p&gt;
&lt;p&gt;Could its ADT nature be one of the secrets to JSON's success?&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/json-and-adt"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Notes from the Mystery Machine Bus</title>
                  <guid isPermalink="false">http://www.lispcast.com/notes-from-the-mystery-machine-bus</guid>
                  <link>https://plus.google.com/u/0/110981030061712822816/posts/KaSKeg4vQtz</link>
                  <pubDate>Tue 14 Aug 2012 10:38:18 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Steve Yegge:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Software engineering has its own political axis, ranging from conservative to liberal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Steve, I am so often with you. Typically, you write stuff that is very concrete and easy to agree with. In fact, I agree with most of what you have written in your very long rants.&lt;/p&gt;
&lt;p&gt;But this, I am afraid, is bullshit. Not right, not wrong, just &lt;em&gt;bullshit&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I was giving you the benefit of the doubt until I read your list of categorized features, either conservative or liberal. That list made absolutely no objective sense. &lt;strong&gt;There is not one shred of a good idea in the dichotomy you gave.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The dichotomy conflates so many different dichotomies into a single one in the name of clarifying a terrible mess. In that way, it makes the same mistake as classifying people into conservative and liberal does. It does not help explain anything. And &lt;strong&gt;it only creates more fighting by arming people with names to call each other&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Which is more &amp;quot;liberal&amp;quot;, Common Lisp or C? Common Lisp protects against the most common types of C errors: memory leaks and buffer overflows. Does that make Common Lisp more conservative because it protects the programmer from errors? But C has compile-time type checks! And &amp;quot;conservative&amp;quot; syntax! Bullshit!&lt;/p&gt;
&lt;p&gt;But then came the clincher. When you said that Clojure was a conservative language, &lt;strong&gt;I came up with something which may actually have some merit: how &lt;em&gt;opinionated&lt;/em&gt; the language is&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Clojure is strongly opinionated. So is Python. So is Haskell.&lt;/p&gt;
&lt;p&gt;Clojure's opinions: state changes should be explicit, values should be immutable, functions should be separated from data, etc.&lt;/p&gt;
&lt;p&gt;Python's opinion: code should be well-indented.&lt;/p&gt;
&lt;p&gt;Haskell's opinions: functions should be pure, types should be consistent.&lt;/p&gt;
&lt;p&gt;These languages may appear conservative because, in their respective worlds, &lt;strong&gt;the opinions are solidified into laws and imposed on the programmer&lt;/strong&gt;. Python does not allow you to write unindented code. Haskell does not allow you to write programs with inconsistent types. You cannot mutate a Clojure map.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perhaps, Steve, you mean to say that you don't like when a programming language's opinion is imposed on the programmer?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I personally like some laws and dislike others. For instance, Clojure's immutability is great. &lt;strong&gt;It's not just great because it's possible. It's great because it is enforced.&lt;/strong&gt; Nothing can change my values--not me, not you, not anyone! And I like Haskell's type system in production but not during development. I like that my program is guaranteed to have consistent types on production. But in development, I'd rather run it and debug it (for some definition of &amp;quot;run&amp;quot; for a type-inconsistent Haskell program).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you say it like that, it ceases to be bullshit.&lt;/strong&gt; And then we can get back into a discussion. Question: Which features should be imposed on the programmer and which should not? Discuss.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/notes-from-the-mystery-machine-bus"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Value of Values</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-value-of-values</guid>
                  <link>http://www.infoq.com/presentations/Value-Values</link>
                  <pubDate>Tue 14 Aug 2012 10:17:36 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Rich Hickey is a force of nature. The mark he will leave on programming will reach much farther than the Clojure programming language. The agenda he is setting forth will have as much impact on the notion of state as McCarthy conditionals had on structured programming.&lt;/p&gt;
&lt;p&gt;Please listen closely. The main idea of this talk goes far deeper than &amp;quot;immutable good, mutable bad&amp;quot;.&lt;/p&gt;
&lt;p&gt;It is wonderful to be a part of this.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-value-of-values"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Extreme Cleverness: Functional Data Structures in Scala</title>
                  <guid isPermalink="false">http://www.lispcast.com/extreme-cleverness-functional-data-structures-in-scala</guid>
                  <link>http://www.infoq.com/presentations/Functional-Data-Structures-in-Scala</link>
                  <pubDate>Fri 10 Aug 2012 07:18:58 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;According to Daniel Spiewak, Clojure's vec requires, in the worst case, 7 array accesses and 14 bit operations.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On really large datasets--this just astonished me when I discovered it--on really large datasets this data structure [&lt;em&gt;Clojure vec&lt;/em&gt;] beats java.util.ArrayList for lookup. It beats java.util.ArrayList for datasets that are in the 2 billion range. That is incredibly fast. java.util.ArrayList is an array, right? And we're beating an array.&lt;/p&gt;
&lt;/blockquote&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/extreme-cleverness-functional-data-structures-in-scala"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>My Own URL Shortener</title>
                  <guid isPermalink="false">http://www.lispcast.com/my-own-url-shortener</guid>
                  <link>http://www.windley.com/archives/2012/07/my_own_url_shortener.shtml</link>
                  <pubDate>Mon 30 Jul 2012 04:09:55 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Phil Windley set up his own URL shortener system. He made it use Apache. It could also work on Amazon S3 (like this very blog). It would be super cheap and virtually maintenance-free. I love it.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/my-own-url-shortener"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>PDF version of Structure and Interpretation of Computer Programs</title>
                  <guid isPermalink="false">http://www.lispcast.com/structure-and-interpretation-pdf</guid>
                  <link>https://github.com/sarabander/sicp-pdf</link>
                  <pubDate>Thu 26 Jul 2012 10:44:48 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Beautifully typeset (with LaTeX). The only issue is that PDF pages are not the best way to view code on a screen. Code should scroll continuously. For that, I would still recommend the &lt;a href=&quot;http://mitpress.mit.edu/sicp/&quot;&gt;HTML version&lt;/a&gt;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/structure-and-interpretation-pdf"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Knockbox, an Eventual Consistency Toolkit</title>
                  <guid isPermalink="false">http://www.lispcast.com/knockbox-an-eventual-consistency-toolkit</guid>
                  <link>http://www.infoq.com/presentations/Knockbox-an-Eventual-Consistency-Toolkit</link>
                  <pubDate>Tue 24 Jul 2012 02:43:21 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I originally dismissed &lt;a href=&quot;https://github.com/reiddraper/knockbox&quot;&gt;Knockbox&lt;/a&gt; as yet another concurrency paradigm for Clojure. But after watching this lecture by its creator, I have changed my mind. The few use cases he gives are enough to convince me that I may someday use it, if only to give a bit of structure to edit conflict resolution.&lt;/p&gt;
&lt;p&gt;It appears to follow the Clojure library trend and implements work from a &lt;a href=&quot;http://hal.archives-ouvertes.fr/inria-00555588/&quot;&gt;published academic paper&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I will keep it in mind when I want lock-free eventual consistency.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/knockbox-an-eventual-consistency-toolkit"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Building User Interfaces with Seesaw</title>
                  <guid isPermalink="false">http://www.lispcast.com/building-user-interfaces-with-seesaw</guid>
                  <link>http://www.infoq.com/presentations/Building-User-Interfaces-with-Seesaw</link>
                  <pubDate>Tue 24 Jul 2012 10:04:08 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;&lt;a href=&quot;https://github.com/daveray/seesaw&quot;&gt;Seesaw&lt;/a&gt; represents the best of Clojure: a monstrous Java library tamed to be pleasant and docile.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/building-user-interfaces-with-seesaw"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>2012 State of Clojure survey</title>
                  <guid isPermalink="false">http://www.lispcast.com/state-of-clojure-2012</guid>
                  <link>http://cemerick.com/2012/07/19/2012-state-of-clojure-survey/</link>
                  <pubDate>Tue 24 Jul 2012 09:39:53 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Chas Emerick is at it again. Please fill in the survey if you have ever been exposed to Clojure. This is the third year that cemerick has conducted the survey. He does a great job at summarizing the data with nice graphs. Have a look at the &lt;a href=&quot;http://cemerick.com/2011/07/11/results-of-the-2011-state-of-clojure-survey/&quot;&gt;2011&lt;/a&gt; and &lt;a href=&quot;http://cemerick.com/2010/06/07/results-from-the-state-of-clojure-summer-2010-survey/&quot;&gt;2010&lt;/a&gt; survey results. The survey is useful to the entire community. Please participate.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/state-of-clojure-2012"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Unbreakable Crypto</title>
                  <guid isPermalink="false">http://www.lispcast.com/unbreakable-crypto</guid>
                  <link>http://www.extremetech.com/extreme/133067-unbreakable-crypto-store-a-30-character-password-in-your-brains-subconscious-memory</link>
                  <pubDate>Thu 19 Jul 2012 10:48:01 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Good to see someone innovating on user authentication. Username + password is old as dirt.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/unbreakable-crypto"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Your Coding Philosophies are Irrelevant</title>
                  <guid isPermalink="false">http://www.lispcast.com/your-coding-philosophies-are-irrelevant</guid>
                  <link>http://prog21.dadgum.com/142.html</link>
                  <pubDate>Fri 15 Jun 2012 11:54:28 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;James Hague:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now imagine there are two finished apps that solve roughly identical problems. One is enjoyable to use and popular and making a lot of money. The other just doesn't feel right in a difficult to define way. One of these apps follows all of your development ideals, but which app is it? What if the successful product is riddled with singletons, doesn't check result codes after allocating memory (but the sizes of these allocations are such that failures only occur in pathological cases), and the authors don't know about test-driven development?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Imagine two pieces of medical equipment. One is easy to use, easy to clean, and always reliable. The other is buggy, has lots of crevices and corner which seem to collect infected goo, and needs constant maintenance. One of these apps was created by a rigorous design process, extensive testing, and built in an immaculate, air-conditioned factory manned by attractive MD/PhDs. The other was created in a basement from spare parts by a high school dropout with bad hygiene. What if the beautiful machine was created by the dropout?&lt;/p&gt;
&lt;p&gt;Is it even possible? Is it possible that software can be successful over time if it is not well-built? In my experience, messy software eventually drags new development (including bug fixes) to a halt. Time needs to be invested in cleanup.&lt;/p&gt;
&lt;p&gt;What I hear Hague saying is that some software architecture choices do not matter. This is true. But some do matter. They are not just important to you as a programmer. They are directly related to the number of bugs, the time it takes to fix a bug, and the time it takes to make a new feature. Don't throw the baby out with the bathwater.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/your-coding-philosophies-are-irrelevant"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to answer a question: a simple system</title>
                  <guid isPermalink="false">http://www.lispcast.com/how-to-answer-a-question</guid>
                  <link>http://www.michaelnielsen.org/ddi/how-to-answer-a-question-a-simple-system/</link>
                  <pubDate>Fri 15 Jun 2012 11:31:18 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;&lt;a href=&quot;http://scholarworks.uno.edu/td/877/&quot;&gt;My Master's thesis&lt;/a&gt;&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; was very related to this topic, so I thought I would share a little anecdote.&lt;/p&gt;
&lt;p&gt;Michael Nielsen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As I describe in detail below, their approach was to take the question asked, to rewrite it in the form of a search engine query, or perhaps several queries, and then extract the answer by analysing the Google results for those queries.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While I was researching my thesis, I came across &lt;a href=&quot;http://ilpubs.stanford.edu:8090/421/1/1999-65.pdf&quot;&gt;a paper by Sergey Brin&lt;/a&gt; (cofounder of Google) which described a system called DIPRE which tried to do a similar thing using the Google index, though before Google was Google. My favorite quote from the paper was &amp;quot;the Google search engine and other research projects&amp;quot;. Brin has been aware of the power of huge sets of redundant documents for a long time.&lt;/p&gt;
&lt;p&gt;The system Nielsen describes is interesting and worth a look. I will just nitpick a little.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;Why do so much query rewriting? Google does a lot of query augmentation itself now. Also, a high number of documents means it is very likely to find the question exactly as it was posed. Try asking Google a question and see if you can find the answer on the results page.&lt;/li&gt;
&lt;li&gt;The system does not actually get rid of domain knowledge: it replaces part of the algorithm with a Google search, but there is a lot of domain knowledge of the English language used to extract the data from the text. An implementation of the system would use a simple statistical model of answers to find the text to extract.&lt;/li&gt;
&lt;li&gt;The system of weighting queries is very hard to justify mathematically. Much better would be a probabilistic system, such as Naive Bayes. Naive Bayes is very simple and, modulo a naive assumption, is mathematically correct.&lt;/li&gt;
&lt;li&gt;Be careful with questions like &amp;quot;Who shot JFK?&amp;quot; It is difficult for humans to answer, let alone computers.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;The introduction to my thesis is a pretty good introduction to the techniques of information extraction in general.&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/how-to-answer-a-question"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Idiomatic way to represent sum type (Either a b) in Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/idiomatic-way-to-represent-either</guid>
                  <link>http://stackoverflow.com/questions/10947636/idiomatic-way-to-represent-sum-type-either-a-b-in-clojure/10951001#10951001</link>
                  <pubDate>Wed 13 Jun 2012 10:50:59 PM CDT</pubDate>
                  <description>
                    
&lt;blockquote&gt;
&lt;p&gt;how do you represent sum types, also known as tagged unions and variant records? Something like &lt;code&gt;Either a b&lt;/code&gt; in Haskell or &lt;code&gt;Either[+A, +B]&lt;/code&gt; in Scala.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;Either&lt;/code&gt; has two uses: to return a value of one of two types or to return two values of the same type that should have different semantics based on the tag.&lt;/p&gt;
&lt;p&gt;The first use is only important when using a static type system. &lt;code&gt;Either&lt;/code&gt; is basically the minimum solution possible given the constraints of the Haskell type system. With a dynamic type system, you can return values of any type you want. &lt;code&gt;Either&lt;/code&gt; is not needed.&lt;/p&gt;
&lt;p&gt;The second use &lt;em&gt;is&lt;/em&gt; significant but can be accomplished quite simply in two (or more) ways:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;{:tag :left :value 123} {:tag :right :value &amp;quot;hello&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{:left 123}             {:right &amp;quot;hello&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;What I'd like to ensure, is that :tag is always there, and it can take only one of the specified values, and corresponding value is consistently of the same type/behaviour and cannot be nil, and there is an easy way to see that I took care of all cases in the code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you would like to ensure this statically, Clojure is probably not your language. The reason is simple: expressions do not have types until runtime--until they return a value.&lt;/p&gt;
&lt;p&gt;The reason a macro will not work is that at macro expansion time, you do not have runtime values--and hence runtime types. You have compile-time constructs like symbols, atoms, sexpressions, etc. You can &lt;code&gt;eval&lt;/code&gt; them, but using &lt;code&gt;eval&lt;/code&gt; is considered bad practice for a number of reasons.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/idiomatic-way-to-represent-either"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Programming Languages and Piaget's Stages of Cognitive Development</title>
                  <guid isPermalink="false">http://www.lispcast.com/programming-language-stages-of-development</guid>
                  <link>http://www.lispcast.com/programming-language-stages-of-development</link>
                  <pubDate>Wed 13 Jun 2012 10:12:14 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I rewatched &lt;a href=&quot;http://video.google.com/videoplay?docid=-533537336174204822&quot;&gt;Doing with Images makes Symbols&lt;/a&gt; recently and there was one bit that I had not absorbed before.&lt;/p&gt;
&lt;p&gt;In the talk, he explains the cryptic title. He took a simplified model of &lt;a href=&quot;http://www.simplypsychology.org/piaget.html&quot;&gt;Piaget's Stages of Cognitive Development&lt;/a&gt;: corporal -&amp;gt; visual -&amp;gt; symbolic. He wanted to bring these three stages into relation with each other, so he made a sentence: &amp;quot;Doing with Images makes Symbols&amp;quot;. Doing, of course, is the body stage. Images is the visual stage. And symbols is the abstract symbolic stage.&lt;/p&gt;
&lt;h3 id=&quot;doing&quot;&gt;Doing&lt;/h3&gt;
&lt;p&gt;Imagine the &lt;a href=&quot;http://el.media.mit.edu/logo-foundation/index.html&quot;&gt;Logo programming language&lt;/a&gt;. Logo is perfect for small children because it helps tie the visual and symbolic to their main mode of experience. Young children are primarily focused on their own bodily experience. They have trouble thinking from other points of view. But by translating their own actions (moving around) into symbolic instructions (Logo code), they can &lt;em&gt;see&lt;/em&gt; the turtle performing the actions. Logo's turtle takes on the child's point of view and makes it visual. &lt;strong&gt;The child learns to see his/her own perspective from the outside&lt;/strong&gt;. The coordinate system is egocentric. For example, the &lt;code&gt;FORWARD&lt;/code&gt; command moves the turtle in the direction it is facing.&lt;/p&gt;
&lt;p&gt;Smalltalk includes the same egocentric perspective. Each object has its own perspective of the other objects in the system. Smalltalk objects could ask &amp;quot;who are my neighbors in the list I am in&amp;quot;. Squeak simulates a space that the objects inhabit which includes collision detection. This perspective, I would argue, is one of the unsung benefits of Object-Oriented Programming: the ability to program from the &lt;strong&gt;perspective of a single object at a time&lt;/strong&gt;, freeing your mind from thinking about the inner workings of the rest of the objects. Objects are not just meant to be strung together but can be &amp;quot;embodied&amp;quot; by their programmer who sees from their unique perspective.&lt;/p&gt;
&lt;h3 id=&quot;symbols&quot;&gt;Symbols&lt;/h3&gt;
&lt;p&gt;The other end of the developmental spectrum is the symbolic. The obvious choice for symbolic programming is Lisp. Programs take on a very abstract quality and require advanced programming techniques. In this perspective, the programmer has a god-like, symbolic semantic of the workings of the system and &lt;strong&gt;builds abstractions in a calculus with simple yet powerful rules&lt;/strong&gt;. Further, the programmer manipulates code in code. The coordinate system is abstract and relational. Shapes are manipulated in an abstract representation, not as pixels occupying space. A value may encode abstract knowledge (line between a and b) instead of specific coordinates.&lt;/p&gt;
&lt;h3 id=&quot;images&quot;&gt;Images&lt;/h3&gt;
&lt;p&gt;In the middle is the visual stage. I am going out on a limb, but I would like to posit that Java exemplifies this middle-ground perspective. In this perspective, you think and understand visually. You draw diagrams. &lt;strong&gt;You think in terms of archetypal interactions&lt;/strong&gt; (client-server, MVC, etc). You can simultaneously conceptualize several roles in a single group of interacting objects. The coordinate system is cartesian, taking an external, objective perspective.&lt;/p&gt;
&lt;p&gt;This is not to say that Java does not include any corporal perspective, nor that Lisp is all symbolic. I am talking in broad generalities about &lt;em&gt;predominance&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;not-one-at-a-time-but-all-at-once&quot;&gt;Not one-at-a-time but all-at-once&lt;/h3&gt;
&lt;p&gt;The interesting thing about Piaget's stages are that they are stages of dominance, not a rocket-stage-jettison progression. That is, we can still, as adults, think in terms of any of the prior levels. In fact, &lt;strong&gt;the most successful scientists and mathematicians work on the earliest levels (corporal/visual)&lt;/strong&gt;. Einstein claimed he had body sensations about relativity and his disabilities with abstract symbols is well documented. These three types of thinking are done by different &lt;em&gt;parts&lt;/em&gt; of the brain. The parts are always there but take dominant roles at different times in your life.&lt;/p&gt;
&lt;p&gt;How this relates to programming language design is that when we are designing a programming system, &lt;strong&gt;we should include all of these ways of thinking&lt;/strong&gt; so that the programmer can choose the best way to think about the problem. The easiest way to draw a circle is from a self-centered perspective in terms of motion and gross actions. The easiest way to plan a protocol is visually with boxes and lines or swim lane diagrams. Once translated into symbolic code, syntactic and semantic abstractions become evident, and can be manipulated as such.&lt;/p&gt;
&lt;p&gt;The trick of good language design is to facilitate programming at any level and translation into the other levels. &lt;strong&gt;How can we perform this trick?&lt;/strong&gt;&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/programming-language-stages-of-development"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why is a Monad Like a Writing Desk?</title>
                  <guid isPermalink="false">http://www.lispcast.com/why-is-a-monad-like-a-writing-desk</guid>
                  <link>http://www.infoq.com/presentations/Why-is-a-Monad-Like-a-Writing-Desk</link>
                  <pubDate>Wed 13 Jun 2012 04:53:47 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;The best explanation of Monads for beginners I have seen yet.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/why-is-a-monad-like-a-writing-desk"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Statistical Graphics, ClojureScript, &amp;c.</title>
                  <guid isPermalink="false">http://www.lispcast.com/statistical-graphics-clojurescript</guid>
                  <link>http://www.infoq.com/presentations/Statistical-Graphics-ClojureScript</link>
                  <pubDate>Wed 13 Jun 2012 04:42:12 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Kevin Lynagh shows off some cool code for easily generating (and automatically updating!) DOM from Clojurescript. I can't wait to get to experiment with this.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/statistical-graphics-clojurescript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The future is specific</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-future-is-specific</guid>
                  <link>http://www.chris-granger.com/2012/05/21/the-future-is-specific/</link>
                  <pubDate>Tue 22 May 2012 10:59:00 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Chris Granger:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the real potential is in making it trivial to build domain specific tools&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chris is definitely onto something valuable. Eclipse has had plugins for a long time, but they were always expensive to write. Emacs has been programmable forever. But it looks like Chris is making it even easier still and in a more modern package.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine being able to create these sorts of experiences on a whim instead of needing hundreds of hours to even get something simple working. If you couple that with the generalized editing capabilities I showed last time, you have what we believe to be the future of tools: an environment that you are able to mold to the exact shape of your problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Without diminishing the great work Chris is doing, I have one question: has this not been the promise of personal computing since its conception at Xerox PARC?&lt;/p&gt;
&lt;p&gt;Thank you, Chris, for bringing these ideas back into the realm of possibility.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-future-is-specific"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Light Table is now at YCombinator</title>
                  <guid isPermalink="false">http://www.lispcast.com/light-table-yc</guid>
                  <link>http://www.chris-granger.com/2012/05/17/light-table-is-in-yc/</link>
                  <pubDate>Fri 18 May 2012 10:01:30 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Wow.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/light-table-yc"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Story of Send</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-story-of-send</guid>
                  <link>http://www.google.com/green/storyofsend/</link>
                  <pubDate>Wed 16 May 2012 10:14:11 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Nice animation which follows an email sent from a computer to a mobile phone.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-story-of-send"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Ambrose Bonnaire-Sergeant Interview about Typed Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/ambrose-interview</guid>
                  <link>http://www.lispcast.com/ambrose-interview</link>
                  <pubDate>Wed 16 May 2012 08:28:50 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I am really excited about an interview with Ambrose Bonnaire-Sergeant on the &lt;a href=&quot;http://www.clojuregazette.com/&quot;&gt;Clojure Gazette&lt;/a&gt; that will be coming shortly. Be sure to sign up if you want to get it.&lt;/p&gt;
&lt;p&gt;You may want to &lt;a href=&quot;http://twitter.com/ambrosebs&quot;&gt;say hi to Ambrose on Twitter&lt;/a&gt;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ambrose-interview"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Organizing Functional Code for Parallel Execution; or, foldl and foldr Considered Slightly Harmful</title>
                  <guid isPermalink="false">http://www.lispcast.com/organizing-functional-code-for-parallel-execution</guid>
                  <link>http://vimeo.com/6624203</link>
                  <pubDate>Tue 15 May 2012 05:27:10 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;A great talk by programming language legend Guy Steele. (referenced in Rich Hickey's &lt;a href=&quot;http://clojure.com/blog/2012/05/15/anatomy-of-reducer.html&quot;&gt;recent post&lt;/a&gt;.)&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/organizing-functional-code-for-parallel-execution"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Anatomy of a Reducer</title>
                  <guid isPermalink="false">http://www.lispcast.com/anatomy-of-a-reducer</guid>
                  <link>http://clojure.com/blog/2012/05/15/anatomy-of-reducer.html</link>
                  <pubDate>Tue 15 May 2012 02:40:41 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Rich Hickey:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I hope this makes reducers easier to understand, use and define.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It does.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/anatomy-of-a-reducer"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Bishop: Makes Your Web Service Shiny</title>
                  <guid isPermalink="false">http://www.lispcast.com/bishop</guid>
                  <link>http://twitch.nervestaple.com/2012/05/07/bishop/</link>
                  <pubDate>Fri 11 May 2012 02:41:18 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Doh! This looks like a library that I have that is 90% ready to release. Though mine takes a slightly different tack.&lt;/p&gt;
&lt;p&gt;I guess I will have to get it ready for release.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/bishop"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Precog</title>
                  <guid isPermalink="false">http://www.lispcast.com/precog-io</guid>
                  <link>http://precog.io/</link>
                  <pubDate>Fri 11 May 2012 02:00:36 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I can think of many uses for this. Store datapoints in the cloud. Prebaked analysis plugins. Some relational semantics in the query language.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/precog-io"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>An Interview with Game Developer James Hague</title>
                  <guid isPermalink="false">http://www.lispcast.com/interview-james-hague</guid>
                  <link>http://www.mailsend-online.com/blog/?p=90</link>
                  <pubDate>Fri 11 May 2012 11:32:43 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;James Hague (of &lt;a href=&quot;http://prog21.dadgum.com/&quot;&gt;Programming in the 21st Century&lt;/a&gt; fame):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I've had an off and on romance with Forth. It's such a subversive language; you can fit an entire Forth development system into the space taken by the executable header of a &amp;quot;Hello World&amp;quot; program generated by a C compiler. But I've finally decided that the whole Forth concept is too minimal in the modern world. It's like using an artist's paintbrush to paint a house. The Forthers will respond with comments like &amp;quot;If you think you need to paint the house, then you haven't thought about the problem enough.&amp;quot; They'll suggest that a tent will keep you dry as well as a house and is much easier to maintain. Meanwhile, someone with a big, bulky brush is almost finished with the first coat of paint on the house. There has to be a happy medium between a 20K Forth and a C++ compiler than won't fit on a Zip disk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A great metaphor for programming in Forth.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/interview-james-hague"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Reducers - A Library and Model for Collection Processing</title>
                  <guid isPermalink="false">http://www.lispcast.com/reducers-library-collection-processing</guid>
                  <link>http://clojure.com/blog/2012/05/08/reducers-a-library-and-model-for-collection-processing.html</link>
                  <pubDate>Thu 10 May 2012 04:04:21 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Rich Hickey is still finding ways to apply simplicity to programming language design. It is amazing what can be done by starting your work by looking up a word in a dictionary instead of applying common practice.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/reducers-library-collection-processing"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Simplicity Matters by Rich Hickey</title>
                  <guid isPermalink="false">http://www.lispcast.com/simplicity-matters-rich-hickey</guid>
                  <link>http://www.youtube.com/watch?v=rI8tNMsozo0&amp;feature=relmfu</link>
                  <pubDate>Thu 03 May 2012 09:59:33 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Rich Hickey:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We focus on ourselves ... rather than [on] the programs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Software should be made of simple components because it makes the software better, not because it makes it easier for us as developers.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/simplicity-matters-rich-hickey"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Yahoo!'s Doug Crockford on Javascript</title>
                  <guid isPermalink="false">http://www.lispcast.com/yahoos-doug-crockford-on-javascript</guid>
                  <link>http://coding.smashingmagazine.com/2012/04/27/yahoos-doug-crockford-on-javascript/?utm_source=javascriptweekly&amp;utm_medium=email</link>
                  <pubDate>Fri 27 Apr 2012 02:34:43 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Doug Crockford about developing JSON:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One interesting story about leaving things out: as we got closer to releasing JSON I decided to take out the ability to do comments. When translating JSON into other languages, often times the commenting piece was the most complicated part. By taking the commenting out we reduced the complexity of the parsers by half—everything else was just too simple.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have wondered about why comments are not part of JSON. Now it makes sense.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the best features of JSON is that it’s stable. If your program works now, it will work forever, and that is an attractive thing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yum. He has found a reasonable data structure format that could indeed last forever.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I still get notes from people saying they’ve got great ideas for the next version. But there isn’t going to be a next version. I always say you’re free to invent a new standard and promote it as much as you like.&lt;/p&gt;
&lt;/blockquote&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/yahoos-doug-crockford-on-javascript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>cljs-binding</title>
                  <guid isPermalink="false">http://www.lispcast.com/cljs-binding</guid>
                  <link>http://fluentsoftware.github.com/cljs-binding/</link>
                  <pubDate>Thu 26 Apr 2012 09:10:00 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;This morning, in the &lt;a href=&quot;http://www.clojuregazette.com/&quot;&gt;Clojure Gazette&lt;/a&gt;, I mentioned that Clojure was still looking for the &amp;quot;vital point&amp;quot; of the browser. Could this library hit that vital point?&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/cljs-binding"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>John Gruber links to Light Table</title>
                  <guid isPermalink="false">http://www.lispcast.com/light-table-john-gruber</guid>
                  <link>http://daringfireball.net/linked/2012/04/23/light-table</link>
                  <pubDate>Tue 24 Apr 2012 03:14:38 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Get ready for major fundage.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/light-table-john-gruber"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Javascript to Clojurescript</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojurescript-to-javascript</guid>
                  <link>http://himera.herokuapp.com/synonym.html</link>
                  <pubDate>Tue 24 Apr 2012 02:35:25 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;A well-chosen and well-designed reference explaining how to convert Javascript to Clojurescript.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojurescript-to-javascript"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>How to Write Clean, Testable Code</title>
                  <guid isPermalink="false">http://www.lispcast.com/how-to-write-clean-testable-code</guid>
                  <link>http://www.youtube.com/watch?v=XcT4yYu_TTs&amp;feature=relmfu</link>
                  <pubDate>Tue 24 Apr 2012 01:51:00 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;A good talk by Miško Hevery. I like his point that he likes constructors that have no logic. They simply assign data values passed to them to the appropriate fields instead of doing a lot of reasoning about the values. He likes to decomplect the logic from the data, and claims that it makes code more testable.&lt;/p&gt;
&lt;p&gt;It reminds me of Clojure, where data values are typically built using literal maps. Clojure encourages a separation between logic and data construction and generally avoids this problem which is common in Java.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/how-to-write-clean-testable-code"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>clostache</title>
                  <guid isPermalink="false">http://www.lispcast.com/clostache</guid>
                  <link>https://github.com/fhd/clostache</link>
                  <pubDate>Mon 23 Apr 2012 07:26:16 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Just what I needed. Clojure is developing faster than I can keep up. But we need to come up with better names for libraries.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clostache"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Google Python Style Guide</title>
                  <guid isPermalink="false">http://www.lispcast.com/google-python-style-guide</guid>
                  <link>http://google-styleguide.googlecode.com/svn/trunk/pyguide.html</link>
                  <pubDate>Mon 23 Apr 2012 01:32:05 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I really like style guides.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/google-python-style-guide"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Review: Clojure Programming by Chas Emerick, Brian Carper, and Cristophe Grand</title>
                  <guid isPermalink="false">http://www.lispcast.com/review-clojure-programming</guid>
                  <link>http://aviflax.com/post/review-clojure-programming-by-chas-emerick-brian-carper-and-cristophe-grand/</link>
                  <pubDate>Mon 23 Apr 2012 08:36:37 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Avi Flax reviewing Clojure Programming:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The writing, examples, and organization are all excellent. And the book gets extra points for going beyond just explaining the language and how to use it, by being extra-comprehensive and covering how to really use the full Clojure ecosystem to build really useful software.&lt;/p&gt;
&lt;p&gt;This is worth highlighting: if the book had been comprised of only chapter 1, “Down the Rabbit Hole”, and the first 2 parts, “Functional Programming and Concurrency” and “Building Abstractions”, it would have been an excellent book which I’d be recommending wholeheartedly. The inclusion of the subsequent parts, “Tools, Platform, and Projects”, “Practicums”, and “Miscellanea” make the book an invaluable resource and a fantastic value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will have to get it.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/review-clojure-programming"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>(take 5 daniel-spiewak)</title>
                  <guid isPermalink="false">http://www.lispcast.com/take-5-daniel-spiewak</guid>
                  <link>http://clojure.com/blog/2012/04/19/take5-daniel-spiewak.html</link>
                  <pubDate>Fri 20 Apr 2012 06:11:06 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Daniel Spiewak:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;... a &amp;quot;pluggable&amp;quot; type system is really not very useful unless you can compose multiple type systems into a coherant whole, and this is where problems arise. Anyone who has studied type theory in a formal context and run a few soundness proofs will understand that seemly innocuous and self-contained type rules will almost always interact in surprising ways.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is certainly true if you are enforcing a strict type discipline on your language and rejecting programs that do not comply with this discipline, as type systems do. But it has yet to be shown that useful static analysis parts cannot be composed. They merely provide information, so they may be able to work orthogonally.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By and large though, I think that most of the awesome bullet-points that Clojure hits have already been stolen whole-sale by Scala. :-) A few examples: vector, map/set, agents (in Akka), STM (in Scala STM), SLIME (see ENSIME), etc. The Scala community is very actively watching the Clojure community. Y'all are a very fertile source of inspiration!&lt;/p&gt;
&lt;/blockquote&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/take-5-daniel-spiewak"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure 1.4 Reader Literals Test</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-1.4-reader-literals</guid>
                  <link>https://gist.github.com/2399254</link>
                  <pubDate>Wed 18 Apr 2012 11:43:27 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;A cool use of reader literals new in 1.4. Though see my comment in the gist.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-1.4-reader-literals"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure 1.4 Released</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-1.4-released</guid>
                  <link>https://groups.google.com/forum/?fromgroups#!topic/clojure/H4f2nbB6gWI</link>
                  <pubDate>Wed 18 Apr 2012 09:17:05 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Big news.&lt;/p&gt;
&lt;p&gt;Change your leiningen dependency to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[org.clojure/clojure &amp;quot;1.4.0&amp;quot;]]&lt;/code&gt;&lt;/pre&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-1.4-released"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Light Table on Kickstarter</title>
                  <guid isPermalink="false">http://www.lispcast.com/light-table-kickstarter</guid>
                  <link>http://www.kickstarter.com/projects/306316578/light-table</link>
                  <pubDate>Wed 18 Apr 2012 08:00:35 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;It looks like it is doing well, but still needs some help. Please go fund it if you are interested.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/light-table-kickstarter"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>ThinkRelevance: The Podcast - Episode 009 - Alan Dipert</title>
                  <guid isPermalink="false">http://www.lispcast.com/thinkrelevance-podcast-009-alan-dipert</guid>
                  <link>http://thinkrelevance.com/blog/2012/04/09/thinkrelevance-the-podcast-episode-009-alan-dipert</link>
                  <pubDate>Mon 16 Apr 2012 11:26:41 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I wish they had more time to talk about function level programming. &lt;a href=&quot;http://www.jsoftware.com/&quot;&gt;J&lt;/a&gt; is an example of a function level language.&lt;/p&gt;
&lt;p&gt;And a great &lt;a href=&quot;http://www.cs.cmu.edu/~crary/819-f09/Backus78.pdf&quot;&gt;article by Backus&lt;/a&gt; about function-level programming introduces the idea and its benefits. The basic idea is that we stop talking about &amp;quot;functions returning values&amp;quot; and start talking about &amp;quot;functions which behave like other functions&amp;quot;. For instance, the function that constantly returns 1.&lt;/p&gt;
&lt;p&gt;The benefit is that you can create an algrebra of program transformations which allows two functions to be compared for equality. &lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn sum1 [l] (reduce + l))

(defn sum2 [l] (reduce + l))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A compiler could easily check the equality of these functions since they have the same definition. Note that the Clojure compiler does not even do this simple kind of check.&lt;/p&gt;
&lt;p&gt;An even simpler example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(def const1  (constantly 1))
(def always1 (constantly 1))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These two functions are obviously equivalent and it could be trivial to make the compiler recognize this. These are examples of programming at the function level. At the function level, you program with at least first-order functions instead of with 0-order values.&lt;/p&gt;
&lt;p&gt;Let us imagine that we have this function that sums two lists:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn sumlists [l1 l2]
  (reduce + (concat l1 l2)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And an equivalent function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defn addlists [l1 l2]
  (apply + [(reduce + l1) (reduce + l2)]))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is easy to see that they do the same thing, but very difficult for the compiler to do so. (I used apply to make it first-order.) But with the proper transformation rules, these can be made equivalient:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if f is distributive then 
  reduce f (concat l1 l2) &amp;lt;=&amp;gt; apply f [(reduce f l1) (reduce f l2)]

+ is distributive&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This basically says that reduce is distributive over concat. Now we can transform one into the other and infer their equivalence. These transformations can allow the compiler to deeply optimize at a high level.&lt;/p&gt;
&lt;p&gt;Backus's idea is that we only program at first-order or higher so that we can guarantee to always be able to transform the programs and determine function identity. Clojure allows us to program at the 0-order (value) level. Many functions will not be able to participate in the function-level world.&lt;/p&gt;
&lt;p&gt;However, there is a large subset of most programs that are at the function-level, and some that are not that could easily be translated into that level. Could we augment the Clojure compiler to recognize this information and allow an &lt;code&gt;=&lt;/code&gt; function for functions?&lt;/p&gt;
&lt;p&gt;Sounds like a job for &lt;a href=&quot;https://github.com/clojure/core.logic&quot;&gt;core.logic&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;Christophe Grand has discussed a good use case for equality of functions &lt;a href=&quot;http://clj-me.cgrand.net/2011/10/17/valued-functions/&quot;&gt;here&lt;/a&gt;.&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/thinkrelevance-podcast-009-alan-dipert"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Introduction to Haskell talk</title>
                  <guid isPermalink="false">http://www.lispcast.com/introduction-to-haskell</guid>
                  <link>http://www.lispcast.com/introduction-to-haskell</link>
                  <pubDate>Mon 16 Apr 2012 09:01:47 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Last Thursday I gave a talk to &lt;a href=&quot;http://www.gnocode.com/&quot;&gt;GNO Code&lt;/a&gt;. It was about learning Haskell and my experiences programming in it professionally.&lt;/p&gt;
&lt;p&gt;There was no video of the talk but I have made the slides available online:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;/files/slides/haskell-slides.pdf&quot;&gt;Slides in PDF&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;/files/slides/haskell-slides.odp&quot;&gt;Slides in OpenOffice&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/introduction-to-haskell"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Meteor</title>
                  <guid isPermalink="false">http://www.lispcast.com/meteor</guid>
                  <link>http://www.meteor.com/screencast</link>
                  <pubDate>Fri 13 Apr 2012 06:16:22 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;It looks like a pretty sweet web server that lets you do all front-end development.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/meteor"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Light Table</title>
                  <guid isPermalink="false">http://www.lispcast.com/light-table</guid>
                  <link>http://www.chris-granger.com/2012/04/12/light-table---a-new-ide-concept/</link>
                  <pubDate>Fri 13 Apr 2012 05:37:42 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;We have needed this for years.&lt;/p&gt;
&lt;p&gt;And might I add that Clojure is smoking hot right now.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/light-table"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Edit Scheme on your iPad via the Parse Tree</title>
                  <guid isPermalink="false">http://www.lispcast.com/edit-scheme-on-your-ipad-via-the-parse-tree</guid>
                  <link>http://slidetocode.com/2012/04/05/lisping-released/</link>
                  <pubDate>Thu 05 Apr 2012 10:01:10 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Using Scheme is a good idea, because of structural editing, but applications like this need to break away from the textual past. There is so much opportunity for graphic design and user interface design to push programming forward. We are still stuck in the teletype era.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/edit-scheme-on-your-ipad-via-the-parse-tree"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Client-Side Logging with Google Analytics</title>
                  <guid isPermalink="false">http://www.lispcast.com/client-side-logging-with-google-analytics</guid>
                  <link>http://www.thetaboard.com/blog/client-side-error-logging-with-google-analytics?r=378</link>
                  <pubDate>Thu 05 Apr 2012 09:55:56 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Brilliant.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/client-side-logging-with-google-analytics"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Rich Hickey on Datomic</title>
                  <guid isPermalink="false">http://www.lispcast.com/rich-hickey-datomic</guid>
                  <link>http://www.infoq.com/interviews/hickey-datomic</link>
                  <pubDate>Wed 04 Apr 2012 02:23:48 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Interviewed at QCon London 2012.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/rich-hickey-datomic"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>NeXT, OpenStep, and the Return of Steve Jobs to Apple</title>
                  <guid isPermalink="false">http://www.lispcast.com/next-openstep-return-of-jobs</guid>
                  <link>http://www.youtube.com/watch?v=QhhFQ-3w5tE</link>
                  <pubDate>Mon 02 Apr 2012 04:16:07 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;&lt;a href=&quot;http://youtu.be/QhhFQ-3w5tE?t=16m26s&quot;&gt;Steve Jobs, 1997&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I went to Xerox PARC in 1979 and saw the original genesis of the Graphical User Interface, they actually showed me three things. And I was so blinded by the first that I didn't hang around to find out about the other two. It took me years to rediscover them. The first was of course the Graphical User Interface which Xerox PARC had pioneered and they had a lot of it right and a lot of it was left to be completed. But the other two things -- the second was Object Oriented Programming. They had ita ll running back in 1979. And the third was networking. They had several hundred Altos hooked up with networked printing, network file servers, email, all in 1979. If I had just stayed for another twenty minutes . . .&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jobs also shows that until he left Apple, he was still commercializing his visits to Xerox PARC. With iCloud he completed the trifecta of GUI, OOP, and Networked Computing that was already available thirty years ago.&lt;/p&gt;
&lt;p&gt;Steve Jobs, though he was not a programmer, also understood Object Oriented programming better than most programmers. Cue it up to 23:00 for his explanation and demonstration. He of course borrowed his understanding right from the source: Alan Kay and Xerox PARC.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/next-openstep-return-of-jobs"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Compiling Clojure to JavaScript, pt. 3 – The Himera Model</title>
                  <guid isPermalink="false">http://www.lispcast.com/himera-model</guid>
                  <link>http://blog.fogus.me/2012/03/27/compiling-clojure-to-javascript-pt-3-the-himera-model/</link>
                  <pubDate>Thu 29 Mar 2012 08:55:17 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Dividing the read-compile-eval-print loop over client and server. In Himera, eval and print happen in the browser, while the rest happen on the Himera server.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/himera-model"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Rich Hickey: Keynote</title>
                  <guid isPermalink="false">http://www.lispcast.com/rich-hickey-keynote</guid>
                  <link>http://blip.tv/clojure/rich-hickey-keynote-5970064</link>
                  <pubDate>Fri 16 Mar 2012 11:18:55 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I just rewatched this great talk where Rich Hickey talks about some future directions for Clojure.&lt;/p&gt;
&lt;h3 id=&quot;notes&quot;&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Different build targets - leaner and fatter builds of Clojure for deployment and development&lt;/li&gt;
&lt;li&gt;Clojure in Clojure - protocols, records, and deftype at the bottom&lt;/li&gt;
&lt;li&gt;Code analysis using core.logic - type checking, other analysis&lt;/li&gt;
&lt;li&gt;Pods - safely encapsulate state change&lt;/li&gt;
&lt;li&gt;Extensible reader - making Clojure a better format than JSON and XML&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/rich-hickey-keynote"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Quil</title>
                  <guid isPermalink="false">http://www.lispcast.com/quil</guid>
                  <link>https://github.com/quil/quil</link>
                  <pubDate>Fri 16 Mar 2012 11:14:20 AM CDT</pubDate>
                  <description>
                    
&lt;p&gt;Fine, fine work. I had a project I was doing in OpenGL that I will have to convert to Quil.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/quil"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure Gazette</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-gazette</guid>
                  <link>http://www.clojuregazette.com/</link>
                  <pubDate>Sun 11 Mar 2012 06:39:22 PM CDT</pubDate>
                  <description>
                    
&lt;p&gt;I was inspired by &lt;a href=&quot;http://rubyweekly.com&quot;&gt;Ruby Weekly&lt;/a&gt; and &lt;a href=&quot;http://javascriptweekly.com&quot;&gt;Javascript Weekly&lt;/a&gt; to create an email newsletter specifically targeting Clojure programmers.&lt;/p&gt;
&lt;p&gt;The Clojure community is incredibly inspiring. It is at once &lt;strong&gt;pragmatic&lt;/strong&gt; and &lt;strong&gt;philosophical&lt;/strong&gt;. It looks to the &lt;strong&gt;future&lt;/strong&gt; and learns from &lt;strong&gt;history&lt;/strong&gt;. It adheres to its own vision while drawing from other languages. I wanted to create something that enhanced these wonderful features of the Clojure community.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;Clojure Gazette&lt;/em&gt; is a mix of links to news, lectures, papers, libraries, and more that gives a weekly taste of the swirls of activity surrounding Clojure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.clojuregazette.com/&quot;&gt;Click here to subscribe. It's free.&lt;/a&gt;&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-gazette"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Programming Paradigms and Expressive Power</title>
                  <guid isPermalink="false">http://www.lispcast.com/paradigms-as-subtractive</guid>
                  <link>http://www.lispcast.com/paradigms-as-subtractive</link>
                  <pubDate>Thu 09 Feb 2012 05:22:11 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;I recently watched a &lt;a href=&quot;http://skillsmatter.com/podcast/agile-testing/bobs-last-language&quot;&gt;talk by Uncle Bob Martin called &lt;em&gt;The Last Programming Language&lt;/em&gt;&lt;/a&gt;. Since I had just written a post relating &lt;a href=&quot;/indirection&quot;&gt;indirection mechanisms to expressive power&lt;/a&gt;, I was intrigued by Uncle Bob's idea and wanted to explore it further.&lt;/p&gt;
&lt;p&gt;Uncle Bob gives a brief history of programming paradigms. Here are the ones he mentions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Modular_programming&quot;&gt;Modular Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Structured_programming&quot;&gt;Structured Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Object-oriented_programming&quot;&gt;Object Oriented Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_programming&quot;&gt;Functional Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;His perspective was that programming paradigms are generally subtractive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modular programming removed large programs&lt;/li&gt;
&lt;li&gt;Structured programming removed GOTOs&lt;/li&gt;
&lt;li&gt;Object Oriented programming removed hand-rolled vtables&lt;/li&gt;
&lt;li&gt;Functional programming removed mutable state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;He concludes by saying that there's nothing left to take away and a language of the future would have to have all of these.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perspective is worth 80 IQ points. -- Alan Kay&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The idea that paradigms are subtractive is interesting. It is interesting to look at what is taken away. However, I would rather say that paradigms replace a manual, error-prone pattern with a more reliable one (usually through &lt;a href=&quot;/indirection&quot;&gt;indirection&lt;/a&gt;). Structured programming didn't just ban GOTO. It also encouraged conditionals and loops. Object Oriented programming didn't just prohibit tables of function pointers, it gave a unified syntax and semantics for message dispatch. But, still, I do appreciate the perspective.&lt;/p&gt;
&lt;p&gt;On the other hand, I think Uncle Bob has left out many interesting paradigms from his history. &lt;a href=&quot;http://en.wikipedia.org/wiki/Programming_paradigm&quot;&gt;Wikipedia lists 59 paradigms&lt;/a&gt; in a hierarchy. (Note that they are not mutually exclusive!) Let's see if we can apply his subtractive perspective to those paradigms.&lt;/p&gt;
&lt;h3 id=&quot;aspect-oriented-programmingaop&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Aspect-oriented_programming&quot;&gt;Aspect-oriented programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;. . . aims to increase modularity by allowing the separation of cross-cutting concerns.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;The mixing of concerns.&lt;/p&gt;
&lt;h3 id=&quot;concatenative-programmingcp&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Concatenative_programming_language&quot;&gt;Concatenative programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A concatenative programming language is a point-free programming language in which all expressions denote functions and the juxtaposition of expressions denotes function composition.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove-1&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;Explicit arguments to functions (point-free!).&lt;/p&gt;
&lt;h3 id=&quot;constraint-programmingconp&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Constraint_programming&quot;&gt;Constraint programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;. . . is where relations between variables are stated in the form of constraints.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove-2&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;Specifying the sequence of steps to execute.&lt;/p&gt;
&lt;h3 id=&quot;logic-programminglogic&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Logic_programming&quot;&gt;Logic programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;. . . is the use of mathematical logic for computer programming.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove-3&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;Much like constraints, it removes the explicit steps to execute.&lt;/p&gt;
&lt;h3 id=&quot;array-programmingarray&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Array_programming&quot;&gt;Array programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;. . . is the generalization of operations on scalar values to apply transparently to vectors, matrices, and higher dimensional arrays.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove-4&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;The distinction between scalar and vector quantities.&lt;/p&gt;
&lt;h3 id=&quot;language-oriented-programminglop&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Language-oriented_programming&quot;&gt;Language-oriented programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;. . . is the creation of a domain-specific language for the problem, then solve the problem in that language.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove-5&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;General purpose programming languages.&lt;/p&gt;
&lt;p&gt;One more.&lt;/p&gt;
&lt;h3 id=&quot;event-driven-programmingep&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Event-driven_programming&quot;&gt;Event-driven programming&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;. . . means the flow of the program is determined by response to events.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-does-it-remove-6&quot;&gt;What does it remove?&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;main&lt;/code&gt; function?&lt;/p&gt;
&lt;p&gt;The perspective has some merits. But it also has flaws. I've already mentioned that it does not specify what the removed thing is replaced with, which may be more important than the removal itself. Also, the perspective probably does not apply to all programming paradigms, as Uncle Bob claims. He's exhibiting a blindness toward the possibility of future change because he can't imagine it.&lt;/p&gt;
&lt;p&gt;I also don't think we have come to the end of programming paradigms. Although I can't predict what paradigms will be invented in the future (if I could, I'd just invent it), I don't think we're looking at mere incremental improvement. It's just that after racking my brain I can't come up with much.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Compute&quot;&gt;This video&lt;/a&gt; holds some ideas.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/paradigms-as-subtractive"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Introduction to Logic Programming with Clojure</title>
                  <guid isPermalink="false">http://www.lispcast.com/introduction-to-logic-programming-with-clojure</guid>
                  <link>http://blip.tv/clojure/ambrose-bonnaire-sergeant-introduction-to-logic-programming-with-clojure-5936196</link>
                  <pubDate>Thu 09 Feb 2012 05:11:45 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;This talk makes me even more excited about &lt;a href=&quot;https://github.com/clojure/core.logic&quot;&gt;&lt;code&gt;core.logic&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/introduction-to-logic-programming-with-clojure"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Why Ruby?</title>
                  <guid isPermalink="false">http://www.lispcast.com/why-ruby</guid>
                  <link>http://vimeo.com/17420638</link>
                  <pubDate>Wed 08 Feb 2012 12:10:52 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;I've been watching a lot of Clojure videos at the moment. I really appreciate some of the more philosophical directions in Clojure talks. Then I started thinking that other languages must have that type of philosophical talk, too.&lt;/p&gt;
&lt;p&gt;So I searched for &amp;quot;Ruby lectures&amp;quot; and found this talk by David Heinemeier Hansson. He talks about what he likes about Ruby. He really shows his love for the language that has kept him engaged for so long. He ends with a passionate assessment of Ruby as a language that fosters freedom.&lt;/p&gt;
&lt;p&gt;It's not exactly &lt;a href=&quot;http://blip.tv/clojure/hammock-driven-development-4475586&quot;&gt;Hammock-Driven Development&lt;/a&gt;, but it's still an interesting talk and one that all dynamic programming language fans should appreciate.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/why-ruby"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Osterhout's Dichotomy Isn't</title>
                  <guid isPermalink="false">http://www.lispcast.com/ousterhouts-dichotomy</guid>
                  <link>http://blip.tv/clojure/stuart-halloway-ousterhout-s-dichotomy-isn-t-part-2-of-the-simplicity-power-focus-series-5936308</link>
                  <pubDate>Tue 07 Feb 2012 06:56:21 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;An excellent and down-to-earth talk from Stuart Halloway explaining some of the decisions made in Clojure as they relate to power. Particularly, I like that Halloway deconflated the general power of a language from its expressive power.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ousterhouts-dichotomy"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Unpretty</title>
                  <guid isPermalink="false">http://www.lispcast.com/unpretty</guid>
                  <link>http://oblong-code.blogspot.com/2012/02/unpretty.html</link>
                  <pubDate>Mon 06 Feb 2012 03:28:59 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Snut:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It wasn't pretty, but Leiningen is now generating a large .jar containing almost everything required to run a chunk of stuff excised from my &amp;quot;random clojure braindump&amp;quot; folder. So now I can in theory show my tiny vestigal 3D roguelike/turn-based Dungeon Master/hex-based Legend of Grimrock clone to people! People that don't have Clojure installed!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can't wait.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do people approach cross-project hacking at a small scale?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's still tough to do so in Clojure at the moment.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/unpretty"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Indirection Mechanisms and Expressive Power</title>
                  <guid isPermalink="false">http://www.lispcast.com/indirection</guid>
                  <link>http://www.lispcast.com/indirection</link>
                  <pubDate>Sat 04 Feb 2012 02:39:59 PM ART</pubDate>
                  <description>
                    
&lt;h3 id=&quot;what-defines-a-languages-expressive-power&quot;&gt;What defines a language's expressive power?&lt;/h3&gt;
&lt;p&gt;Expressive power is hard to pin down in programming languages. In this post, I want to explore how &lt;em&gt;indirection mechanisms&lt;/em&gt; lend expressiveness to a language. By indirection, I mean something that happens at compile time or run time which was not explicitly specified in the code. By mechanism, I mean something with well-defined, rule-governed semantics.&lt;/p&gt;
&lt;p&gt;Indirection mechanisms are typically what makes a program shorter, easier to write, and easier to reason about. Instead of writing machine code directly, you are relying on the compiler or runtime to do the heavy lifting.&lt;/p&gt;
&lt;p&gt;I posit that the development of indirection mechanisms closely follows the development of multiplicative expressive power. One line of Python is worth far more than 100 lines of C and more than 1000 lines of Assembly. And rather than debate about expressive power in different languages, I'd like to simply catalog some of the more obvious and important indirection mechanisms out there.&lt;/p&gt;
&lt;p&gt;While many languages might share a given indirection mechanism, I don't know all languages, so I am just going to go with my personal experience and &lt;em&gt;group them roughly by programming languages&lt;/em&gt; I am familiar with. I would love to hear of more mechanisms, if you know of them.&lt;/p&gt;
&lt;h3 id=&quot;assembly&quot;&gt;Assembly&lt;/h3&gt;
&lt;p&gt;Depending on the features available, Assembly can be seen as simply a more convenient language to write in than machine language. But this convenience comes from a indirection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Named instructions&lt;/p&gt;
&lt;p&gt;The assembler looks up the name of an instruction in a table and converts it to the machine code. It is much more convenient to remember a mnemonic sequence of characters than an arbitrary number.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Labeled statements&lt;/p&gt;
&lt;p&gt;Instead of calculating a jump offset from the current instruction, you just name a line of code and the assembler will calculate it for you. It is much less error prone and immune to changes in the program.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;c&quot;&gt;C&lt;/h3&gt;
&lt;p&gt;C has many indirection mechanisms. Most of them were not invented in C. However, from a historical and pedagogical perspective, C is a good contrast to Assembly. Both are relatively low-level and ubiquitous, yet C is a huge leap beyond Assembly in terms of indirection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automatic number coercion&lt;/p&gt;
&lt;p&gt;Numbers in C are automatically coerced &amp;quot;up&amp;quot; when operated on, whereas in machine language, the values would have to be explicitly converted. You reduce mathematical errors because the machine can do a better job than you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Function call semantics&lt;/p&gt;
&lt;p&gt;Function calls compile to a lot of code, including copying the arguments to the stack. Function calling in C is more convenient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recursive expressions&lt;/p&gt;
&lt;p&gt;In machine code and Assembly, instructions are written linearly in sequence. In C, however, expressions can be nested. The compiler will convert them to the appropriate sequence of instructions. Nested expressions are easier to understand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Structured programming&lt;/p&gt;
&lt;p&gt;Conditionals and loops provide a simpler, less error-prone way to code than machine code jumps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;lisp&quot;&gt;Lisp&lt;/h3&gt;
&lt;p&gt;Lisp's main evaluation semantic is the source of much veneration and arguably is the &lt;em&gt;Ur&lt;/em&gt; indirection mechanism. I am talking about the &lt;code&gt;eval&lt;/code&gt; function as defined in the original Lisp paper by McCarthy. There are more mechanism, but they are too many to list here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Eval&lt;/p&gt;
&lt;p&gt;Most values (so-called atoms) evaluate to themselves, symbols are looked up in the current environment, and to evaluate a list (a function call), evaluate its elements, then apply the first element (hopefully it's a function!) to the rest of the elements.&lt;/p&gt;
&lt;p&gt;The indirection comes from the late-binding of the symbol to its value. The environment can change, so the function call can have different meanings at different points in the program. This greatly facilitates incremental development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CLOS&lt;/p&gt;
&lt;p&gt;The Common Lisp Object System defines many indirection mechanisms for doing object-oriented programming. They include method combinations (before and after methods), class-based polymorphism, and method dispatch. The most interesting indirection mechanism is that a class can define its own indirection mechanism.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Garbage collection&lt;/p&gt;
&lt;p&gt;Instead of writing routines for managing the memory of your program, the runtime will take care of recouping memory when it is no longer needed. A great productivity boost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Macros&lt;/p&gt;
&lt;p&gt;Lisp macro calls look like function calls, but they are expanded into code at compile time. This indirection mechanism essentially allows you to extend the language within the language.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;smalltalk&quot;&gt;Smalltalk&lt;/h3&gt;
&lt;p&gt;Smalltalk defined object-oriented programming as we know it today, based on a simple indirection mechanism: message passing. It also was the first language (that I know of) to make significant use of development tools. Like Lisp, I cannot list all of the indirection mechanisms in Smalltalk. They are too numerous.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Method passing&lt;/p&gt;
&lt;p&gt;The main semantic of Smalltalk is message passing. A message consists of the name and the arguments. The name is looked up in the vtable of the receiving object. If it is found, the associated method is returned and called on the objects. Otherwise, the name is looked up in the vtable's parent, and its parent, to the end of the vtable list. This vtable lookup is both dynamic (it allows for changes to the vtable at runtime) and provides polymorphism (different kinds of objects can respond to the same message).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Semantic refactoring&lt;/p&gt;
&lt;p&gt;Development tools before Smalltalk were usually confined to enhanced text editors. Smalltalk let you refactor code, meaning changing code not at the textual level but at the structural-semantic level. For instance, performing a &amp;quot;rename&amp;quot; operation on a method would not only change the name of the method in that class, but also change the code for all of the callers. This is another indirection mechanism which is now taken for granted in the Java and .NET worlds.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;self&quot;&gt;Self&lt;/h3&gt;
&lt;p&gt;Self is a prototype based object-oriented language.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Slot access&lt;/p&gt;
&lt;p&gt;In Self, to access a slot from an object, the name of the slot is looked up in the object. If it is found, the value is returned. Otherwise, the &lt;code&gt;parent&lt;/code&gt; slot is accessed, and the slot name is looked up in the parent recursively. This allows one to build objects that are mostly identical to an existing object except in a small way.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;haskell&quot;&gt;Haskell&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Typeclass polymorphism&lt;/p&gt;
&lt;p&gt;Haskell, unlike Smalltalk, keeps the values (objects) separate from the vtables. It is the job of the compiler to reunite these two elements when necessary. This allows data types to be defined separately (even in different files) from the code defining the type's inclusion in typeclasses. The Haskell compiler, following well-defined semantics, will convert calls to a typeclass method into a call to a function with the vtable as an implicit argument. This enables a limited form of polymorphism, where the same name refers to different functions depending on the types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pattern matching&lt;/p&gt;
&lt;p&gt;Pattern matching in Haskell means destructuring a value into component values while optionally binding names to values. It lets you write in one concise statement the equivalent of several conditionals and &lt;code&gt;let&lt;/code&gt; statements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;clojure&quot;&gt;Clojure&lt;/h3&gt;
&lt;p&gt;Clojure also deserves a mention for its championing of various mechanisms for controlling concurrent state.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Concurrent state (refs, agents, atoms, etc.)&lt;/p&gt;
&lt;p&gt;The Clojure runtime provides many indirection mechanisms to deal with state. Refs, for instance, provide transactional semantics over different values. This allows one to write parallel programs without explicitly using locks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Indirection mechanisms are semantic abstractions afforded by the language. Like all abstractions, they are &lt;a href=&quot;http://www.joelonsoftware.com/articles/LeakyAbstractions.html&quot;&gt;prone to leakage&lt;/a&gt;. How a language deals with the leaks might be just as important a choice as which mechanisms the language supports. For instance, what happens when you pass an object a message it doesn't understand? Some common options include: compiler error, thrown exception, silent failure, magic, or undefined behavior. These are damage control at best.&lt;/p&gt;
&lt;p&gt;A lot of the leakiness of abstractions has to do with how mechanical the indirection is, and how simple the rules of the mechanism are. A complex mechanism is hard to understand, while a non-deterministic mechanism will sometimes give unwanted behavior. And when things go wrong, it is hard to distinguish between complexity and non-determinism. We should therefore strive for simple, deterministic abstractions. And we should also strive to bake the failure into the model, and build systems to deal with abstraction failures upfront.&lt;/p&gt;
&lt;p&gt;I want to complete this list and keep it updated. Please &lt;script type=&quot;text/javascript&quot;&gt;
&lt;!--
h='&amp;#x67;&amp;#x6d;&amp;#x61;&amp;#x69;&amp;#108;&amp;#46;&amp;#x63;&amp;#x6f;&amp;#x6d;';a='&amp;#64;';n='&amp;#x65;&amp;#114;&amp;#x69;&amp;#x63;&amp;#x77;&amp;#110;&amp;#x6f;&amp;#114;&amp;#x6d;&amp;#x61;&amp;#110;&amp;#100;';e=n+a+h;
document.write('&lt;a h'+'ref'+'=&quot;ma'+'ilto'+':'+e+'&quot;&gt;'+'contact me'+'&lt;\/'+'a'+'&gt;');
// --&gt;
&lt;/script&gt;&lt;noscript&gt;&amp;#x63;&amp;#x6f;&amp;#110;&amp;#116;&amp;#x61;&amp;#x63;&amp;#116;&amp;#32;&amp;#x6d;&amp;#x65;&amp;#32;&amp;#40;&amp;#x65;&amp;#114;&amp;#x69;&amp;#x63;&amp;#x77;&amp;#110;&amp;#x6f;&amp;#114;&amp;#x6d;&amp;#x61;&amp;#110;&amp;#100;&amp;#32;&amp;#x61;&amp;#116;&amp;#32;&amp;#x67;&amp;#x6d;&amp;#x61;&amp;#x69;&amp;#108;&amp;#32;&amp;#100;&amp;#x6f;&amp;#116;&amp;#32;&amp;#x63;&amp;#x6f;&amp;#x6d;&amp;#x29;&lt;/noscript&gt; if you have other ideas for indirection mechanisms and I'll add them here and credit them to you!&lt;/p&gt;
&lt;p&gt;To conclude: Different languages make different choices of which mechanisms to provide, and hence the endless variety of languages we see today. It is my hope that we will find more such abstractions which allow programmers to be even more productive in the future. Further, perhaps there are ways to make existing mechanisms more robust and which fail in more appropriate ways.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/indirection"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Programming Language Checklist</title>
                  <guid isPermalink="false">http://www.lispcast.com/programming-language-checklist</guid>
                  <link>http://colinm.org/language_checklist.html</link>
                  <pubDate>Fri 03 Feb 2012 09:24:57 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;A funny and painfully true look at language development.&lt;/p&gt;
&lt;p&gt;I still think developing your own language is a great learning process.&lt;/p&gt;
&lt;p&gt;via &lt;a href=&quot;http://news.ycombinator.org/user?id=akoumjian&quot;&gt;akoumjian&lt;/a&gt;&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/programming-language-checklist"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Modern Language Wishlist</title>
                  <guid isPermalink="false">http://www.lispcast.com/modern-language-wishlist</guid>
                  <link>http://www.lispcast.com/modern-language-wishlist</link>
                  <pubDate>Thu 02 Feb 2012 01:34:07 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;I was brainstorming the other day about features that I expect to be easy in modern programming languages (plus libraries).&lt;/p&gt;
&lt;p&gt;Some of them are very common, some less common, and some might not exist yet. Some are basic services of the runtime and some are more conveniences for interacting with the modern networked world.&lt;/p&gt;
&lt;p&gt;None of them are impossible. I can point to examples of each of them in popular programming languages. But there is no language that has all of them. A lot of progress could be made with fortuitous curation of existing libraries.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;String manipulation&lt;/p&gt;
&lt;p&gt;String manipulation should be incredibly convenient. It's so common to parse something out of a string, or build up a new string. It should be so easy it disappears.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Regular expressions&lt;/li&gt;
&lt;li&gt;Splitting&lt;/li&gt;
&lt;li&gt;Joining&lt;/li&gt;
&lt;li&gt;Replacing&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Polymorphism&lt;/p&gt;
&lt;p&gt;Polymorphism, as I'm describing it here, means the specific type of a value is an implementation detail that I can ignore. I can program to an &amp;quot;interface&amp;quot; and two values that implement the same interface can be treated interchangeably.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic &amp;quot;container&amp;quot; types&lt;/p&gt;
&lt;p&gt;I don't think it's a stretch to say that we know enough, as a science and industry, to know exactly what we need from our containers. +1 for convenient syntax.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linked list&lt;/li&gt;
&lt;li&gt;Dynamic array&lt;/li&gt;
&lt;li&gt;Hash map&lt;/li&gt;
&lt;li&gt;Set&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Input/output&lt;/p&gt;
&lt;p&gt;It's still a little hard in some languages to read and write files. Especially binary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web requests&lt;/p&gt;
&lt;p&gt;Our computers are approaching 100% time on the Internet. And the web is ubiquitous. You should be able to do web requests with one line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;URL Manipulation&lt;/p&gt;
&lt;p&gt;URL's are very structured strings, but that doesn't mean we should be concatenating the strings ourselves. There needs to be a way to build URL's and break them into their individual components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Garbage Collection&lt;/p&gt;
&lt;p&gt;I just don't want to worry about memory management anymore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Namespaces&lt;/p&gt;
&lt;p&gt;It is convenient to avoid naming conflicts as your library ecosystem grows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Homoiconic&lt;/p&gt;
&lt;p&gt;Code can be manipulated as data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extensible syntax&lt;/p&gt;
&lt;p&gt;I find I don't use macros much anymore. I do more with data-driven programming. But it is nice to have when you need it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Math-oriented numeric types&lt;/p&gt;
&lt;p&gt;There are times when I want numbers that are defined by their machine representations, such as C &lt;code&gt;int&lt;/code&gt; and &lt;code&gt;double&lt;/code&gt;. I'll call this &amp;quot;machine-oriented numbers&amp;quot;. There are times when I want a more abstract representation of numbers, that act like they taught me in Math class. I'll call this &amp;quot;math-oriented numbers&amp;quot;.&lt;/p&gt;
&lt;p&gt;With math-oriented numbers, the fear of overflowing should not exist and division is division.&lt;/p&gt;
&lt;p&gt;While we're at it, we could add in matrices, vectors, and even equations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Units&lt;/p&gt;
&lt;p&gt;Numeric values should be able to be qualified with a unit. You should be able to convert between units of the same kind.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mass&lt;/li&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;li&gt;Distance&lt;/li&gt;
&lt;li&gt;Temperature&lt;/li&gt;
&lt;li&gt;and combinations of the above (speed, acceleration, etc.)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Time&lt;/p&gt;
&lt;p&gt;Time, dates, and calendars are hard. The language should solve the hard part for us.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Error&lt;/p&gt;
&lt;p&gt;A number is rarely 100% accurate. There should be ways to represent the error and have it accumulate when combining different values. +1 for tracing the sources of error.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unification / pattern matching&lt;/p&gt;
&lt;p&gt;It's just for convenience. The important thing is how unification errors are dealt with. Hopefully, there is something better than catching an exception.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Before / after functions&lt;/p&gt;
&lt;p&gt;This is sometimes known as aspects. But there is a lot of value being able to add functionality to existing functions without modifying the original code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Parser&lt;/p&gt;
&lt;p&gt;Convenient way to define parser grammars that generate AST's available in the language.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSV library&lt;/p&gt;
&lt;p&gt;CSV is a very common way to store tabular data, but it's not really a standard. There is enough variability in the format that a library is called for.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Good error messages&lt;/p&gt;
&lt;p&gt;Good error messages need to help you locate and solve the problem. It's actually really hard to get right. You can see this a lot in newer languages. Languages with helpful errors are typically mature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Immutable values&lt;/p&gt;
&lt;p&gt;Values are values. They shouldn't change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explicit model of time&lt;/p&gt;
&lt;p&gt;It is very rare to find in programming languages. Time needs to be modeled by the programming language so that we can sanely deal with concurrency. This is one of the bigger mini-revolutions happening in programming at the moment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Graphics&lt;/p&gt;
&lt;p&gt;Most languages make it really hard to draw on the screen. This just needs to be easier. Displaying images, shapes, colors, text, video, and associated manipulations: scaling, rotation, translation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sound&lt;/p&gt;
&lt;p&gt;Same goes for sound: playing sounds should be easy! Listening to the microphone should be easy!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Common file formats&lt;/p&gt;
&lt;p&gt;Reading common formats should be easy. At the very least, there should be a framework/convention for libraries for common formats to follow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Game input&lt;/p&gt;
&lt;p&gt;By this, I mean getting raw events about key down, key up, mouse movement, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GUI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First-class functions&lt;/p&gt;
&lt;p&gt;Higher-order programming is an obvious win. +1 for lexical closures. +1 if you can store the functions to disk and read them back in!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy way to store data in flat text files&lt;/p&gt;
&lt;p&gt;I don't want to have to write my own serialization routines.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/modern-language-wishlist"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Escape from the Ivory Tower</title>
                  <guid isPermalink="false">http://www.lispcast.com/escape-from-the-ivory-tower</guid>
                  <link>http://yow.eventer.com/events/1004/talks/1054</link>
                  <pubDate>Sat 28 Jan 2012 06:47:44 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;This brief history of Haskell is a nice introduction to how Haskell has developed. Jones tells a nice story punctuated by seminal publications that contributed to the ideas. He is a living example of how well the Cambridge accent was designed for giving lectures.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some programs work but are not well-typed. That is, they are the programs that you want to write but the compiler rejects them. So this is the &amp;quot;Region of Abysmal Pain&amp;quot;. Because that's where you think: &amp;quot;Ugh! The type system is getting in my way! I know! I'll use an untyped language.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is very refreshing to hear someone straight from the top of the static typing pantheon acknowledge the pain of working with current, statically-typed languages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now, of course there's always going to be a small Region of Abysmal Pain. There's rather a sort of sterile debate that happens between the static and the dynamic crowd. But I just want to remark that there's something not just self-indulgent but I think is actually quite important about the process of trying to find ways of making types more expressive so that they maintain the good property of being somewhat comprehensible and while moving closer to writing programs that you really want to write.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Alright, so here's our plan for world domination: make the type system sufficiently expressive to the point where everybody will forget dynamic languages and write statically typed ones. I don't expect that will happen to me in my lifetime. But I regard Haskell as a kind of thought experiment that's trying to go in that direction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the end, I think Simon Peyton Jones is the perfect mix of humility and hubris to lead the Haskell movement. He seems to have the patience to work with (and be excited about) an incomplete language (as Haskell was in the early days and still is in a lot of ways) without being dogmatic about the virtue of the current limitations.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/escape-from-the-ivory-tower"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Beautiful Web Type</title>
                  <guid isPermalink="false">http://www.lispcast.com/beautiful-web-type</guid>
                  <link>http://hellohappy.org/beautiful-web-type/</link>
                  <pubDate>Sat 28 Jan 2012 05:38:57 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Thanks for this curation of &lt;a href=&quot;http://www.google.com/webfonts&quot;&gt;Google Web Fonts&lt;/a&gt;. Despite Google Web Fonts' excellent UI, I still have trouble finding the gems.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/beautiful-web-type"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Parser Combinators: How to Parse (nearly) Anything</title>
                  <guid isPermalink="false">http://www.lispcast.com/parser-combinators-how-to-parse-nearly-everything</guid>
                  <link>http://www.infoq.com/presentations/Parser-Combinators</link>
                  <pubDate>Thu 26 Jan 2012 12:08:09 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;This is the best video I've ever seen defining monadic parser combinators from the ground up. Nate Young explains &lt;a href=&quot;https://github.com/youngnh/parsatron&quot;&gt;his translation&lt;/a&gt; of &lt;a href=&quot;http://www.haskell.org/haskellwiki/Parsec&quot;&gt;Parsec&lt;/a&gt; into Clojure&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. I'm surprised he could show the code and explain it well in less than forty-five minutes.&lt;/p&gt;
&lt;p&gt;As you may know, I have my own PEG parser combinator library called &lt;a href=&quot;https://github.com/ericnormand/squarepeg&quot;&gt;squarepeg&lt;/a&gt;. I began developing it as monadic, but decided that I didn't like having to write my own version of Haskell's &lt;code&gt;do&lt;/code&gt; notation (&lt;code&gt;let-&amp;gt;&amp;gt;&lt;/code&gt; in his version), which felt awkward in Clojure. Instead, squarepeg lets you bind variables and refer to them later within each parser itself (instead of in the code that builds the parser). There were a few other differences, but in general, I think the two libraries are more similar than different.&lt;/p&gt;
&lt;p&gt;One thing I think I will borrow from his library is counting the character position of the current parser to help report parsing errors. It's going on my TODO list.&lt;/p&gt;
&lt;p&gt;I have more plans for squarepeg when I get a chance. They include limiting the laziness of the parser and being able to report better error messages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; The kindly &lt;a href=&quot;https://twitter.com/spariev&quot;&gt;Sergey Pariev&lt;/a&gt; clued me into the github repo of &lt;a href=&quot;https://github.com/youngnh/parsatron&quot;&gt;The Parsatron&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;Nate said his parser was available on Clojars under the name &amp;quot;The Parsitron&amp;quot;, but I could not find it.&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/parser-combinators-how-to-parse-nearly-everything"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>ClojureScript One</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojurescript-one</guid>
                  <link>http://clojurescriptone.com/</link>
                  <pubDate>Fri 20 Jan 2012 06:40:11 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Simply amazing.&lt;/p&gt;
&lt;p&gt;I tried to build a small project using ClojureScript and gave up, reverting back to Javascript. The workflow was awkward and information about the language was lacking. ClojureScript One aims to exemplify the power latent in ClojureScript by giving us a productive workflow from the very start. You clone the repo and use it as a starting point for your own project.&lt;/p&gt;
&lt;p&gt;I haven't explored this new project, but it is already impressive. It sets a high bar for new projects. It includes a well-designed home page, getting started videos, and nice documentation. But, more importantly, it hints at a new age in web development in much the same way as the &lt;a href=&quot;http://www.youtube.com/watch?v=Gzj723LkRJY&quot;&gt;&lt;em&gt;Blog in 15 Minutes&lt;/em&gt;&lt;/a&gt; Ruby on Rails video ushered in the rise of Ruby on the web. Watch the ClojureScript One Getting Started video to have your mind blown.&lt;/p&gt;
&lt;p&gt;I also recommend a &lt;a href=&quot;http://thinkrelevance.com/blog/2012/01/12/podcast-episode-003.html&quot;&gt;podcast&lt;/a&gt; about the goals of ClojureScript One.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojurescript-one"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>apple == orange</title>
                  <guid isPermalink="false">http://www.lispcast.com/apple-equals-oranges</guid>
                  <link>http://www.lispcast.com/apple-equals-oranges</link>
                  <pubDate>Fri 30 Dec 2011 06:44:36 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;If you are reading this, you are probably a programmer. Let me ask you, for just a moment, to step out of your programmer shoes and answer these questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is this apple equal to that orange?&lt;/li&gt;
&lt;li&gt;Is that cloud equal to this house?&lt;/li&gt;
&lt;li&gt;Is my backpack equal to my television?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The obvious answer is &amp;quot;no&amp;quot; to all of these. And so (please step back into your programmer shoes) we see in many languages I can ask a similar question:&lt;/p&gt;
&lt;p&gt;In Java:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apple.equals(orange)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or in Clojure:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(= apple orange)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The answer to both questions is unsurprisingly &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And in Haskell?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apple == orange&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Type error! The compiler is saying I cannot even ask the question.&lt;/p&gt;
&lt;p&gt;What model of reality is Haskell asserting?&lt;/p&gt;
&lt;p&gt;Is it telling me that I need to convert the apple and orange into values of the same type?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fruit {name = &amp;quot;apple&amp;quot;} == Fruit {name = &amp;quot;orange&amp;quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Is this question really different from &lt;code&gt;apple == orange&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Which model (Haskell's or Clojure's) more closely models reality?&lt;/p&gt;
&lt;p&gt;Is this behavior intentionally designed into Haskell or is it incidental behavior due to the choice of type system?&lt;/p&gt;
&lt;p&gt;Does this behavior make Haskell better or worse than a hypothetical Haskell that allowed the question to be asked?&lt;/p&gt;
&lt;p&gt;Deep questions.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/apple-equals-oranges"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The future of programming</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-future-of-programming-pchiusano</guid>
                  <link>http://pchiusano.blogspot.com/2011/12/future-of-programming.html</link>
                  <pubDate>Fri 30 Dec 2011 05:24:54 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Paul Chiusano:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the functional programming world, there is insane amounts of code reuse happening, but along with this comes a fair bit of plumbing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;em&gt;plumbing&lt;/em&gt; Chiusano is referring to is incidental complexity imposed by current static type systems without a good set of &amp;quot;universal&amp;quot; types. Dynamically typed languages often do not have the same plumbing problem because of the extra information available at runtime to do dynamic dispatching and the use of overloading. This incidental complexity is a huge hurdle to languages like Haskell, where half of the code is about converting from one type to another.&lt;/p&gt;
&lt;p&gt;This could be the fault of the codebase/libraries I am working with. In my practical Haskell experience, I have failed to find the zen of type/domain fit that static-typing enthusiasts talk about. Chiusano, however, hints that this problem is universal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It makes it clear that types are effective not just at preventing many software errors, but also in &lt;em&gt;guiding development&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would love to see the adoption of standard type classes recognized by the Haskell compiler that could automatically handle the most common coercions safely. For instance, the compiler could &amp;quot;upgrade&amp;quot; function application to Functor application when the types match. It is beyond me whether this can be done &amp;quot;safely&amp;quot;. I suspect that it cannot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The second is to have more normalized types and type systems so that there is no incidental structure for code to broker between in the first place. To support this we'll see things like row types, unordered tuples, type sets, and so on, and any related type system machinery needed to make all this feasible and convenient.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If modules were programmed to a small, standard set of types (and type classes), they would be more universally applicable. The compiler could &amp;quot;overload&amp;quot; functions automatically. The trick is to keep it safe. At the very least, the &amp;quot;universal&amp;quot; types would help programmers do it manually. We may already be seeing such a convergence.&lt;/p&gt;
&lt;p&gt;Not coincidentally, the built in Clojure data structures are usually all I need. Others appear to think the same. The Clojure ecosystem thrives from the consensus on a small, universal set. There is a lot of reuse and little boilerplate.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://github.com/mmcgrana/ring&quot;&gt;Ring&lt;/a&gt; as an example of a universal datatype facilitating a flourishing community. It allows the problem domain (web programming) to be broken up into subproblems with little-to-no coordination between the groups. Clojure has a number of web frameworks and libraries that are all inter-compatible. I think this is unique among languages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The editor will search for a program to make the types align, show me the program for confirmation if I request it, and then not show this subexpression in the main editor view . . .&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Please give me this editor. It is technically feasible. &lt;a href=&quot;http://www.haskell.org/hoogle/&quot;&gt;Hoogle&lt;/a&gt; can already do a pretty decent search based on the types of functions. All you need is a planner to find a path from one type to another.&lt;/p&gt;
&lt;p&gt;You could even help the search by defining a type class &lt;code&gt;Convertible&lt;/code&gt; like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Convertible a b where
    convert :: a -&amp;gt; b&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All of the instances of &lt;code&gt;Convertible&lt;/code&gt; would form graphs which could be searched for all paths between any two types. The editor could show a list of those paths and let you choose one.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-future-of-programming-pchiusano"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Programming and Scaling</title>
                  <guid isPermalink="false">http://www.lispcast.com/programming-and-scaling</guid>
                  <link>http://tele-task.de/archive/video/flash/14029/</link>
                  <pubDate>Fri 30 Dec 2011 03:27:29 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;A great Alan Kay-esque speech (by none other than Alan Kay himself).&lt;/p&gt;
&lt;p&gt;Alan Kay is a great thinker and I always enjoy his talks, but he needs someone to refine his presentations--particularly his verbal explanations. There are lots of great ideas and perspectives, but mostly he is just saying that &amp;quot;we're doing it wrong&amp;quot;. Much better would be to show us his analysis of a problem.&lt;/p&gt;
&lt;p&gt;In general, I finish his presentations feeling like everyone is doing everything wrong but with no concrete steps to take to correct it. We are thinking wrong (we need better perspectives), we are programming wrong, we are engineering wrong, we are learning the wrong things, we are doing computer science wrong, etc.&lt;/p&gt;
&lt;p&gt;I also finish thinking that a new and better way is possible, but again, with no idea of that better way except a vague notion of less and better code in less time.&lt;/p&gt;
&lt;p&gt;And then here I am, trapped in a world of crappy computers and crappy thinking, with a feeling of unease. I wish he would come down to Earth a little and apply that big brain with its great perspectives to a problem on-camera. It would be concrete and I could learn to emulate his thinking.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/programming-and-scaling"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Coming War on General Purpose Computation</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-coming-war-on-general-purpose-computation</guid>
                  <link>http://boingboing.net/2011/12/27/the-coming-war-on-general-purp.html</link>
                  <pubDate>Wed 28 Dec 2011 07:12:50 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;An insightful talk from Internet activist Cory Doctorow about the future of the freedom of computation.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-coming-war-on-general-purpose-computation"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Mapping Dilemma</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-mapping-dilemma</guid>
                  <link>http://www.infoq.com/presentations/The-Mapping-Dilemma</link>
                  <pubDate>Sat 17 Dec 2011 11:59:54 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;David Nolen speaking at Strange Loop:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How much of Computer Science is sitting around when I'm sitting and working on a problem?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;David draws on some of the giants of Computer Science in recent years. Alan Kay, Gregor Kiczales, Peter Norvig, and more. I love to see the products of great minds folded into Clojure and ready at my fingertips.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/core.match&quot;&gt;core.match&lt;/a&gt; and &lt;a href=&quot;https://github.com/clojure/core.logic&quot;&gt;core.logic&lt;/a&gt; are now on my reading list.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-mapping-dilemma"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>multimethod.js</title>
                  <guid isPermalink="false">http://www.lispcast.com/multimethod-js</guid>
                  <link>http://krisjordan.com/multimethod-js</link>
                  <pubDate>Fri 16 Dec 2011 07:56:50 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Kris Jordan:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Inspired by Clojure's multimethods, multimethod.js provides a functional alternative to classical, prototype based polymorphism.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KrisJordan/multimethod-js&quot;&gt;multimethod.js&lt;/a&gt; builds functions which dispatch on arbitrary predicates in Javascript using a &lt;a href=&quot;http://martinfowler.com/bliki/FluentInterface.html&quot;&gt;fluent style&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Multimethod iterates through each 'method' registered with &lt;code&gt;when&lt;/code&gt; and performs an equality test on the &lt;code&gt;dispatchValue&lt;/code&gt; and each method's match value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wonder whether a linear search for the dispatch value will scale. I prefer to see some kind of hash-map based solution. Is it possible to serialize the object to JSON and use the resulting String as a key?&lt;/p&gt;
&lt;p&gt;Still, I enjoy seeing inter-language cross-pollination. It is also a nice translation from a functional language to a prototype language. The fluent interface does the job extremely well.&lt;/p&gt;
&lt;p&gt;Kris Jordan deserves a follow on &lt;a href=&quot;https://github.com/KrisJordan&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/multimethod-js"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Ring 1.0.0 Released</title>
                  <guid isPermalink="false">http://www.lispcast.com/ring-1.0-release</guid>
                  <link>http://groups.google.com/group/ring-clojure/browse_thread/thread/f18338ffda7e38f5</link>
                  <pubDate>Tue 13 Dec 2011 09:37:46 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;Congratulations to the Ring developers on finishing the 1.0.0 Release.&lt;/p&gt;
&lt;p&gt;James Reeves:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ring 1.0.0 has now been released, almost three years since Mark pushed the first commit. In that time, Ring has become the de facto standard for building web applications in Clojure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ring deserves its place as the &amp;quot;de facto standard&amp;quot;. It is the perfect example of what makes Clojure great. It encourages composition and simplicity and creates an abstraction that allows an entire ecosystem to flourish.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://github.com/mmcgrana/ring/blob/master/SPEC&quot;&gt;Ring Spec&lt;/a&gt; and the &lt;a href=&quot;https://github.com/mmcgrana/ring&quot;&gt;Ring source&lt;/a&gt;. They both short and well-written.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/ring-1.0-release"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure for dummies: a kata</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-for-dummies-a-kata</guid>
                  <link>http://java.dzone.com/articles/clojure-dummies-kata-0</link>
                  <pubDate>Sat 10 Dec 2011 05:24:48 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;It's good to see someone trying Clojure and sharing his experiences. Congratulations are due for getting it up and running and finishing a kata.&lt;/p&gt;
&lt;p&gt;Giorgio Sironi:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Clojure is a LISP dialect; if you have ever been forced to use LISP in a computer science class, I understand your resistance towards this class of totally functional languages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I appreciate his honesty here. Universities have traditionally used Lisp to teach functional programming. They often neglect to mention that mosts Lisps are &lt;em&gt;not&lt;/em&gt; purely functional. In fact, they lie to the students in the name of pedagogy. People leave Programming Languages class with many false notions about Lisp.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In fact, LISP for many of us means lots of Reverse Polish Notation where (+ 1 2) evaluates to three; absence of for cycles &lt;em&gt;[loops]&lt;/em&gt; and other commodities to privilege tail recursion; and absolute lack of state in the form of variables (the state isn't really absent: I've seen it on the stack.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In &lt;a href=&quot;http://en.wikipedia.org/wiki/Reverse_Polish_notation&quot;&gt;Reverse Polish notation&lt;/a&gt;, the same expression would be &lt;code&gt;(2 1 +)&lt;/code&gt;. Lisp uses &lt;a href=&quot;http://en.wikipedia.org/wiki/Polish_notation&quot;&gt;Polish notation&lt;/a&gt;, otherwise known as Prefix notation.&lt;/p&gt;
&lt;p&gt;Common Lisp, in fact, has &lt;em&gt;more loops than Java&lt;/em&gt;. Java has &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, and the sadder &lt;code&gt;do..while&lt;/code&gt; loops. Common Lisp's &lt;code&gt;loop&lt;/code&gt; macro alone trumps any other language I know for &lt;em&gt;imperative&lt;/em&gt; and &lt;em&gt;stateful&lt;/em&gt; iteration. In addition to &lt;code&gt;loop&lt;/code&gt;, Common Lisp defines &lt;a href=&quot;http://clhs.lisp.se/Body/m_dotime.htm&quot;&gt;&lt;code&gt;dotimes&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;http://clhs.lisp.se/Body/m_dolist.htm&quot;&gt;&lt;code&gt;dolist&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;http://clhs.lisp.se/Body/m_do_do.htm&quot;&gt;&lt;code&gt;do&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;http://clhs.lisp.se/Body/m_do_do.htm&quot;&gt;&lt;code&gt;do*&lt;/code&gt;&lt;/a&gt; (a variation on &lt;code&gt;do&lt;/code&gt;), and the loops for symbols in a package &lt;a href=&quot;http://clhs.lisp.se/Body/m_do_sym.htm&quot;&gt;&lt;code&gt;do-symbols&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;http://clhs.lisp.se/Body/m_do_sym.htm&quot;&gt;&lt;code&gt;do-external-symbols&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;http://clhs.lisp.se/Body/m_do_sym.htm&quot;&gt;&lt;code&gt;do-all-symbols&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The fact that a non-lisper believes something about Lisp so false yet so common hints that something is very wrong. The misconception &amp;quot;absolute lack of state in the form of variables&amp;quot; will be familiar to many Lisp programmers who talk to non-lispers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Download and unzip the last release of Clojure. Start up a class by specifying clojure-1.3.0.jar in the classpath :&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;    java -cp clojure-1.3.0.jar clojure.main&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It's nice that Clojure is so easy to run.&lt;/p&gt;
&lt;p&gt;Again, thumbs up to Giorgio for finishing a kata in a new language. Keep up with the Clojure!&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-for-dummies-a-kata"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>A Short Ballad Dedicated to the Growth of Programs</title>
                  <guid isPermalink="false">http://www.lispcast.com/growth-ballad</guid>
                  <link>http://cognitivecomputing.wordpress.com/1986/01/28/a-short-ballad-dedicated-to-the-growth-of-programs/</link>
                  <pubDate>Sat 10 Dec 2011 12:43:00 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;This is a cautionary tale set in a dystopian Lisp where &lt;code&gt;nil&lt;/code&gt; is not false and false is not &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So I went back to the master and appealed once again&lt;br /&gt; I said, pardon me, but now I’m really insane&lt;br /&gt; He said, no you’re not really going out of your head&lt;br /&gt; Instead of just &lt;code&gt;VAL&lt;/code&gt;, you must use &lt;code&gt;NOT NULL&lt;/code&gt; instead&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;nil&lt;/code&gt; means (traditionally) false, the empty list, and also &amp;quot;no value&amp;quot;. In my opinion, Lisp has hit a sweet spot. Somehow, &lt;code&gt;nil&lt;/code&gt; overloading makes for succinct programs.&lt;/p&gt;
&lt;p&gt;It's possible to go overboard and do this wrong. Case in point: &lt;a href=&quot;http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN&quot;&gt;the problems with boolean values and comparison in Javascript&lt;/a&gt;.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/growth-ballad"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>The Heart of Unix</title>
                  <guid isPermalink="false">http://www.lispcast.com/the-heart-of-unix</guid>
                  <link>http://www.lispcast.com/the-heart-of-unix</link>
                  <pubDate>Sat 10 Dec 2011 10:56:42 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;Despite all of its warts, I like working in Linux. I've used it for 15 years and I've never been as productive in another environment. Most people claim that it's the configurability of Linux that keep the users coming. That may have attracted me at first, but &lt;strong&gt;what attracts me now is its programmability.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let me be very clear. I'm not saying that Linux is great because I can patch the source code to grep and recompile it. In all my years of Unix, I've never done anything like that. And I'm not saying that Linux is a great workstation for programmers because it helps you program better. Those are topics for another essay.&lt;/p&gt;
&lt;h3 id=&quot;unix-is-a-programmable-environment&quot;&gt;Unix is a programmable environment&lt;/h3&gt;
&lt;p&gt;I &lt;em&gt;am&lt;/em&gt; saying that Unix is a programmable environment. When you interact with the shell, &lt;strong&gt;you are writing programs to be interpreted&lt;/strong&gt;. You can easily extend the Unix system by writing a shell script, copying it to a directory in your &lt;code&gt;PATH&lt;/code&gt;, and making it executable. Boom. You've got a new program.&lt;/p&gt;
&lt;p&gt;What's more, that program, if it follows certain simple conventions, is now able to work with other programs. Those conventions are simple, and they are summed up well by Doug McIlroy, the inventor of Unix pipes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If your program &lt;em&gt;reads text lines from standard in and writes text lines on standard out&lt;/em&gt;, it is likely to do well on Unix.&lt;/p&gt;
&lt;h3 id=&quot;programs-on-your-path-are-like-pure-functions-in-the-higher-level-language-called-the-shell&quot;&gt;Programs on your path are like pure functions in the higher-level language called the shell&lt;/h3&gt;
&lt;p&gt;Not all programs are so pure. But the vast majority of the programs that are so typically Unixy are. &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;wc&lt;/code&gt;, &lt;code&gt;pr&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h3 id=&quot;unix-is-a-multi-lingual-environment&quot;&gt;Unix is a multi-lingual environment&lt;/h3&gt;
&lt;p&gt;I must have compilers or interpreters for 30 languages on my machine. Maybe more. All of these languages are invited to the party. They can all call each other (through the shell). And of course their &lt;code&gt;stdin&lt;/code&gt;/&lt;code&gt;stdouts&lt;/code&gt; can be piped together.&lt;/p&gt;
&lt;p&gt;You really can use the best tool for the job. I've got Bash scripts, awk scripts, Python scripts, some Perl scripts. What I program in at the moment depends on my mood and practical considerations. It is a little crazy that &lt;strong&gt;I don't have to think about what language something is written in when I'm at the terminal&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;unix-provides-a-universal-interface-with-a-universal-data-structure&quot;&gt;Unix provides a universal interface with a universal data structure&lt;/h3&gt;
&lt;p&gt;It needs to be stated that there is a reason all of these languages can work together. There is a standard data structure that programs are invited to use: text streams. That means sequences of characters. Text streams are cool because they're simple and flexible. &lt;strong&gt;You can impose a structure on top of the flat sequence.&lt;/strong&gt; For instance, you can break it into a sequence of sequences of characters by splitting it on a certain character (like new-line). Then you can split those sequences into columns. In short, text is flexible.&lt;/p&gt;
&lt;h3 id=&quot;unix-is-homoiconic&quot;&gt;Unix is homoiconic&lt;/h3&gt;
&lt;p&gt;There's another property that I think is rarely talked about in the context of Unix. In Lisp, we often are proud that code is data. You can manipulate code with the same functions that you manipulate other data structures. This meta-circularity gives you a lot of power.&lt;/p&gt;
&lt;p&gt;But this is the same in Unix. &lt;strong&gt;Your programs are text files&lt;/strong&gt; and so can be &lt;code&gt;grep&lt;/code&gt;'d and &lt;code&gt;wc&lt;/code&gt;'d and anything else if you want to. You can open up a pipe to Perl and feed it commands, if you like. And this feeds right back into Unix being programmable.&lt;/p&gt;
&lt;h3 id=&quot;functional-universal-data-structure-homoiconic-power&quot;&gt;Functional + universal data structure + homoiconic = power&lt;/h3&gt;
&lt;p&gt;All of this adds up to synergy. When you write a program that follows the Unix conventions of &lt;code&gt;stdin&lt;/code&gt;/&lt;code&gt;stdout&lt;/code&gt; with text streams, &lt;strong&gt;it can work with thousands of programs that are already on your computer&lt;/strong&gt;. What's more, your program has to do less work itself, because so much of the hard work can be done better by other programs.&lt;/p&gt;
&lt;h3 id=&quot;on-the-file-system-hierarchical-names-point-to-data-objects&quot;&gt;On the file system, hierarchical names point to data objects&lt;/h3&gt;
&lt;p&gt;And this synergy extends well beyond just using text streams. I have this tendency to look to databases as storage solutions for my personal projects. They have some nice properties, like ACID and SQL.But by using a database, I'm missing out on joining the Unix ecosystem. &lt;strong&gt;If I use the file system to store my data--meaning text files in directories--I can use all of Unix to help me out.&lt;/strong&gt; I can use &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;, etc., just because I chose to use the measly file system instead of some fancy database.&lt;/p&gt;
&lt;h3 id=&quot;blog-example&quot;&gt;Blog example&lt;/h3&gt;
&lt;p&gt;A good example of the synergy I'm talking about is the blog you are reading now. Here's how my blog works:&lt;/p&gt;
&lt;p&gt;I store everything on the file system. I have an &lt;code&gt;src/&lt;/code&gt; directory with &lt;code&gt;drafts/&lt;/code&gt; &lt;code&gt;posts/&lt;/code&gt; &lt;code&gt;pages/&lt;/code&gt; and &lt;code&gt;links/&lt;/code&gt;. I wrote a Python script (currently at 183 well-commented lines) that reads &lt;code&gt;src/&lt;/code&gt; and spits out the final product to &lt;code&gt;build/&lt;/code&gt;. The Python uses a few libraries, but the meat of it is done by calling other programs. The rendering of Markdown to HTML is done by &lt;a href=&quot;http://johnmacfarlane.net/pandoc/&quot;&gt;&lt;code&gt;pandoc&lt;/code&gt;&lt;/a&gt;, which happens to be written in Haskell. I also do a call out to the shell to copy a directory (&lt;code&gt;cp -rp&lt;/code&gt;) because I was too lazy to figure out how to do it in pure Python.&lt;/p&gt;
&lt;p&gt;I sync &lt;code&gt;build/&lt;/code&gt; to Amazon S3 with a Ruby program called &lt;code&gt;s3sync&lt;/code&gt;. I edit my entries in Emacs. If I need to delete a post, I run &lt;code&gt;rm&lt;/code&gt;. If I need to list my posts, I run &lt;code&gt;ls&lt;/code&gt;. If I'd like to change the name of a post, I use &lt;code&gt;mv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It may not be the best interface for writing a blog. But notice all of the stuff I didn't have to write to get started. I'm already writing posts and publishing them. &lt;strong&gt;Compare that to the reams of PHP and Javascript it takes to get the same functionality in Wordpress.&lt;/strong&gt; That's the power of small tools working together.&lt;/p&gt;
&lt;h3 id=&quot;unix-is-old&quot;&gt;Unix is old&lt;/h3&gt;
&lt;p&gt;Now that I've expressed how great Unix is, allow me to speak about its numerous shortcomings. I can't say for sure, but I would guess that most of the shortcomings are due to the long history of &lt;strong&gt;Unix starting on underpowered machines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For instance, the fact that your programs have to be manually stored to disk using file system operations so that your dynamic shell language can have access to them seems awfully quaint. But when Unix was developed, disk space, RAM, and computation were expensive. Everything was expensive. So the strategy was to &lt;strong&gt;cache your compiler output to disk&lt;/strong&gt; so you wouldn't have to do a costly compile step each time you ran a program.&lt;/p&gt;
&lt;p&gt;If I want to write a new program, even a short one, I have to open up a text file in Emacs (make sure it's in the path!), write the program, save it, switch to the terminal, and &lt;code&gt;chmod +x&lt;/code&gt; it. Compare that to Clojure, where you constantly define and redefine functions at the REPL. Or, if you like, a Smalltalk system where you can open up the editing menu of &lt;em&gt;anything you can see&lt;/em&gt; and change the code which will then be paged out to disk at a convenient time. Unix clearly has room to grow in that respect.&lt;/p&gt;
&lt;h3 id=&quot;the-file-system&quot;&gt;The file system&lt;/h3&gt;
&lt;p&gt;The file system is archaic, too. It's reliable, but a little feature-poor. It's one of the reasons I think first about a database before remembering the synergy available with the file system. It doesn't provide any kind of ACID properties. The metadata available is laughable (permissions, owner/group, date, and filesize?). &lt;strong&gt;A more modern file system would give a little more oomph&lt;/strong&gt; to compete with other forms of storage.&lt;/p&gt;
&lt;h3 id=&quot;the-terminal&quot;&gt;The terminal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The terminal is just old.&lt;/strong&gt; It's all text. The editing is sub-primitive. The help it gives you is the bare minimum. One of its biggest shortcomings is how opaque it is. It doesn't do much to help you learn commands. It's not very good with huge dumps on &lt;code&gt;stdout&lt;/code&gt;. Multiline commands? Supported with &lt;code&gt;\&lt;/code&gt;. I think we can do better.&lt;/p&gt;
&lt;h3 id=&quot;text-streams&quot;&gt;Text streams&lt;/h3&gt;
&lt;p&gt;The world of computers has grown up a lot since the early days of Unix. There has been a Cambrian explosion in the number of file formats. Lots of them are binary formats. Lots are structured text, like XML or JSON. Unix can handle those kinds of files, but &lt;strong&gt;it has failed to find a lever to help the Unix user master them with the same synergy you see with flat text files&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;wrong-turns&quot;&gt;Wrong turns&lt;/h3&gt;
&lt;p&gt;Unix has a long history. Some of that history was kind, some was unkind. Most of the development of Unix was just practical people doing their best with the tools they had.&lt;/p&gt;
&lt;p&gt;What's unfortunate is that we now have better tools and we see what could be done, but to do it would break backwards compatibility. And so we continue with sub-optimal tools.&lt;/p&gt;
&lt;h3 id=&quot;layering-instead-of-evolving&quot;&gt;Layering instead of evolving&lt;/h3&gt;
&lt;p&gt;One thing I think is unfortunate in the world of Unix today is layering. &lt;strong&gt;Modern Linux distributions are midden piles of configuration daemons to manage permissions daemons to give your configuration GUI access to the configuration daemons.&lt;/strong&gt; Or we find ourselves installing a database to manage a few kilobytes of metadata.&lt;/p&gt;
&lt;p&gt;The problem is Unix has not evolved in those areas. The permission system has changed very little. Modern distributions want to provide a modern and unintrusive interface to protected resources, so they add a layer of indirection onto the primitive permissions model instead of evolving the permission system itself. The Unix permissions system is solid and has worked for years. Maybe it should stay. But instead of giving us small programs that do one thing well to let us become masters of the permissions system, &lt;strong&gt;we get obtuse, opaque daemons&lt;/strong&gt; that also need to be learned.&lt;/p&gt;
&lt;p&gt;The file system, though much improved in terms of capacity, stability, and reliability, still has the same basic features: hierarchical directories containing files, accessed by name. If you want something more, you have to add a layer like BerkeleyDB or SQLite. These tools are great, but I'd like to see a more Unixy solution that allows for the synergy you get from existing programs made to run with files on the disk.&lt;/p&gt;
&lt;h3 id=&quot;megacommands&quot;&gt;Megacommands&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/1091803&quot;&gt;Command bloat&lt;/a&gt; &lt;a href=&quot;https://gist.github.com/665971&quot;&gt;is terrible&lt;/a&gt;. Rob Pike and Brian Kernighan have &lt;a href=&quot;http://harmful.cat-v.org/cat-v/&quot;&gt;written about this&lt;/a&gt;. I'll merely refer you to their &lt;a href=&quot;/files/papers/unix_prog_design.pdf&quot;&gt;excellent paper&lt;/a&gt;. The gist is that having n commands gives you O(n&lt;sup&gt;2&lt;/sup&gt;) ways of combining them. &lt;strong&gt;Having fewer, bigger, &amp;quot;more powerful&amp;quot; programs does not give you this exponential and synergistic advantage.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you look at it the right way, all of these little programs that do one thing are like functions in the higher-level language that is Unix. We see that languages like Perl and Python have huge numbers of libraries for doing all sorts of tasks. Those libraries are only accessible through the programming language they were developed for. This is a missed opportunity for the languages to interoperate synergistically with the rest of the Unix ecosystem.&lt;/p&gt;
&lt;h3 id=&quot;the-road-ahead&quot;&gt;The road ahead&lt;/h3&gt;
&lt;p&gt;I've given a bit of a taste of some of the non-Unixy directions we're going in. Now I'd like to end with some right directions.&lt;/p&gt;
&lt;p&gt;I mentioned before that saving a compiled binary to disk is done to cache what used to be an expensive operation. With modern hardware, a short utility C program could be read in, parsed, compiled, and run very quickly. Probably with no noticeable delay. It's something to consider when thinking about the division between static programs and dynamic scripting languages and the role of the compiler.&lt;/p&gt;
&lt;h3 id=&quot;talking-to-unix&quot;&gt;Talking to Unix&lt;/h3&gt;
&lt;p&gt;Foreign Function Interfaces between programming languages are considered very difficult to work with because of the semantics mismatch between any two languages. But Unix provides a universal interface for programs to &lt;strong&gt;interoperate without the need for FFI&lt;/strong&gt;. I hope to see more &amp;quot;sugar&amp;quot; in languages to take advantage of calling out to other programs for help. &lt;a href=&quot;http://stackoverflow.com/questions/799968/whats-the-difference-between-perls-backticks-system-and-exec&quot;&gt;Perl's backticks&lt;/a&gt; comes to mind.&lt;/p&gt;
&lt;p&gt;You might say that this is expensive. Well, yes and no. Yes, there is much more overhead in reading in who-knows-how-many files to execute some script on disk than in just calling some library function. I argue, though, that &lt;strong&gt;the time difference is becoming small enough not to matter&lt;/strong&gt;; and the operating system should evolve to make it more practical.&lt;/p&gt;
&lt;h3 id=&quot;evolving-stdinstdout&quot;&gt;Evolving &lt;code&gt;stdin&lt;/code&gt;/&lt;code&gt;stdout&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Stdin/stdout with text streams is the closest thing we have to a universal, language-agnostic interface. It defines a minimal &amp;quot;constitution&amp;quot; with which programs can interact. &lt;strong&gt;Can this interface be improved on without destroying it?&lt;/strong&gt; I wouldn't doubt it. There are lots of &amp;quot;data flow&amp;quot; patterns besides input and output. Pub/sub, broadcast, dispatch, etc., should be explored.&lt;/p&gt;
&lt;h3 id=&quot;text-streams-evolved&quot;&gt;Text streams, evolved&lt;/h3&gt;
&lt;p&gt;Unix was designed for flat text and the existing Unix tools operate on text. We need new tools to &lt;strong&gt;bring structured text and binary into the Unix world&lt;/strong&gt; to join the party. I don't think this would be hard. I've written programs that read in JSON and write it out with one JSON object per line. That lets you grep it to find the one you want, or &lt;code&gt;wc -l&lt;/code&gt; it to count the objects.&lt;/p&gt;
&lt;p&gt;Another thing I've been working on is defining a dispatch mechanism for common operations on files of different types. Take, for instance, metadata that is stored in a file. An HTML file has a title, sometimes it has an author (in a meta tag), etc. A JPEG file has metadata in the EXIF data. &lt;strong&gt;Is there some way we can unify the access of that metadata?&lt;/strong&gt; I think there is and I'm working on it. The same command would dispatch differently based on mime-type.&lt;/p&gt;
&lt;h3 id=&quot;st-century-terminal&quot;&gt;21st Century Terminal&lt;/h3&gt;
&lt;p&gt;How can we improve the terminal? I think it's a hard problem but not impossible. Part of the issue with the terminal is that as X Windows developed, people started using menus to run monolithic programs instead of piping things with the shell. So the usefulness of the terminal will be improved, without changing the terminal itself, by &lt;strong&gt;breaking those monolithic programs up into composable programs&lt;/strong&gt;. For instance, a program which displays all of the thumbnails of the files listed on &lt;code&gt;stdin&lt;/code&gt; would be much more useful to me than a mouse-oriented file browser.&lt;/p&gt;
&lt;p&gt;The terminal is about text. I don't think that could or should change. But does it have to be only about text? &lt;a href=&quot;http://acko.net/blog/on-termkit&quot;&gt;Explorations&lt;/a&gt; are underway.&lt;/p&gt;
&lt;h3 id=&quot;the-shell&quot;&gt;The Shell&lt;/h3&gt;
&lt;p&gt;The last improvement I want to touch on is the shell language itself. Bash is ugly. There. I said it. A lot of good work has been done in programming language design and I'd like to see some of it make its way to the shell. &lt;strong&gt;What if we take the idea of Unix programs as pure functions over streams of data a little further?&lt;/strong&gt; What about higher-order functions? Or function transformations? Combinators? &lt;strong&gt;What if we borrow from object-oriented languages?&lt;/strong&gt; Can we have message passing? What about type-based dispatching?&lt;/p&gt;
&lt;h3 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;Unix has always been practical and it has proven itself over the years. It's 40 years old and it's still being used. Furthermore, Unix is the closest thing to a personal computing experience&lt;sup&gt;&lt;a href=&quot;#fn1&quot; class=&quot;footnoteRef&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; that is practical today.&lt;/p&gt;
&lt;p&gt;People tend to &lt;a href=&quot;/files/papers/LispGoodNewsBadNews.pdf&quot;&gt;contrast Unix&lt;/a&gt; with systems like the Lisp Machine and Smalltalk. But I see &lt;strong&gt;more similarities than differences&lt;/strong&gt;: &lt;em&gt;Code as data.&lt;/em&gt; &lt;em&gt;Everything is programmable.&lt;/em&gt; &lt;em&gt;Dynamic language prompt.&lt;/em&gt; &lt;em&gt;Universal data structure.&lt;/em&gt; &lt;em&gt;A propensity for &amp;quot;dialects&amp;quot; or &amp;quot;distributions&amp;quot;.&lt;/em&gt; &lt;em&gt;Garbage collection.&lt;/em&gt;&lt;sup&gt;&lt;a href=&quot;#fn2&quot; class=&quot;footnoteRef&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; Unix just made a lot of compromises to make it practical on the limited hardware that was available.&lt;/p&gt;
&lt;p&gt;Unfortunately, those compromises have stuck. A lot of work went into workarounds and a lot of software has been built on top of those design decisions. The question is: &lt;strong&gt;where to go from here?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My own personal choice is to go &lt;strong&gt;back to the roots&lt;/strong&gt;. Often, when we want to make a change, we must look to what has worked in the past. What has brought us this far? What were the things that made Unix special? Unix was built by individuals all adding their own practical knowledge and hard work into one cohesive system. Their individual work was multiplied by the synergy of a common interface. If we want to evolve Unix (and I do), that common interface--the heart of Unix--is the place to start.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;&lt;p&gt;When I say &amp;quot;personal computer&amp;quot;, I'm referring to &lt;a href=&quot;http://www.mprove.de/diplom/gui/kay72.html&quot;&gt;Alan Kay's vision&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What then is a personal computer? One would hope that it would be both a medium for containing and expressing arbitrary symbolic notions, and also a collection of useful tools for manipulating these structures, with ways to add new tools to the repertoire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;a href=&quot;#fnref1&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot;&gt;&lt;p&gt;Unix has a limited form of garbage collection. Short-running programs (like those executed at the terminal) need not concern themselves with freeing allocated memory since the OS will free everything when they exit.&lt;a href=&quot;#fnref2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/the-heart-of-unix"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Tips for using marginalia</title>
                  <guid isPermalink="false">http://www.lispcast.com/tips-for-marginalia</guid>
                  <link>http://www.lispcast.com/tips-for-marginalia</link>
                  <pubDate>Thu 08 Dec 2011 03:28:12 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;I've used &lt;a href=&quot;https://github.com/fogus/marginalia&quot;&gt;Marginalia&lt;/a&gt; a tiny bit for a few of the libraries I've developed that actually have comments and doc strings.&lt;/p&gt;
&lt;p&gt;Marginalia did help me refine my doc strings and comments. From the &lt;a href=&quot;http://fogus.me/fun/marginalia/&quot;&gt;Marginalia docs&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Following the guidelines will work to make your code not only easier to follow – it will make it better. The very process of using Marginalia will help to crystalize your understanding of problem and its solution(s).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In general, this is true. Marginalia follows some strict rules, like a compiler. Even if your comments seem to make sense to you reading the source, Marginalia might produce something that makes no sense. However, it generates attractive and useful documentation. So I decided to use it.&lt;/p&gt;
&lt;p&gt;What this meant was figuring out some of the quirks of Marginalia. Here is what I've learned:&lt;/p&gt;
&lt;h3 id=&quot;dont-use--comments-when-a-doc-string-is-more-appropriate&quot;&gt;Don't use ;-comments when a doc string is more appropriate&lt;/h3&gt;
&lt;p&gt;This is good advice in general and Marginalia makes the comments look wrong. In Marginalia, comments seem to follow the docstring for the function they apply to when both are defined.&lt;/p&gt;
&lt;h3 id=&quot;blank-lines-are-important&quot;&gt;Blank lines are important&lt;/h3&gt;
&lt;p&gt;From what I can tell, a blank line will cause the top-level comment to be placed above the following form. No blank line will put them at the same level. That sounds very sensible.&lt;/p&gt;
&lt;p&gt;However, if you have a comment with no blank line immediately before a function, the docstring for that function will come first, followed by the comment. This is weird. You should follow the advice above and choose docstring or comments, but not both.&lt;/p&gt;
&lt;h3 id=&quot;namespace-ordering&quot;&gt;Namespace ordering&lt;/h3&gt;
&lt;p&gt;There is a convention in Clojure to use project.core as the main namespace of a library. Marginalia sorts the namespaces alphabetically. This means that in the documentation, project.anunimportantmodule comes before project.core.&lt;/p&gt;
&lt;p&gt;I have renamed my namespaces once to avoid this problem. But in general, my projects are very small and don't have many namespaces. It's not a practical problem.&lt;/p&gt;
&lt;p&gt;Marginalia is great. It produces beautiful documentation. And it has helped me clarify my code.&lt;/p&gt;
&lt;p&gt;Nice job.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/tips-for-marginalia"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Janki Method</title>
                  <guid isPermalink="false">http://www.lispcast.com/janki-method</guid>
                  <link>http://www.jackkinsella.ie/2011/12/05/janki-method.html</link>
                  <pubDate>Thu 08 Dec 2011 02:48:33 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Jack Kinsella describes an excellent method for learning &lt;em&gt;any&lt;/em&gt; skill, disguised as a method for learning programming.&lt;/p&gt;
&lt;p&gt;He draws on his own personal experiences using &lt;a href=&quot;http://ankisrs.net/&quot;&gt;Anki&lt;/a&gt; (a nice learning tool which I recommend, too; I've used it to learn foreign languages) to help him learn the huge number of commands, functions, and other arcana that we all either grep from memory or Google constantly as we work. He sums everything up in eight rules which define the Janki Method.&lt;/p&gt;
&lt;p&gt;Here's an example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The eighth rule of Janki encourages you to use your readings of other people’s code as a source of learning:&lt;/p&gt;
&lt;p&gt;&amp;quot;Read code regularly. If you come across something interesting – be that an algorithm, a hack, or an architectural decision – create a card detailing the technique and showing the code.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the article, you'll find solid examples of flashcards chunked down to the right bite-size.&lt;/p&gt;
&lt;p&gt;The hardest part of the Method is to stick to it. He suggests rule 2:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The second rule of Janki encourages a commitment to daily learning:&lt;/p&gt;
&lt;p&gt;&amp;quot;You must use Anki every single day- including weekends and holidays – and commit to doing so indefinitely.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can't say this seems realistic, even with the five- to eight-minute daily commitment he claims. I have used Anki for long stretches. Two months was my longest. It is true that it doesn't take long each time. The trouble is the same trouble you have starting any new habit. It's just hard.&lt;/p&gt;
&lt;p&gt;I have had luck using Anki in an opposite way: one hour per day for a week. For some reason, it's easier for me to commit to than an indefinite commitment. You don't get the same benefits. The benefits are different.&lt;/p&gt;
&lt;p&gt;And, finally, the great thing about Anki is that it is very forgiving if you do stop using it regularly. If you take a two-week break, you can start up again with very little fuss.&lt;/p&gt;
&lt;p&gt;Some ideas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use Anki to remember Emacs keystrokes/commands&lt;/li&gt;
&lt;li&gt;Use Anki to learn the Vars in clojure.core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jack manages to bring together the ideas of spaced repetition, learning by doing, and continuous self-improvement to give practical advice to make us better at what we do.&lt;/p&gt;
&lt;p&gt;Nice job.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/janki-method"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Waving Our Tentacles</title>
                  <guid isPermalink="false">http://www.lispcast.com/waving-our-tentacles</guid>
                  <link>http://blog.raynes.me/blog/2011/12/02/waving-our-tentacles/</link>
                  <pubDate>Thu 08 Dec 2011 02:27:22 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;Anthony Grimes shows off his Clojure interface to the Github API.&lt;/p&gt;
&lt;p&gt;I'm definitely going to check this out. There are some people I'd like to stalk . . .&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/waving-our-tentacles"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Clojure/West</title>
                  <guid isPermalink="false">http://www.lispcast.com/clojure-west</guid>
                  <link>http://clojurewest.org/</link>
                  <pubDate>Thu 08 Dec 2011 10:13:25 AM ART</pubDate>
                  <description>
                    
&lt;blockquote&gt;
&lt;p&gt;Clojure/West is a new conference bringing the Clojure community together to discuss techniques, tools, and the state of the Clojure ecosystem March 16-17th for three tracks of sessions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I sure wish I could go hang out with other Clojurians. It's lonely here by myself. The conference looks like it will be fun and informative.&lt;/p&gt;
&lt;p&gt;Registration is open:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.regonline.com/clojurewest2012&quot;&gt;For the conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.regonline.com/clojurewest2012training&quot;&gt;For the training&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/clojure-west"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Seesaw REPL Tutorial</title>
                  <guid isPermalink="false">http://www.lispcast.com/seesaw-repl-tutorial</guid>
                  <link>https://gist.github.com/1441520</link>
                  <pubDate>Thu 08 Dec 2011 09:07:53 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;Dave Ray has written a commented source listing which guides you through building a simple GUI with Seesaw.&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;; How can we get to the radio buttons without using the rbs var? How about
; with a selector:
(select f [:JRadioButton])
;=&amp;gt; (#&amp;lt;JRadioButton ... &amp;gt; #&amp;lt;JRadioButton ... &amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;. . .&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;; and, of course, you can register a listener for group selection changes
(listen group :selection 
    (fn [e] 
      (when-let [s (selection group)] 
        (println &amp;quot;Selection is &amp;quot; (id-of s)))))&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have only done a bit of GUI programming with Java (mostly in college). But rather than giving me flashbacks to that nightmare, &lt;a href=&quot;https://github.com/daveray/seesaw&quot;&gt;Seesaw&lt;/a&gt; makes me feel secure that I could face the Swing dragon again.&lt;/p&gt;
&lt;p&gt;From the Seesaw readme:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It's an experiment to see what I can do to make user interface development funner in Clojure.&lt;/p&gt;
&lt;/blockquote&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/seesaw-repl-tutorial"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>A Bizarre and Beautiful Lisp Learning Tool</title>
                  <guid isPermalink="false">http://www.lispcast.com/lisp-academy</guid>
                  <link>http://www.lispcast.com/lisp-academy</link>
                  <pubDate>Wed 07 Dec 2011 05:32:55 PM ART</pubDate>
                  <description>
                    
&lt;p&gt;&lt;a href=&quot;http://whalliburton.github.com/academy/&quot;&gt;⚡ ⚕ Welcome to the academy. ⚛ ♬&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This appears to be a way to learn Common Lisp. It intrigues me because of the esoteric flavor of it.&lt;/p&gt;
&lt;p&gt;From the top of the page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Genesis&lt;/p&gt;
&lt;p&gt;In the beginning Man created the computer. Now the computer was formless and empty, darkness was over the surface of the deep, and the Spirit of Man was hovering over the terminal.&lt;/p&gt;
&lt;p&gt;And Man said, &amp;quot;Let there be lisp,&amp;quot; and there was lisp. Man saw that the lisp was good.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is followed by a rendering of the &lt;a href=&quot;http://en.wikipedia.org/wiki/I_Ching&quot;&gt;I Ching&lt;/a&gt;, an inline rendering of the game of life, and references to movies and music.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/lisp-academy"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>


                <item>
                  <title>Reborn!</title>
                  <guid isPermalink="false">http://www.lispcast.com/from-humble-beginnings</guid>
                  <link>http://www.lispcast.com/from-humble-beginnings</link>
                  <pubDate>Tue 06 Dec 2011 10:37:05 AM ART</pubDate>
                  <description>
                    
&lt;p&gt;LispCast has been reborn from the ashes of its former existence.&lt;/p&gt;
&lt;p&gt;Please stay tuned.&lt;/p&gt;


                    &lt;p&gt;&lt;center&gt;&lt;a href="http://www.lispcast.com/from-humble-beginnings"&gt;Read full post&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

                  </description>
                </item>

	</channel>
</rss>
