<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Articles tagged clojure at null program</title>
  <link rel="alternate" type="text/html"
        href="https://nullprogram.com/tags/clojure/"/>
  <link rel="self" type="application/atom+xml"
        href="https://nullprogram.com/tags/clojure/feed/"/>
  <updated>2026-04-09T13:25:45Z</updated>
  <id>urn:uuid:cf08ecce-d0a4-4d39-a3fc-aacc66a4cf9b</id>

  <author>
    <name>Christopher Wellons</name>
    <uri>https://nullprogram.com</uri>
    <email>wellons@nullprogram.com</email>
  </author>

  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Clojure-style Multimethods in Emacs Lisp</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2013/12/18/"/>
    <id>urn:uuid:029f9acb-a29f-3e58-14f3-457f245cdb5d</id>
    <updated>2013-12-18T23:06:15Z</updated>
    <category term="emacs"/><category term="elisp"/><category term="clojure"/>
    <content type="html">
      <![CDATA[<p>This past week I added <a href="http://clojure.org/multimethods">Clojure-style multimethods</a> to Emacs
Lisp through a package I call <code class="language-plaintext highlighter-rouge">predd</code> (predicate dispatch). <strong>I
believe it is Elisp’s very first complete <em>multiple dispatch</em> object
system!</strong> That is, methods are dispatched based on the dynamic,
run-time type of <a href="http://en.wikipedia.org/wiki/Multimethods">more than one of its arguments</a>.</p>

<ul>
  <li><a href="https://github.com/skeeto/predd">https://github.com/skeeto/predd</a></li>
</ul>

<p>(Unfortunately I was unaware of the
<a href="https://github.com/kurisuwhyte/emacs-multi">other Clojure-style multimethod library</a> when I wrote mine.
However, my version is <em>much</em> more complete, has better performance,
and is public domain.)</p>

<p>As of version 23.2, Emacs includes a CLOS-like object system cleverly
named EIEIO. While CLOS (Common Lisp Object System) is multiple
dispatch, EIEIO is, like most object systems, only <em>single dispatch</em>.
The predd package is also very different than my other Elisp object
system, <a href="/blog/2013/04/07/">@</a>, which was prototype based and, therefore, also single
dispatch (and comically slow).</p>

<p>The <a href="http://clojure.org/multimethods">Clojure multimethods documentation</a> provides a good
introduction. The predd package works almost exactly the same way,
except that due to Elisp’s lack of namespacing the function names are
prefixed with <code class="language-plaintext highlighter-rouge">predd-</code>. Also different is that the optional hierarchy
(<code class="language-plaintext highlighter-rouge">h</code>) argument is handled by the dynamic variable <code class="language-plaintext highlighter-rouge">predd-hierarchy</code>,
which holds the global hierarchy.</p>

<h3 id="combination-example">Combination Example</h3>

<p>To define a multimethod, pick a name and give it a <em>classifier
function</em>. The classifier function will look at the method’s arguments
and return a <em>dispatch value</em>. This value is used to select a
particular method. What makes predd a multiple dispatch system is the
dispatch value can be derived from any number of methods arguments.
Because the dispatch value is computed at run-time this is called a
<em>late binding</em>.</p>

<p>Here I’m going to define a multimethod called <code class="language-plaintext highlighter-rouge">combine</code> that takes two
arguments. It combines its arguments appropriately depending on their
dynamic run-time types.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-defmulti</span> <span class="nv">combine</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">vector</span> <span class="p">(</span><span class="nb">type-of</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nb">type-of</span> <span class="nv">b</span><span class="p">)))</span>
  <span class="s">"Appropriately combine A and B."</span><span class="p">)</span>
</code></pre></div></div>

<p>The classifier uses <code class="language-plaintext highlighter-rouge">type-of</code>, an Elisp built-in, to examine its
argument types. It returns them as tuple in the form of a vector. The
classifier of a method can be accessed with <code class="language-plaintext highlighter-rouge">predd-classifier</code>, which
I’ll use to demonstrate what these dispatch values will look like.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">funcall</span> <span class="p">(</span><span class="nv">predd-classifier</span> <span class="ss">'combine</span><span class="p">)</span> <span class="mi">1</span> <span class="mi">2</span><span class="p">)</span>    <span class="c1">; =&gt; [integer integer]</span>
<span class="p">(</span><span class="nb">funcall</span> <span class="p">(</span><span class="nv">predd-classifier</span> <span class="ss">'combine</span><span class="p">)</span> <span class="mi">1</span> <span class="s">"2"</span><span class="p">)</span>  <span class="c1">; =&gt; [integer string]</span>
</code></pre></div></div>

<p>I chose a vector for the dispatch value because I like the bracket
style when defining methods (you’ll see below). The dispatch value can
be literally anything that <code class="language-plaintext highlighter-rouge">equal</code> knows how to compare, not just
vectors. Note that it’s actually faster to create a list than a vector
up to a length of about 6, so this multimethod would be faster if the
classifier returned a list — or even better: a single cons.</p>

<p>Now define some methods for different dispatch values.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-defmethod</span> <span class="nv">combine</span> <span class="nv">[integer</span> <span class="nv">integer]</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">+</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span>

<span class="p">(</span><span class="nv">predd-defmethod</span> <span class="nv">combine</span> <span class="nv">[string</span> <span class="nv">string]</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">concat</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span>

<span class="p">(</span><span class="nv">predd-defmethod</span> <span class="nv">combine</span> <span class="nv">[cons</span> <span class="nv">cons]</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">append</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span>
</code></pre></div></div>

<p>Now try it out.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">combine</span> <span class="mi">1</span> <span class="mi">2</span><span class="p">)</span>            <span class="c1">; =&gt; 3</span>
<span class="p">(</span><span class="nv">combine</span> <span class="s">"a"</span> <span class="s">"b"</span><span class="p">)</span>        <span class="c1">; =&gt;"ab"</span>
<span class="p">(</span><span class="nv">combine</span> <span class="o">'</span><span class="p">(</span><span class="mi">1</span> <span class="mi">2</span><span class="p">)</span> <span class="o">'</span><span class="p">(</span><span class="mi">3</span> <span class="mi">4</span><span class="p">))</span>  <span class="c1">; =&gt; (1 2 3 4)</span>

<span class="p">(</span><span class="nv">combine</span> <span class="mi">1</span> <span class="o">'</span><span class="p">(</span><span class="mi">3</span> <span class="mi">4</span><span class="p">))</span>
<span class="c1">; error: "No method found in combine for [integer cons]"</span>
</code></pre></div></div>

<p>Notice in the last case it didn’t know how to combine these two types,
so it threw an error. In this simple example where we’re only calling
a single function, so rather than use the <code class="language-plaintext highlighter-rouge">predd-defmethod</code> macro
these methods can be added directly with the <code class="language-plaintext highlighter-rouge">predd-add-method</code>
function. This has the exact same result except that it has slightly
better performance (no wrapper functions).</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-add-method</span> <span class="ss">'combine</span> <span class="nv">[integer</span> <span class="nv">integer]</span> <span class="nf">#'</span><span class="nb">+</span><span class="p">)</span>
<span class="p">(</span><span class="nv">predd-add-method</span> <span class="ss">'combine</span> <span class="nv">[string</span> <span class="nv">string]</span>   <span class="nf">#'</span><span class="nv">concat</span><span class="p">)</span>
<span class="p">(</span><span class="nv">predd-add-method</span> <span class="ss">'combine</span> <span class="nv">[cons</span> <span class="nv">cons]</span>       <span class="nf">#'</span><span class="nb">append</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="use-the-hierarchy">Use the Hierarchy</h4>

<p>Hmmm, the <code class="language-plaintext highlighter-rouge">+</code> function is already polymorphic. It seamlessly operates
on both floats and integers. So far it seems there’s no way to exploit
this with multimethods. Fortunately we can solve this by defining our
own ad hoc hierarchy using <code class="language-plaintext highlighter-rouge">predd-derive</code>. Both integers and floats
are a kind of number. It’s important to note that <code class="language-plaintext highlighter-rouge">type-of</code> never
returns <code class="language-plaintext highlighter-rouge">number</code>. We’re introducing that name here ourselves.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">type-of</span> <span class="mf">1.0</span><span class="p">)</span>  <span class="c1">; =&gt; float</span>

<span class="p">(</span><span class="nv">predd-derive</span> <span class="ss">'integer</span> <span class="ss">'number</span><span class="p">)</span>
<span class="p">(</span><span class="nv">predd-derive</span> <span class="ss">'float</span> <span class="ss">'number</span><span class="p">)</span>

<span class="c1">;; Types can derive from multiple parents, like multiple inheritance</span>
<span class="p">(</span><span class="nv">predd-derive</span> <span class="ss">'integer</span> <span class="ss">'exact</span><span class="p">)</span>
<span class="p">(</span><span class="nv">predd-derive</span> <span class="ss">'float</span> <span class="ss">'inexact</span><span class="p">)</span>
</code></pre></div></div>

<p>This says that <code class="language-plaintext highlighter-rouge">integer</code> and <code class="language-plaintext highlighter-rouge">float</code> are each a kind of <code class="language-plaintext highlighter-rouge">number</code>. Now
we can use <code class="language-plaintext highlighter-rouge">number</code> in a dispatch value. When it sees something like
<code class="language-plaintext highlighter-rouge">[float integer]</code> it knows that it matches <code class="language-plaintext highlighter-rouge">[number number]</code>.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-add-method</span> <span class="ss">'combine</span> <span class="nv">[number</span> <span class="nv">number]</span> <span class="nf">#'</span><span class="nb">+</span><span class="p">)</span>

<span class="p">(</span><span class="nv">combine</span> <span class="mf">1.5</span> <span class="mi">2</span><span class="p">)</span>  <span class="c1">; =&gt; 3.5</span>
</code></pre></div></div>

<p>We can check the hierarchy explicitly with <code class="language-plaintext highlighter-rouge">predd-isa-p</code> (like
Clojure’s <code class="language-plaintext highlighter-rouge">isa?</code>). It compares two values just like <code class="language-plaintext highlighter-rouge">equal</code>, but it
also accounts for all <code class="language-plaintext highlighter-rouge">predd-derive</code> declarations. Because of this
extra concern, unlike <code class="language-plaintext highlighter-rouge">equal</code>, <code class="language-plaintext highlighter-rouge">predd-isa-p</code> is <em>not</em> commutative.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-isa-p</span> <span class="ss">'number</span> <span class="ss">'number</span><span class="p">)</span>  <span class="c1">; =&gt; 0</span>
<span class="p">(</span><span class="nv">predd-isa-p</span> <span class="ss">'float</span> <span class="ss">'number</span><span class="p">)</span>   <span class="c1">; =&gt; 1</span>
<span class="p">(</span><span class="nv">predd-isa-p</span> <span class="ss">'number</span> <span class="ss">'float</span><span class="p">)</span>   <span class="c1">; =&gt; nil</span>

<span class="p">(</span><span class="nv">predd-isa-p</span> <span class="nv">[float</span> <span class="nv">float]</span> <span class="nv">[number</span> <span class="nv">number]</span><span class="p">)</span>  <span class="c1">; =&gt; 2</span>
</code></pre></div></div>

<p>(Remember that <code class="language-plaintext highlighter-rouge">0</code> is truthy in Elisp.) The integer returned is a
distance metric used by method dispatch to determine which values are
“closer” so that the most appropriate method is selected.</p>

<p>You might be worried that introducing <code class="language-plaintext highlighter-rouge">number</code> will make the
multimethod slower. Examining the hierarchy will definitely have a
cost after all. Fortunately predd has a dispatch cache, so
introducing this indirection will have <em>no</em> additional performance
penalty after the first call with a particular dispatch value.</p>

<h3 id="struct-example">Struct Example</h3>

<p>Something that really sets these multimethods apart from other object
systems is a lack of concern about encapsulation — or really about
object data in general. That’s the classifier’s concern. So here’s an
example of how to combine predd with <code class="language-plaintext highlighter-rouge">defstruct</code> from cl/cl-lib.</p>

<p>Imagine we’re making some kind of game where each of the creatures is
represented by an <code class="language-plaintext highlighter-rouge">actor</code> struct. Each actor has a name, hit points,
and active status effects.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defstruct</span> <span class="nv">actor</span>
  <span class="p">(</span><span class="nv">name</span> <span class="s">"Unknown"</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">hp</span> <span class="mi">100</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">statuses</span> <span class="p">()))</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">defstruct</code> macro has a useful inheritance feature that we can
exploit for our game to create subtypes. The parent accessors will
work on these subtypes, immediately providing some (efficient)
polymorphism even before multimethods are involved.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defstruct</span> <span class="p">(</span><span class="nv">player</span> <span class="p">(</span><span class="ss">:include</span> <span class="nv">actor</span><span class="p">))</span>
  <span class="nv">control-scheme</span><span class="p">)</span>

<span class="p">(</span><span class="nb">defstruct</span> <span class="p">(</span><span class="nv">stinkmonster</span> <span class="p">(</span><span class="ss">:include</span> <span class="nv">actor</span><span class="p">))</span>
  <span class="p">(</span><span class="k">type</span> <span class="ss">'sewage</span><span class="p">))</span>

<span class="p">(</span><span class="nv">actor-hp</span> <span class="p">(</span><span class="nv">make-stinkmonster</span><span class="p">))</span>  <span class="c1">; =&gt; 100</span>
</code></pre></div></div>

<p>As a side note: this isn’t necessarily the best way to go about
modeling a game. We probably shouldn’t be relying on inheritance too
much, but bear with me for this example.</p>

<p>Say we want an <code class="language-plaintext highlighter-rouge">attack</code> method for handling attacks between different
types of monsters. Elisp structs have a very useful property by
default: they’re simply vectors whose first element is a symbol
denoting its type. We can use this in a multimethod classifier.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">make-player</span><span class="p">)</span>
<span class="c1">;; =&gt; [cl-struct-player "Unknown" 100 nil nil]</span>

<span class="p">(</span><span class="nv">predd-defmulti</span> <span class="nv">attack</span>
    <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">attacker</span> <span class="nv">victim</span><span class="p">)</span>
      <span class="p">(</span><span class="nb">vector</span> <span class="p">(</span><span class="nb">aref</span> <span class="nv">attacker</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">aref</span> <span class="nv">victim</span> <span class="mi">0</span><span class="p">)))</span>
  <span class="s">"Perform an attack from ATTACKER on VICTIM."</span><span class="p">)</span>
</code></pre></div></div>

<p>Let’s define a base case. This will be overridden by more specific
methods (determined by that distance metric).</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-defmethod</span> <span class="nv">attack</span> <span class="nv">[cl-struct-actor</span> <span class="nv">cl-struct-actor]</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">v</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">decf</span> <span class="p">(</span><span class="nv">actor-hp</span> <span class="nv">v</span><span class="p">)</span> <span class="mi">10</span><span class="p">))</span>
</code></pre></div></div>

<p>We could have instead used <code class="language-plaintext highlighter-rouge">:default</code> for the dispatch value, which is
a special catch-all value. The <code class="language-plaintext highlighter-rouge">actor-hp</code> function will signal an
error for any victim non-actors anyway. However, not using <code class="language-plaintext highlighter-rouge">:default</code>
will force both argument types to be checked. It will also demonstrate
specialization for the example.</p>

<p>However, before we can make use of this we need to teach predd about
the relationship between these structs. It doesn’t check <code class="language-plaintext highlighter-rouge">defstruct</code>
hierarchies. This step is what makes combining <code class="language-plaintext highlighter-rouge">defstruct</code> and predd
a little unwieldy. A wrapper macro is probably due for this.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-derive</span> <span class="ss">'cl-struct-player</span> <span class="ss">'cl-struct-actor</span><span class="p">)</span>
<span class="p">(</span><span class="nv">predd-derive</span> <span class="ss">'cl-struct-stinkmonster</span> <span class="ss">'cl-struct-actor</span><span class="p">)</span>

<span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">player</span> <span class="p">(</span><span class="nv">make-player</span><span class="p">))</span>
      <span class="p">(</span><span class="nv">monster</span> <span class="p">(</span><span class="nv">make-stinkmonster</span><span class="p">)))</span>
  <span class="p">(</span><span class="nv">attack</span> <span class="nv">player</span> <span class="nv">monster</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">actor-hp</span> <span class="nv">monster</span><span class="p">))</span>
<span class="c1">;; =&gt; 90</span>
</code></pre></div></div>

<p>When the stinkmonster attacks players it doesn’t do damage. Instead it
applies a status effect.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">predd-defmethod</span> <span class="nv">attack</span> <span class="nv">[cl-struct-stinkmonster</span> <span class="nv">cl-struct-player]</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">v</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">pushnew</span> <span class="p">(</span><span class="nv">stinkmonster-type</span> <span class="nv">a</span><span class="p">)</span> <span class="p">(</span><span class="nv">actor-statuses</span> <span class="nv">v</span><span class="p">)))</span>

<span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">player</span> <span class="p">(</span><span class="nv">make-player</span><span class="p">))</span>
      <span class="p">(</span><span class="nv">monster</span> <span class="p">(</span><span class="nv">make-stinkmonster</span><span class="p">)))</span>
  <span class="p">(</span><span class="nv">attack</span> <span class="nv">monster</span> <span class="nv">player</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">actor-statuses</span> <span class="nv">player</span><span class="p">))</span>
<span class="c1">;; =&gt; (sewage)</span>
</code></pre></div></div>

<p>If the monster applied a status effect in addition to the default
attack behavior then CLOS-style method combination would be far more
appropriate here (if only it was available in Elisp). The method would
instead be defined as an “after” method and it would automatically run
in addition to the default behavior.</p>

<p>If I was actually building a system combing structs and predd, I would
be using this helper function for building classifiers. It returns a
dispatch value for selected arguments.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;;; -*- lexical-binding: t; -*-</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">struct-classifier</span> <span class="p">(</span><span class="k">&amp;rest</span> <span class="nv">pattern</span><span class="p">)</span>
  <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="k">&amp;rest</span> <span class="nv">args</span><span class="p">)</span>
    <span class="p">(</span><span class="nb">loop</span> <span class="nv">for</span> <span class="nv">select-p</span> <span class="nv">in</span> <span class="nv">pattern</span> <span class="nb">and</span> <span class="nv">arg</span> <span class="nv">in</span> <span class="nv">args</span>
          <span class="nb">when</span> <span class="nv">select-p</span> <span class="nv">collect</span> <span class="p">(</span><span class="nb">elt</span> <span class="nv">arg</span> <span class="mi">0</span><span class="p">))))</span>

<span class="c1">;; Takes 3 arguments, dispatches on the first 2 argument types.</span>
<span class="p">(</span><span class="nv">predd-defmulti</span> <span class="nv">speak</span> <span class="p">(</span><span class="nv">struct-classifier</span> <span class="no">t</span> <span class="no">t</span> <span class="no">nil</span><span class="p">))</span>

<span class="c1">;; Messages sent to the player are displayed.</span>
<span class="p">(</span><span class="nv">predd-defmethod</span> <span class="nv">speak</span> <span class="o">'</span><span class="p">(</span><span class="nv">cl-struct-actor</span> <span class="nv">cl-struct-player</span><span class="p">)</span> <span class="p">(</span><span class="nv">from</span> <span class="nv">to</span> <span class="nv">message</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">message</span> <span class="s">"%s says %s."</span> <span class="p">(</span><span class="nv">actor-name</span> <span class="nv">from</span><span class="p">)</span> <span class="nv">message</span><span class="p">))</span>
</code></pre></div></div>

<h3 id="the-future">The Future</h3>

<p>As of this writing there isn’t yet a <code class="language-plaintext highlighter-rouge">prefer-method</code> for
disambiguating equally preferred dispatch values. I will add it in the
future. I think <code class="language-plaintext highlighter-rouge">prefer-method</code> gets unwieldy quickly as the type
hierarchy grows, so it should be avoided anyway.</p>

<p>I haven’t put predd in MELPA or otherwise published it yet. That’s
what this post is for. But I think it’s ready for prime time, so feel
free to try it out.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Emacs Javadoc Lookups Get a Facelift</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2013/01/30/"/>
    <id>urn:uuid:18159666-2379-359b-35dd-edf5c4bdbf60</id>
    <updated>2013-01-30T00:00:00Z</updated>
    <category term="emacs"/><category term="java"/><category term="clojure"/>
    <content type="html">
      <![CDATA[<p>Ever since
<a href="/blog/2012/08/12/">I started using the Emacs package archive</a>,
specifically <a href="http://melpa.milkbox.net/">MELPA</a>, I’d been wanting to tidy up
<a href="/blog/2010/10/14/">my Emacs Java extensions</a>, java-mode-plus, into a
nice, official package. Observing my own attitude after the switch, I
noticed that if a package isn’t available on ELPA or MELPA, it
practically doesn’t exist for me. Manually installing anything now
seems like so much trouble in comparison, and getting a package on
MELPA is so easy that there’s little excuse for package authors not to
have their package in at least one of the three major Elisp
archives. This is exactly the attitude my own un-archived package
would be facing from other people, and rightfully so.</p>

<p>Before I dive in, this is what the user configuration now looks like,</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">javadoc-add-artifacts</span> <span class="nv">[org.lwjgl.lwjg</span> <span class="nv">lwjgl</span> <span class="s">"2.8.2"</span><span class="nv">]</span>
                       <span class="nv">[com.nullprogram</span> <span class="nv">native-guide</span> <span class="s">"0.2"</span><span class="nv">]</span>
                       <span class="nv">[org.apache.commons</span> <span class="nv">commons-math3</span> <span class="s">"3.0"</span><span class="nv">]</span><span class="p">)</span>
</code></pre></div></div>

<p>That’s right: it knows how to find, fetch, and index documentation on
its own. Keep reading if this sounds useful to you.</p>

<h3 id="the-problem">The Problem</h3>

<p>The problem was that java-mode-plus was doing two unrelated things:</p>

<ul>
  <li>
    <p>Supporting Ant-oriented Java projects. Not
 <a href="http://kent.spillner.org/blog/work/2009/11/14/java-build-tools.html">being a fan of Maven</a>, I’ve used Ant for all of my own
 personal projects. (However, I really do like the Maven
 infrastructure, so I use Apache Ivy.) It seems Maven is a lot more
 popular, so this part isn’t useful for many people.</p>
  </li>
  <li>
    <p>Quick Javadoc referencing, which I was calling java-docs. I think
 this is generally useful for anyone writing Java in Emacs, even if
 they’re using another suite like JDEE or writing in another JVM
 language. It would be nice for people to be able to use this without
 pulling in all of java-mode-plus — which was somewhat intrusive.</p>
  </li>
</ul>

<p>I also didn’t like the names I had picked. java-mode-plus wasn’t even
a mode until recently and its name isn’t conventional. And “java-docs”
is just stupid. I recently solved all this by splitting the
java-mode-plus into two new packages,</p>

<ul>
  <li>
    <p><a href="https://github.com/skeeto/ant-project-mode"><em>ant-project-mode</em></a> — A minor mode that
 performs the duties of the first task above. Since I’ve
 <a href="/blog/2012/08/12/">phased Java out</a> from my own personal projects
 and no longer intend to write Java anymore, this part isn’t very
 useful to me personally at the moment. If I do need to write Java for
 work again I’ll probably dust this off. It’s by no means
 un-maintained, it’s just in maintenance mode for now. Because of
 this, this is not in any Emacs package archive</p>
  </li>
  <li>
    <p><a href="https://github.com/skeeto/javadoc-lookup"><em>javadoc-lookup</em></a> — This is java-docs renamed and
 <strong>with some new goodies!</strong> I also <strong>put this on MELPA</strong>, where it’s
 easy for anyone to use. This is continues to be useful for me as I
 use Clojure.</p>
  </li>
</ul>

<h3 id="javadoc-lookup">javadoc-lookup</h3>

<p>This is used like java-docs before it, just under a different
name. The function <code class="language-plaintext highlighter-rouge">javadoc-lookup</code> asks for a Java class for
documentation. I like to bind this to <code class="language-plaintext highlighter-rouge">C-h j</code>.</p>

<p>The function <code class="language-plaintext highlighter-rouge">javadoc-add-roots</code> provides filesystem paths to be
indexed for lookup.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">javadoc-add-roots</span> <span class="s">"/usr/share/doc/openjdk-6-jdk/api"</span>
                   <span class="s">"~/src/project/doc"</span><span class="p">)</span>
</code></pre></div></div>

<p>Also, as before, if you don’t provide a root for the core Java API, it
will automatically load an index of the official Javadoc hosted
online. This means it can be installed from MELPA and used immediately
without any configuration. Good defaults and minimal required
configuration <a href="/blog/2012/10/31/">is something I highly value</a>.</p>

<p>Back in the java-docs days, when I started using a new library I’d
track down the Javadoc jar, unzip it somewhere on my machine, and add
it to be indexed. I regularly do development on four different
computers, so this gets tedious fast. Since the Javadoc jars are
easily available from the Maven repository, I maintained a small Ant
project within my .emacs.d for awhile just to do this fetching, but it
was a dirty hack.</p>

<h4 id="finally-the-goodies">Finally, the Goodies</h4>

<p>Here’s the cool new part: I built this functionality into
javadoc-lookup. <strong>It can fetch all your documentation for you!</strong>
Instead of providing a path on your filesystem, you name an artifact
that Maven can find. javadoc-lookup will call Maven to fetch the
Javadoc jar, unzip it into a cache directory, and index it for
lookups. You will need Maven installed either on your <code class="language-plaintext highlighter-rouge">$PATH</code> or at
<code class="language-plaintext highlighter-rouge">maven-program-name</code> (Elisp variable).</p>

<p>Here’s a sample configuration. It’s group, artifact, version provided
as a sequence. I say “sequence” because it can be either a list or a
vector and those names can be either strings or symbols. I prefer the
vector/symbol method because it requires
<a href="/blog/2012/07/17/">the least quoting</a>, plus it looks Clojure-ish.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">javadoc-add-artifacts</span> <span class="nv">[org.lwjgl.lwjg</span> <span class="nv">lwjgl</span> <span class="s">"2.8.2"</span><span class="nv">]</span>
                       <span class="nv">[com.nullprogram</span> <span class="nv">native-guide</span> <span class="s">"0.2"</span><span class="nv">]</span>
                       <span class="nv">[org.apache.commons</span> <span class="nv">commons-math3</span> <span class="s">"3.0"</span><span class="nv">]</span><span class="p">)</span>
</code></pre></div></div>

<p>Put that in your initialization and all this documentation will appear
in the lookup index. It only needs to fetch from Maven once per
artifact per system — a very very slow process. After that it
operates entirely from its own cache which is very fast, so it won’t
slow down your startup.</p>

<p>This has been extremely convenient for me so I hope other people find
it useful, too.</p>

<p>As a final note, javadoc-lookup also exploits structural sharing in
its tables, using a lot less memory than java-docs. Not that it was a
problem before; it’s a feel-good feature.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  <entry>
    <title>Parameter Lists in Common Lisp and Clojure</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2013/01/20/"/>
    <id>urn:uuid:01182f77-6dfa-3448-2c3a-7bb428d5b430</id>
    <updated>2013-01-20T00:00:00Z</updated>
    <category term="lisp"/><category term="clojure"/>
    <content type="html">
      <![CDATA[<p>Parameter lists in Common Lisp, called <a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_d.htm">lambda lists</a>,
are written in their own mini-language, making it convenient to write
functions with a flexible call interface. A lambda list can specify
optional parameters, optionally with default arguments, named
(keyword) parameters, and whether or not the function is
variadic. It’s something I miss a lot when using other languages,
especially JavaScript.</p>

<h3 id="common-lisp-parameters">Common Lisp Parameters</h3>

<p>Here some some examples. This function, <code class="language-plaintext highlighter-rouge">foo</code>, has three required
parameters, <code class="language-plaintext highlighter-rouge">a</code>, <code class="language-plaintext highlighter-rouge">b</code>, and <code class="language-plaintext highlighter-rouge">c</code>.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">foo</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span>
  <span class="o">...</span><span class="p">)</span>
</code></pre></div></div>

<p>To make <code class="language-plaintext highlighter-rouge">b</code> and <code class="language-plaintext highlighter-rouge">c</code> optional, place them after the symbol <code class="language-plaintext highlighter-rouge">&amp;optional</code>,</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">foo</span> <span class="p">(</span><span class="nv">a</span> <span class="k">&amp;optional</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span>
  <span class="o">...</span><span class="p">)</span>
</code></pre></div></div>

<p>If second and third arguments are not provided, <code class="language-plaintext highlighter-rouge">b</code> and <code class="language-plaintext highlighter-rouge">c</code> will be
bound to <code class="language-plaintext highlighter-rouge">nil</code>. To provide a default argument, put that parameter
inside a list. Below, when a third argument is not provided, <code class="language-plaintext highlighter-rouge">c</code> will
be bound to <code class="language-plaintext highlighter-rouge">"bar"</code>.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">foo</span> <span class="p">(</span><span class="nv">a</span> <span class="k">&amp;optional</span> <span class="nv">b</span> <span class="p">(</span><span class="nv">c</span> <span class="s">"bar"</span><span class="p">))</span>
  <span class="o">...</span><span class="p">)</span>
</code></pre></div></div>

<p>To write a function that accepts any number of arguments, use <code class="language-plaintext highlighter-rouge">&amp;rest</code>
followed by the parameter to hold the list of the remaining
arguments. Below, <code class="language-plaintext highlighter-rouge">args</code> will be a list of all arguments after the
third. Note how this can be combined with <code class="language-plaintext highlighter-rouge">&amp;optional</code>.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">foo</span> <span class="p">(</span><span class="nv">a</span> <span class="k">&amp;optional</span> <span class="nv">b</span> <span class="nv">c</span> <span class="k">&amp;rest</span> <span class="nv">args</span><span class="p">)</span>
  <span class="o">...</span><span class="p">)</span>
</code></pre></div></div>

<p>Often, the <em>position</em> of a parameter may be hard to remember or read,
especially if there are many parameters. It may be more convenient to
name them with <code class="language-plaintext highlighter-rouge">&amp;key</code>. Below, the function has three named parameters,
specified at the call site using <em>keywords</em> — special symbols from
the keyword package that always evaluate to themselves.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">foo</span> <span class="p">(</span><span class="k">&amp;key</span> <span class="nv">a</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)</span>
  <span class="o">...</span><span class="p">)</span>

<span class="p">(</span><span class="nv">foo</span> <span class="ss">:b</span> <span class="s">"world"</span> <span class="ss">:a</span> <span class="s">"hello"</span><span class="p">)</span>
</code></pre></div></div>

<p>Like optional parameters, when a parameter is not provided it is bound
to <code class="language-plaintext highlighter-rouge">nil</code>. In the same way, it can be given a default argument.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">foo</span> <span class="p">(</span><span class="k">&amp;key</span> <span class="p">(</span><span class="nv">a</span> <span class="s">"hello"</span><span class="p">)</span> <span class="p">(</span><span class="nv">b</span> <span class="s">"world"</span><span class="p">)</span> <span class="nv">c</span><span class="p">)</span>
  <span class="o">...</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">&amp;key</code> can be combined with <code class="language-plaintext highlighter-rouge">&amp;optional</code> and <code class="language-plaintext highlighter-rouge">&amp;rest</code>. However, the
<code class="language-plaintext highlighter-rouge">&amp;rest</code> argument will be filled with all of key-value pairs, so it’s
generally not useful to use them together.</p>

<p>Lambda lists are not exclusive to <code class="language-plaintext highlighter-rouge">defun</code> and can be used in any place
that needs to receive values in parameters, such as <code class="language-plaintext highlighter-rouge">flet</code> (<em>function</em>
let), <code class="language-plaintext highlighter-rouge">defmethod</code>, and so on.</p>

<h3 id="clojure-parameters">Clojure Parameters</h3>

<p>Clojure forgoes these complex lambda lists in preference for
overloading by arity. When a function is being defined, multiple
functions of different arities can be defined at once. This makes for
optional parameters. Note how this leaves no room for a default
argument of <code class="language-plaintext highlighter-rouge">nil</code> for unspecified optional arguments.</p>

<p>Here, <code class="language-plaintext highlighter-rouge">b</code> is an optional parameter for <code class="language-plaintext highlighter-rouge">foo</code>, defaulting to <code class="language-plaintext highlighter-rouge">"bar"</code>
when not provided by the caller. The first definition has an arity of
one and it calls the second definition with the optional argument
filled in.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">foo</span><span class="w">
  </span><span class="p">([</span><span class="n">a</span><span class="p">]</span><span class="w"> </span><span class="p">(</span><span class="nf">foo</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="s">"bar"</span><span class="p">))</span><span class="w">
  </span><span class="p">([</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="p">]</span><span class="w"> </span><span class="n">...</span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<p>Variadic functions are specified with <code class="language-plaintext highlighter-rouge">&amp;</code>, similar to <code class="language-plaintext highlighter-rouge">&amp;rest</code> in
Common Lisp. Below, <code class="language-plaintext highlighter-rouge">xs</code> is a sequence of all of the arguments
provided after the first.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="p">[</span><span class="n">x</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">xs</span><span class="p">]</span><span class="w">
  </span><span class="n">...</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>As far as <em>parameters</em> are concerned, this is all Clojure
has. However, Clojure’s parameter specification is actually <em>more</em>
flexible than Common Lisp’s lambda lists in two important ways. One is
that <strong>parameter position can vary with the number of provided
arguments</strong>. The Clojure core functions use this a lot (ex.
<a href="http://clojuredocs.org/clojure_core/1.2.0/clojure.core/reduce"><code class="language-plaintext highlighter-rouge">reduce</code></a>).</p>

<p>The following in Common Lisp would require manually parsing the
parameters on some level. The <code class="language-plaintext highlighter-rouge">last</code> parameter can be either second or
third depending on whether a middle name was provided.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">make-name</span><span class="w">
  </span><span class="p">([</span><span class="nb">first</span><span class="w"> </span><span class="nb">last</span><span class="p">]</span><span class="w">
     </span><span class="p">(</span><span class="nf">make-name</span><span class="w"> </span><span class="nb">first</span><span class="w"> </span><span class="s">"Q"</span><span class="w"> </span><span class="nb">last</span><span class="p">))</span><span class="w">
  </span><span class="p">([</span><span class="nb">first</span><span class="w"> </span><span class="n">middle</span><span class="w"> </span><span class="nb">last</span><span class="p">]</span><span class="w">
     </span><span class="p">{</span><span class="no">:first</span><span class="w"> </span><span class="n">first,</span><span class="w"> </span><span class="no">:middle</span><span class="w"> </span><span class="n">middle,</span><span class="w"> </span><span class="no">:last</span><span class="w"> </span><span class="nb">last</span><span class="p">}))</span><span class="w">

</span><span class="p">(</span><span class="nf">make-name</span><span class="w"> </span><span class="s">"John"</span><span class="w"> </span><span class="s">"Public"</span><span class="p">)</span><span class="w">
</span><span class="c1">;; =&gt; {:first "John", :middle "Q", :last "Public"}</span><span class="w">
</span></code></pre></div></div>

<p>That covers optional parameters with default arguments and variadic
functions. What about keyword parameters? Well, to cover that we need
to talk about <em>destructuring</em>, which is another way that Clojure
parameters are more powerful than lambda lists.</p>

<h3 id="destructuring">Destructuring</h3>

<p>A powerful Lisp idiom is destructuring bindings. Variables can be
bound to values in a structure by position in the structure. In Common
Lisp there are three macros for making destructuring bindings,
<code class="language-plaintext highlighter-rouge">destructuring-bind</code>, <code class="language-plaintext highlighter-rouge">loop</code> and <code class="language-plaintext highlighter-rouge">with-slots</code> (CLOS).</p>

<p>Below, in the body of the form, <code class="language-plaintext highlighter-rouge">a</code>, <code class="language-plaintext highlighter-rouge">b</code>, and <code class="language-plaintext highlighter-rouge">c</code> are bound to 1, 2,
and 3 respectively. The form <code class="language-plaintext highlighter-rouge">(a (b c))</code> is mapped into the quoted
structure of the same shape to the right.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">destructuring-bind</span> <span class="p">(</span><span class="nv">a</span> <span class="p">(</span><span class="nv">b</span> <span class="nv">c</span><span class="p">))</span> <span class="o">'</span><span class="p">(</span><span class="mi">1</span> <span class="p">(</span><span class="mi">2</span> <span class="mi">3</span><span class="p">))</span>
  <span class="p">(</span><span class="nb">+</span> <span class="nv">a</span> <span class="p">(</span><span class="nb">*</span> <span class="nv">b</span> <span class="nv">c</span><span class="p">)))</span>
<span class="c1">;; =&gt; 7</span>
</code></pre></div></div>

<p>Because of Common Lisp’s concept of <em>cons cells</em>, the <em>cdr</em> of a cell
can be bound to a variable if that variable appears in the <code class="language-plaintext highlighter-rouge">cdr</code>
position. This is similar to the <code class="language-plaintext highlighter-rouge">&amp;rest</code> parameter (and is how Scheme
does variadic functions). I like using this to match the head and tail
of a list,</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">destructuring-bind</span> <span class="p">(</span><span class="nv">x</span> <span class="o">.</span> <span class="nv">xs</span><span class="p">)</span> <span class="o">'</span><span class="p">(</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">list</span> <span class="nv">x</span> <span class="nv">xs</span><span class="p">))</span>
<span class="c1">;; =&gt; (1 (2 3 4 5))</span>
</code></pre></div></div>

<p>Perhaps the neatest use of destructuring is in the <code class="language-plaintext highlighter-rouge">loop</code> macro. This
loop walks over a list two at a time, binding a variable to each side
of the pair,</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">loop</span> <span class="nv">for</span> <span class="p">(</span><span class="kt">keyword</span> <span class="nv">value</span><span class="p">)</span> <span class="nv">on</span> <span class="o">'</span><span class="p">(</span><span class="ss">:a</span> <span class="mi">1</span> <span class="ss">:b</span> <span class="mi">2</span> <span class="ss">:c</span> <span class="mi">3</span><span class="p">)</span> <span class="nv">by</span> <span class="nf">#'</span><span class="nb">cddr</span>
   <span class="nv">collect</span> <span class="kt">keyword</span> <span class="nv">into</span> <span class="nv">keywords</span>
   <span class="nv">collect</span> <span class="nv">value</span> <span class="nv">into</span> <span class="nb">values</span>
   <span class="nv">finally</span> <span class="p">(</span><span class="nb">return</span> <span class="p">(</span><span class="nb">values</span> <span class="nv">keywords</span> <span class="nb">values</span><span class="p">)))</span>
<span class="c1">;; =&gt; (:A :B :C), (1 2 3)</span>
</code></pre></div></div>

<p>Unfortunately destructuring in Common Lisp is limited to these few
cases, or where ever else you write your own destructuring macros.</p>

<p>Clojure takes destructuring to its logical conclusion: <strong>destructuring
can be used any place bindings are established</strong>! This includes
parameter lists. It works on any core data structure, not just lists.</p>

<p>Below, I’m doing destructuring inside of a standard <code class="language-plaintext highlighter-rouge">let</code> form.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">greet-dr</span><span class="w"> </span><span class="p">[</span><span class="n">fullname</span><span class="p">]</span><span class="w">
  </span><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">[[</span><span class="nb">first</span><span class="w"> </span><span class="nb">last</span><span class="p">]</span><span class="w"> </span><span class="p">(</span><span class="nf">clojure.string/split</span><span class="w"> </span><span class="n">fullname</span><span class="w"> </span><span class="o">#</span><span class="s">" +"</span><span class="p">)]</span><span class="w">
    </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"Hello, Dr. "</span><span class="w"> </span><span class="nb">last</span><span class="w"> </span><span class="s">". "</span><span class="w">
         </span><span class="s">"It's good to see you again, "</span><span class="w"> </span><span class="nb">first</span><span class="w"> </span><span class="s">"."</span><span class="p">)))</span><span class="w">

</span><span class="p">(</span><span class="nf">greet-dr</span><span class="w"> </span><span class="s">"John Doe"</span><span class="p">)</span><span class="w">
</span><span class="c1">;; "Hello, Dr. Doe. It's good to see you again, John."</span><span class="w">
</span></code></pre></div></div>

<p>Similarly, I could destructure an argument into my parameters. (Note
the double square brackets.)</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">greet-dr-2</span><span class="w"> </span><span class="p">[[</span><span class="nb">first</span><span class="w"> </span><span class="nb">last</span><span class="p">]]</span><span class="w">
  </span><span class="n">...</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="nf">greet-dr-2</span><span class="w"> </span><span class="p">[</span><span class="s">"John"</span><span class="w"> </span><span class="s">"Doe"</span><span class="p">])</span><span class="w">
</span></code></pre></div></div>

<p>Because hashmaps are a core language feature in Clojure, they can also
be destructured. The syntax is a bit like flipping the hashmap inside
out. The variable is specified, then the key it’s mapped to.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">[{</span><span class="n">a</span><span class="w"> </span><span class="no">:a,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="no">:b</span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="no">:a</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="no">:b</span><span class="w"> </span><span class="mi">2</span><span class="p">}]</span><span class="w">
  </span><span class="p">(</span><span class="nb">list</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="p">))</span><span class="w">
</span><span class="c1">;; =&gt; (1 2)</span><span class="w">
</span></code></pre></div></div>

<p>When variables and keys have the same name, there’s a shorthand with
<code class="language-plaintext highlighter-rouge">:keys</code>.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">[{</span><span class="no">:keys</span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="p">]}</span><span class="w"> </span><span class="p">{</span><span class="no">:a</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="no">:b</span><span class="w"> </span><span class="mi">2</span><span class="p">}]</span><span class="w">
  </span><span class="n">...</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>Variables default to <code class="language-plaintext highlighter-rouge">nil</code> when the corresponding key is not in the
map. They can be given default values with <code class="language-plaintext highlighter-rouge">:or</code>.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">[{</span><span class="n">a</span><span class="w"> </span><span class="no">:a,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="no">:b</span><span class="w"> </span><span class="no">:or</span><span class="w"> </span><span class="p">{</span><span class="n">a</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="mi">0</span><span class="p">}}</span><span class="w"> </span><span class="p">{}]</span><span class="w">
  </span><span class="p">(</span><span class="nb">list</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="p">))</span><span class="w">
</span><span class="c1">;; =&gt; (0 0)</span><span class="w">
</span></code></pre></div></div>

<p>Now, here’s where it gets really neat. In Common Lisp, the <code class="language-plaintext highlighter-rouge">&amp;key</code> part
of a lambda list is a special case. In Clojure it comes for free as
part of destructuring. Just destructure the <em>rest</em> argument!</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">height-opinion</span><span class="w"> </span><span class="p">[</span><span class="nb">name</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="p">{</span><span class="n">height</span><span class="w"> </span><span class="no">:height</span><span class="p">}]</span><span class="w">
  </span><span class="p">(</span><span class="nf">if-not</span><span class="w"> </span><span class="n">height</span><span class="w">
    </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="s">"I have no opinion on "</span><span class="w"> </span><span class="nb">name</span><span class="w"> </span><span class="s">"."</span><span class="p">)</span><span class="w">
    </span><span class="p">(</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nb">&lt;</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="mi">6</span><span class="p">)</span><span class="w">
      </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="nb">name</span><span class="w"> </span><span class="s">" is short."</span><span class="p">)</span><span class="w">
      </span><span class="p">(</span><span class="nb">str</span><span class="w"> </span><span class="nb">name</span><span class="w"> </span><span class="s">" is tall."</span><span class="p">))))</span><span class="w">

</span><span class="p">(</span><span class="nf">height-opinion</span><span class="w"> </span><span class="s">"Chris"</span><span class="w"> </span><span class="no">:height</span><span class="w"> </span><span class="mf">6.25</span><span class="p">)</span><span class="w">
</span><span class="c1">;; =&gt; "Chris is tall."</span><span class="w">
</span></code></pre></div></div>

<p>We can still access the entire rest argument at the same time, using
<code class="language-plaintext highlighter-rouge">:as</code>, so it covers everything Common Lisp covers.</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="p">[</span><span class="o">&amp;</span><span class="w"> </span><span class="p">{</span><span class="n">a</span><span class="w"> </span><span class="no">:a,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="no">:b</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">args</span><span class="p">}]</span><span class="w">
  </span><span class="n">args</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="nf">foo</span><span class="w"> </span><span class="no">:b</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="w">
</span><span class="c1">;; =&gt; {:b 10}</span><span class="w">
</span></code></pre></div></div>

<p>(A side note while we’re making comparisons: keywords in Clojure are
<em>not</em> symbols, but rather a whole type of their own.)</p>

<h3 id="conclusion">Conclusion</h3>

<p>Clojure parameter lists are simpler than Common Lisp’s lambda lists
and, thanks to destructuring anywhere, they end up being <em>more
powerful</em> at the same time. It’s a full super set of lambda lists, so
there’s no practical trade-off.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  <entry>
    <title>Clojure and Emacs for Lispers</title>
    <link rel="alternate" type="text/html" href="https://nullprogram.com/blog/2013/01/07/"/>
    <id>urn:uuid:5a316444-8f60-30c0-2a94-b87eb239eb13</id>
    <updated>2013-01-07T00:00:00Z</updated>
    <category term="lisp"/><category term="emacs"/><category term="clojure"/>
    <content type="html">
      <![CDATA[<p>According to my e-mail archives I’ve been interested in
<a href="http://clojure.org/">Clojure</a> for about three and a half years now. During that
period I would occasionally spend an evening trying to pick it up,
only to give up after getting stuck on some installation or
configuration issue. With a little bit of pushing from <a href="http://50ply.com/">Brian</a>,
and the fact that this installation and configuration <em>is now
trivial</em>, I finally broke that losing streak last week.</p>

<h3 id="im-damn-picky">I’m Damn Picky</h3>

<p>Personally, there’s a high barrier in place to learn new programming
languages. It’s entirely my own fault. I’m <em>really</em> picky about my
development environment. If I’m going to write code in a language I
need Emacs to support a comfortable workflow around it. Otherwise
progress feels agonizingly sluggish. If at all possible this means
live interaction with the runtime (Lisp, JavaScript). If not, then I
need to be able to invoke builds and run tests from within Emacs (C,
Java). Basically, <strong>I want to leave the Emacs window as infrequently
possible</strong>.</p>

<p>I also need a major mode with decent indentation support. This tends
to be the hardest part to create. Automatic indentation in Emacs is
considered a black magic. Fortunately, it’s unusual to come across a
language that doesn’t already have a major mode written for it. It’s
only happened once for me and that’s because it was a custom language
for a computer languages course. To remedy this, I ended up
<a href="/blog/2012/09/20/">writing my own major mode</a>, including in-Emacs evaluation.</p>

<p>Unsatisfied with JDEE, I did the same for Java,
<a href="/blog/2011/11/19/">growing my own extensions</a> to support my development for the
couple of years when Java was my primary programming language. The
dread of having to switch back and forth between Emacs and my browser
kept me away from web development for years. That changed this past
October when I <a href="/blog/2012/10/31/">wrote skewer-mode</a> to support interactive
JavaScript development. JavaScript is now one of my favorite
programming languages.</p>

<p>I’ve wasted enough time in my life configuring and installing
software. I hate sinking time into doing so without capturing that
work in source control, so that I never need to spend time on that
particular thing again. I don’t mean the installation itself but the
configuration — the difference from the defaults. (And the better the
defaults, the smaller my configuration needs to be.) With
<a href="/blog/2012/06/23/">my dotfiles repository</a> and Debian, I can go from a
computer with no operating system to a fully productive development
environment inside of about one hour. Almost all of that time is just
waiting on Debian to install all its packages. Any new language
development workflow needs to be compatible with this.</p>

<h3 id="clojure-installation">Clojure Installation</h3>

<p>Until last year sometime the standard way to interact with Clojure
from Emacs was through <a href="https://github.com/technomancy/swank-clojure">swank-clojure</a> with
SLIME. Well, installing <a href="/blog/2010/01/15/">SLIME itself can be a pain</a>.
<a href="http://www.quicklisp.org/">Quicklisp</a> now makes this part trivial but it’s specific
to Common Lisp. This is also a conflict with Common Lisp, so I’d
basically need to choose one language or the other.</p>

<p>SLIME doesn’t have any official stable releases. On top of this, the
SWANK protocol is undocumented and subject to change at any time. As a
result, SWANK backends are generally tied to a very specific version
of SLIME and it’s not unusual for something to break when upgrading
one or the other. I know because I wrote
<a href="/blog/2011/01/30/">my own SWANK backend</a> for BrianScheme. Thanks to
Quicklisp, today this isn’t an issue for Common Lisp users, but it’s
not as much help for Clojure.</p>

<p>The good news is that <strong>swank-clojure is now depreciated</strong>. The
replacement is a similar, but entirely independent, library called
<strong>nREPL</strong>. (I’d link to it but there doesn’t seem to be a website.)
Additionally, there’s an excellent Emacs interface to it:
<a href="https://github.com/kingtim/nrepl.el">nrepl.el</a>. It’s available on MELPA, so installation is
trivial.</p>

<p>There’s also a clojure-mode package on MELPA, so install that, too.</p>

<p>That covers the Emacs side of things, so what about Clojure itself?
The Clojure community is a fast-moving target and the Debian packages
can’t quite keep up. At the time of this writing they’re too old to
use nREPL. The good news is that there’s an alternative that’s just as
good, if not better: <a href="http://leiningen.org/">Leiningen</a>.</p>

<p>Leiningen is the standard Clojure build tool and dependency
manager. Here, “dependencies” includes Clojure itself. If you have
Leiningen you have Clojure. Installing Leiningen is as simple as
placing a single shell script in your <code class="language-plaintext highlighter-rouge">$PATH</code>. Since I always have
<code class="language-plaintext highlighter-rouge">~/bin</code> in my <code class="language-plaintext highlighter-rouge">$PATH</code>, all I need to do is wget/curl the script there
and <code class="language-plaintext highlighter-rouge">chmod +x</code> it. The first time it runs it pulls down all of its own
dependencies automatically. Right now the biggest downside seems to be
that it’s really slow to start. I think the JVM warmup time is to
blame.</p>

<p>Let’s review. To install a working Emacs live-interaction Clojure
development environment,</p>

<ul>
  <li>
    <p><strong>Install the nrepl.el package in Emacs.</strong> For me this happens
automatically by the configuration in my
<a href="/blog/2011/10/19/">.emacs.d repository</a>. I only had to do this step once.</p>
  </li>
  <li>
    <p><strong>Install the clojure-mode package.</strong> Same deal.</p>
  </li>
  <li>
    <p><strong>Install a JDK.</strong> OpenJDK is probably in your system’s package
manager, so this is trivial.</p>
  </li>
  <li>
    <p><strong>Put the <code class="language-plaintext highlighter-rouge">lein</code> shell script in the <code class="language-plaintext highlighter-rouge">$PATH</code>.</strong> This takes about
five seconds. If even this was too much for my precious
sensibilities I could put this script in my dotfiles repository.</p>
  </li>
</ul>

<p>With this all in place, do <code class="language-plaintext highlighter-rouge">M-x nrepl-jack-in</code> in Emacs and any
clojure-mode buffer will be ready to evaluate code as expected. It’s
wonderful.</p>

<h3 id="further-extending-emacs">Further Extending Emacs</h3>

<p>I made some tweaks to further increase my comfort. Perhaps nREPL’s
biggest annoyance is not focusing the error buffer, like all the other
interactive modes. Once I’m done glancing at it I’ll dismiss it with
<code class="language-plaintext highlighter-rouge">q</code>. This advice fixes that.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">defadvice</span> <span class="nv">nrepl-default-err-handler</span> <span class="p">(</span><span class="nv">after</span> <span class="nv">nrepl-focus-errors</span> <span class="nv">activate</span><span class="p">)</span>
  <span class="s">"Focus the error buffer after errors, like Emacs normally does."</span>
  <span class="p">(</span><span class="nv">select-window</span> <span class="p">(</span><span class="nv">get-buffer-window</span> <span class="s">"*nrepl-error*"</span><span class="p">)))</span>
</code></pre></div></div>

<p>I also like having expressions flash when I evaluate them. Both SLIME
and Skewer do this. This uses <code class="language-plaintext highlighter-rouge">slime-flash-region</code> to do so when
available.</p>

<div class="language-cl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">defadvice</span> <span class="nv">nrepl-eval-last-expression</span> <span class="p">(</span><span class="nv">after</span> <span class="nv">nrepl-flash-last</span> <span class="nv">activate</span><span class="p">)</span>
  <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">fboundp</span> <span class="ss">'slime-flash-region</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">slime-flash-region</span> <span class="p">(</span><span class="nv">save-excursion</span> <span class="p">(</span><span class="nv">backward-sexp</span><span class="p">)</span> <span class="p">(</span><span class="nv">point</span><span class="p">))</span> <span class="p">(</span><span class="nv">point</span><span class="p">))))</span>

<span class="p">(</span><span class="nv">defadvice</span> <span class="nv">nrepl-eval-expression-at-point</span> <span class="p">(</span><span class="nv">after</span> <span class="nv">nrepl-flash-at</span> <span class="nv">activate</span><span class="p">)</span>
  <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">fboundp</span> <span class="ss">'slime-flash-region</span><span class="p">)</span>
      <span class="p">(</span><span class="nb">apply</span> <span class="nf">#'</span><span class="nv">slime-flash-region</span> <span class="p">(</span><span class="nv">nrepl-region-for-expression-at-point</span><span class="p">))))</span>
</code></pre></div></div>

<p>For Lisp modes I use parenface to de-emphasize parenthesis. Reading
Lisp is more about indentation than parenthesis. Clojure uses square
brackets (<code class="language-plaintext highlighter-rouge">[]</code>) and curly braces (<code class="language-plaintext highlighter-rouge">{}</code>) heavily, so these now also get
special highlighting. See <a href="/blog/2011/10/19/">my .emacs.d</a> for that. Here’s
what it looks like,</p>

<p><img src="/img/screenshot/clojure-brackets.png" alt="" /></p>

<h3 id="learning-clojure">Learning Clojure</h3>

<p>The next step is actually learning Clojure. I already know Common Lisp
very well. It has a lot in common with Clojure so I didn’t want to
start from a pure introductory text. More importantly, I needed to
know upfront <a href="http://clojure.org/lisps">which of my pre-conceptions were wrong</a>. This was
an issue I had, and still have, with JavaScript. Nearly all the
introductory texts for JavaScript are aimed at beginner
programmers. It’s a lot of text for very little new information.</p>

<p>More good news! There’s a very thorough Clojure introductory guide
that starts at a reasonable level of knowledge.</p>

<ul>
  <li><a href="http://java.ociweb.com/mark/clojure/article.html">Clojure - Functional Programming for the JVM</a></li>
</ul>

<p>A few hours going through that while experimenting in a <code class="language-plaintext highlighter-rouge">*clojure*</code>
scratch buffer and I was already feeling pretty comfortable. With a
few months of studying <a href="http://clojure.github.com/clojure/">the API</a>, learning the idioms, and
practicing, I expect to be a fluent speaker.</p>

<p>I think it’s ultimately a good thing I didn’t get into Clojure a
couple of years ago. That gave me time to build up — as a sort of
rite of passage — needed knowledge and experience with Java, which
deliberately, through the interop, plays a significant role in
Clojure.</p>

]]>
    </content>
  </entry>
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  

</feed>
