<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>News | Didier Verna&#39;s Scientific Website</title>
    <link>https://didierverna.net/news/</link>
      <atom:link href="https://didierverna.net/news/index.xml" rel="self" type="application/rss+xml" />
    <description>News</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 08 Sep 2025 20:25:24 +0200</lastBuildDate>
    <image>
      <url>https://didierverna.net/media/icon_hu_5a6fd559c507ef98.png</url>
      <title>News</title>
      <link>https://didierverna.net/news/</link>
    </image>
    
    <item>
      <title>Clon 1.0b27 is out</title>
      <link>https://didierverna.net/news/2023-07-02-clon-1.0b27/</link>
      <pubDate>Sun, 02 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2023-07-02-clon-1.0b27/</guid>
      <description>&lt;p&gt;A new version of 

, the Common Lisp / Command-Line Options
Nuker, is out.&lt;/p&gt;
&lt;p&gt;This release fully qualifies the demo programs with a
&lt;code&gt;net.didierverna.clon.demo&lt;/code&gt; prefix. This avoids polluting global namespaces
and makes Quickref find Clon&amp;rsquo;s primary system correctly.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b26 is out</title>
      <link>https://didierverna.net/news/2022-06-27-clon-1.0b26/</link>
      <pubDate>Mon, 27 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2022-06-27-clon-1.0b26/</guid>
      <description>&lt;p&gt;A new version of 

, the Common Lisp / Command-Line Options
Nuker, is out.&lt;/p&gt;
&lt;p&gt;This version makes the &lt;code&gt;termio&lt;/code&gt; subsystem loadable on its own, which is
required for Quicklisp to setup up its meta-data properly (thanks to Jake
Connor).&lt;/p&gt;
&lt;p&gt;Also in this release, there&amp;rsquo;s a new error handling option to automatically
print the usage string before quitting when a problem arises.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quickref 4.0b1 is out</title>
      <link>https://didierverna.net/news/2022-05-26-quickref-4.0b1/</link>
      <pubDate>Thu, 26 May 2022 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2022-05-26-quickref-4.0b1/</guid>
      <description>&lt;p&gt;As 
, I have
released the first 

version compatible with Declt 4.0
(which is now at beta 2) and which is going to keep track of the development
over there. Because Declt 4 is currently considered in beta state, so is
Quickref 4 for the time being.&lt;/p&gt;
&lt;p&gt;There are a number of important changes in this new major version of the
library. Not much interesting from the outside is an infrastructure overhaul
which improves the parallel support. The index generation code has also been
rewritten to benefit from the recent changes in Declt. Slightly more
interesting from the outside is an improvement of the self-documenting aspects
of the public interface when used interactively, along with more usage
correctness checks. Also, the build environment has been upgraded to Debian
Bullseye.&lt;/p&gt;
&lt;p&gt;But the most critical change, of course, is the name for the 4.x series. In
compliance with the general theme (Iron Maiden songs), and because Quickref 4
is meant to closely follow the brave new Declt version, I thought &amp;ldquo;Brave New
World&amp;rdquo; would be nice. On the other hand, as Declt wanders through its
uncharted 4.0 beta territory, Quickref 4 is likely to suffer the consequences,
so perhaps &amp;ldquo;The Aftermath&amp;rdquo; is more appropriate…&lt;/p&gt;
&lt;p&gt;Anyway, the Docker images are up to date, and so is the 
, currently documenting 2110 Common
Lisp libraries.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 4.0b1 is out</title>
      <link>https://didierverna.net/news/2022-05-10-declt-4.0b1/</link>
      <pubDate>Tue, 10 May 2022 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2022-05-10-declt-4.0b1/</guid>
      <description>&lt;p&gt;Today, after two years and a half of (irregular) development, and 465 commits,
I have released the first beta version of 

4, my reference
manual generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;I rarely release official beta versions of software, let alone make
announcements about them, but this one deserves an exception. Since version 3,
Declt has been undergoing a massive, SOC-oriented, overhaul. The intent is to
reimplement it into a clean 3-stages pipeline. Stage one, the &amp;ldquo;assessment&amp;rdquo;
stage is in charge of gathering information. Stage two, the &amp;ldquo;assembly&amp;rdquo; stage,
creates a documentation template specifying how the information is to be
organized. Finally, Stage three, the &amp;ldquo;typesetting&amp;rdquo; stage, renders the template
in a specific output format. Of course, the purpose is to eventually be able
to support different kinds of templates and output formats.&lt;/p&gt;
&lt;p&gt;Declt 4.0b1 marks the achievement of Stage one, which is now complete. It also
contains a lot of new (and long awaited) features and improvements. The user
manual has been updated to provide an overview of the new architecture, along
with some details about stage one of the pipeline. From now on, I&amp;rsquo;m also going
to release new versions of

 to closely follow
the evolution of Declt.&lt;/p&gt;
&lt;p&gt;Apart from the aforementioned architecture overhaul, which really boils down
to internals shaking and shouldn&amp;rsquo;t affect the end-user much, a lot of new
features and improvements are also provided in this release. They are listed
below.&lt;/p&gt;
&lt;h3 id=&#34;backward-incompatible-changes&#34;&gt;Backward Incompatible Changes&lt;/h3&gt;
&lt;p&gt;For the benefit of Separation of Concerns, but also for other reasons, a
number of keyword arguments to the &lt;code&gt;declt&lt;/code&gt; function have been renamed.
&lt;code&gt;:hyperlinks&lt;/code&gt; becomes &lt;code&gt;:locations&lt;/code&gt;, &lt;code&gt;:version&lt;/code&gt; becomes &lt;code&gt;:library-version&lt;/code&gt;,
&lt;code&gt;:texi-directory&lt;/code&gt; becomes &lt;code&gt;:output-directory&lt;/code&gt;, and &lt;code&gt;:texi-name&lt;/code&gt; becomes
&lt;code&gt;:file-name&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;new-features&#34;&gt;New Features&lt;/h3&gt;
&lt;h4 id=&#34;default--standard-values&#34;&gt;Default / Standard Values&lt;/h4&gt;
&lt;p&gt;Declt now has the ability to advertise or hide properties that get default /
standard values (e.g. standard method combination, &lt;code&gt;:instance&lt;/code&gt; slot
allocation, &lt;em&gt;etc.&lt;/em&gt;).&lt;/p&gt;
&lt;h4 id=&#34;support-for-aliases&#34;&gt;Support for Aliases&lt;/h4&gt;
&lt;p&gt;Declt now recognizes and advertises &amp;ldquo;aliases&amp;rdquo;, that is, funcoids which have
their &lt;code&gt;fdefinition&lt;/code&gt;, macro, or compiler macro function set manually to
another, original, definition.&lt;/p&gt;
&lt;h4 id=&#34;support-for-new-programmatic-entities&#34;&gt;Support for New Programmatic Entities&lt;/h4&gt;
&lt;p&gt;Typed structures and &lt;code&gt;setf&lt;/code&gt; compiler macros are now properly detected and
documented with all the specific information.&lt;/p&gt;
&lt;h4 id=&#34;proper-support-for-uninterened-symbols&#34;&gt;Proper Support for Uninterened Symbols&lt;/h4&gt;
&lt;p&gt;Such symbols may be encountered on several occasions such as slot names
(&lt;code&gt;trivialib&lt;/code&gt;, for example, defines structures with uninterned slot names in
order to prevent access to them). Definitions named with uninterned symbols
are considered private, and denoted by the &amp;lsquo;&amp;rsquo;empty set&amp;rsquo;&amp;rsquo; package (∅).&lt;/p&gt;
&lt;h4 id=&#34;requirement-for-sbcl-212&#34;&gt;Requirement for SBCL 2.1.2&lt;/h4&gt;
&lt;p&gt;The following enhancements depend on it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Short form &lt;code&gt;setf&lt;/code&gt; expanders now get correct source information.&lt;/li&gt;
&lt;li&gt;Method combinations lambda-lists are now documented.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;domestic-vs-foreign-definitions&#34;&gt;Domestic &lt;em&gt;vs.&lt;/em&gt; Foreign Definitions&lt;/h4&gt;
&lt;p&gt;The concept of domestic (as opposed to foreign) definition has been extended
to include those created in one of the sources files of the library being
documented, even if the symbol naming the definition is from a foreign
package. If the source file is unknown, then the symbol&amp;rsquo;s package must be
domestic. The general intent is to consider language extensions as domestic,
hence, always documented. For example, a new method on a standard generic
function (say, &lt;code&gt;initialize-instance&lt;/code&gt;) will now always appear in the
documentation.&lt;/p&gt;
&lt;p&gt;This refinement is accompanied by a new option allowing to include foreign
definitions in the generated documentation. Of course, only foreign
definitions somehow related to the library being documented will appear in the
documentation. Also, those definitions will in general be partial: only the
parts relevant to the library being documented will appear. Continuing with
the &lt;code&gt;initialize-instance&lt;/code&gt; example, new methods normally appear as toplevel,
standalone definitions in the documentation (and their parent generic function
is simply mentioned). If foreign definitions are included however, there will
be a toplevel entry for the generic function, and all methods defined in the
library will be documented there (truly foreign methods won&amp;rsquo;t appear at all).&lt;/p&gt;
&lt;h4 id=&#34;introspection-heuristic&#34;&gt;Introspection Heuristic&lt;/h4&gt;
&lt;p&gt;Until now, there was a single heuristic for finding domestic definitions,
which was to start from domestic packages and scan as many connections between
symbols as possible. That heuristic is reasonably fast, but may occasionally
miss some domestic definitions. Declt now has the ability to scan all symbols
in the Lisp image instead of only the ones from domestic packages. This new
option ensures that all domestic definitions are found, at the expense of a
much greater computation time.&lt;/p&gt;
&lt;h4 id=&#34;supported-licenses&#34;&gt;Supported Licenses&lt;/h4&gt;
&lt;p&gt;The Microsoft Public License has been added.&lt;/p&gt;
&lt;h4 id=&#34;info-installation-category&#34;&gt;Info Installation Category&lt;/h4&gt;
&lt;p&gt;In other words, the value of Texinfo&amp;rsquo;s &lt;code&gt;@direntry&lt;/code&gt; command is now customizable
(instead to being hardwired to &amp;ldquo;Common Lisp&amp;rdquo;).&lt;/p&gt;
&lt;h3 id=&#34;improvements&#34;&gt;Improvements&lt;/h3&gt;
&lt;h4 id=&#34;documentation-thinning&#34;&gt;Documentation Thinning&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Packages reference lists do not point to methods directly anymore (as they
can be reached via the generic function&amp;rsquo;s reference). Also, only slots for
which the parent classoid is named from another package are now referenced.&lt;/li&gt;
&lt;li&gt;Files reference lists do not point to slots anymore (as they can be reached
via the parent classoid&amp;rsquo;s reference). Also, only methods for which the
parent generic function is defined in another file are now referenced.&lt;/li&gt;
&lt;li&gt;The readability of long references has been improved. In particular, they
don&amp;rsquo;t advertise the type of the referenced definitions anymore, when there
is no ambiguity.&lt;/li&gt;
&lt;li&gt;Slot documentation now advertises the slot name&amp;rsquo;s package only when
different from that of the parent classoid.&lt;/li&gt;
&lt;li&gt;Non standalone method documentation now advertises the source file only when
different from that of the parent generic function.&lt;/li&gt;
&lt;li&gt;The rendering of EQL specializers has been inmproved.&lt;/li&gt;
&lt;li&gt;The documentation of &lt;code&gt;setf&lt;/code&gt; / writer methods doesn&amp;rsquo;t render the &amp;ldquo;new value&amp;rdquo;
argument / specializer anymore.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;merging&#34;&gt;Merging&lt;/h4&gt;
&lt;p&gt;Generic definitions containing only reader / writer methods are upgraded to
specific reader / writer categories, and definition merging is now only
attempted on those.&lt;/p&gt;
&lt;h4 id=&#34;lambda-lists&#34;&gt;Lambda Lists&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Uninformative parts of lambda lists are now filtered out. This includes
&lt;code&gt;&amp;amp;whole&lt;/code&gt;, &lt;code&gt;&amp;amp;environment&lt;/code&gt;, &lt;code&gt;&amp;amp;aux&lt;/code&gt; variables, along with options / keyword
variables and default values.&lt;/li&gt;
&lt;li&gt;Method specializers in lambda lists now link back to their respective class
definitions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;method-combinations&#34;&gt;Method Combinations&lt;/h4&gt;
&lt;p&gt;The method combination discovery scheme has been upgraded to benefit from SBCL
1.4.8&amp;rsquo;s enhancements (themselves following my 
).
The old code didn&amp;rsquo;t break, but prevented unused method combinations from being
detected.&lt;/p&gt;
&lt;h3 id=&#34;bug-fixes-and-workarounds&#34;&gt;Bug Fixes and Workarounds&lt;/h3&gt;
&lt;h4 id=&#34;asdf&#34;&gt;ASDF&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Better handling of missing / unloaded components or dependencies (this can
happen for instance with feature-dependent conditional inclusion).&lt;/li&gt;
&lt;li&gt;Cope with the lack of specification of the license information in ASDF
systems by coercing to a string.&lt;/li&gt;
&lt;li&gt;Fix several cases of system files documentation duplication. Declt
automatically documents .asd files as special cases of Lisp files. However,
some systems have the bad (IMHO) habit of mentioning them explicitly as
components (e.g. static files). When this happens, Declt silently discards
that definition and keeps its own (at the expense of having a slightly
incorrect system documentation).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;anchoring&#34;&gt;Anchoring&lt;/h4&gt;
&lt;p&gt;After &lt;em&gt;years&lt;/em&gt; of vain attempts at providing human-readable yet unique anchor
names (which was only really useful for Info, BTW), I finally got rid of my
last bit of idealism. Anchor names now use numerical definition UIDs, and
since Texinfo allows me to expand references with some more information than
just the anchor, it&amp;rsquo;s good enough. Besides, it fixes the last remaining rare
cases exhibiting the fact that it&amp;rsquo;s just impossible to have anchors that are
both human-readable and unique.&lt;/p&gt;
&lt;h4 id=&#34;setf-expanders&#34;&gt;&lt;code&gt;Setf&lt;/code&gt; Expanders&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fix the computation of short form &lt;code&gt;setf&lt;/code&gt; epxander lambda lists (which didn&amp;rsquo;t
correctly handle the presence of optional or rest arguments before.&lt;/li&gt;
&lt;li&gt;Handle the potential unavailability of a &lt;code&gt;setf&lt;/code&gt; expander&amp;rsquo;s update function
or short form operator. Document it if applicable. Also signal a warning
when the expander is domestic.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b25 is out</title>
      <link>https://didierverna.net/news/2021-03-24-clon-1.0b25/</link>
      <pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2021-03-24-clon-1.0b25/</guid>
      <description>&lt;p&gt;Today, I&amp;rsquo;m releasing the next beta version of 

, the Common
Lisp / Command-Line Options Nuker. The previous official release occurred 6
years ago. Since then, a number of changes had been quietly sleeping in the
trunk but never made their way into Quicklisp.&lt;/p&gt;
&lt;p&gt;More recently, I have also applied a number of changes that are worth
mentioning here.&lt;/p&gt;
&lt;p&gt;First of all, a large part of the infrastructure as been updated, following
the evolution of the 8 supported compilers, and that of ASDF and CFFI as well.
This should normally be transparent to the user though, provided that one uses
reasonably recent compiler / ASDF versions (&amp;ldquo;reasonably&amp;rdquo; intentionally left
undefined).&lt;/p&gt;
&lt;p&gt;Other than that&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The constraints on &lt;code&gt;termio&lt;/code&gt; support auto-detection had become slightly too
restrictive, so they have been relaxed.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;exit&lt;/code&gt; function has been deprecated in favor of &lt;code&gt;uiop:quit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The support for running in scripts rather than in dumped executables has
been improved, notably by offering the possibility to provide an alternate
program name when &lt;code&gt;argv[0]&lt;/code&gt; is not satisfactory.&lt;/li&gt;
&lt;li&gt;Clon is now compatible with executables dumped via either ASDF&amp;rsquo;s
&lt;code&gt;program-op&lt;/code&gt; operation or its own &lt;code&gt;dump&lt;/code&gt; function. The demonstration programs
in the distribution have been updated to illustrate both dumping methods.&lt;/li&gt;
&lt;li&gt;The documentation on application delivery has been largely rewritten, and
has become a full chapter rather than a thin appendix.&lt;/li&gt;
&lt;li&gt;There are also a few bug fixes in this release.&lt;/li&gt;
&lt;li&gt;Clon now depends on &lt;code&gt;named-readtables&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Several readtable problems have been fixed for CCL, CLISP, and ECL (thanks
to Thomas Fitzsimmons).&lt;/li&gt;
&lt;li&gt;Clon now compiles its &lt;code&gt;termio&lt;/code&gt; support correctly with a C++ based ECL
(thanks to Pritam Baral).&lt;/li&gt;
&lt;li&gt;One problem in the conversion protocol for path options has been corrected
(thanks to Olivier Certner).&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Quickref 3.0 &#34;The Alchemist&#34; is out</title>
      <link>https://didierverna.net/news/2019-11-21-quickref-3.0/</link>
      <pubDate>Thu, 21 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2019-11-21-quickref-3.0/</guid>
      <description>&lt;p&gt;Following up with the latest 
 I&amp;rsquo;m also happy to announce the release of 

3.0 &amp;ldquo;The
Alchemist&amp;rdquo;, our reference manual aggregator for Quicklisp libraries. The

 has been updated yesterday
with both the latest Quicklisp version, and the new Declt, resulting in the
documentation of 1792 Common Lisp libraries.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 3.0 &#34;Montgomery Scott&#34; is out</title>
      <link>https://didierverna.net/news/2019-11-19-declt-3.0/</link>
      <pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2019-11-19-declt-3.0/</guid>
      <description>&lt;p&gt;This is a new major release of 

, my reference manual
generator for Common Lisp Libraries, although the changes may not be so
visible from the outside. The main concern in this release has been to
increase the robustness of the output, from three different angles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many places from where Declt attempts to extract meaningful information are
underspecified (ASDF system slots notably).&lt;/li&gt;
&lt;li&gt;The pretty-printing of Lisp items can be difficult, given the liberalism and
extensibility of the language.&lt;/li&gt;
&lt;li&gt;Finally, several restrictions in the syntax of Texinfo itself (anchor names
notably) get in the way. These issues were described in a


presented at the TeX Users Group conference, this summer in Palo Alto. This
release goes a long way towards fixing them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new generated reference manuals look mostly the same as before, but some
important things have changed under the hood, notably the names of hyperlinks
and cross-references (backward-incompatible, hence the increase in the major
version number). The output is now also much more robust with respect to the
final output format: the generation of HTML, DVI, Postscript, PDF, and even
plain Info should work fine and has been tested on all Quicklisp libraries (in
fact, Quickref will also be upgraded in the near future to provide all those
formats at once).&lt;/p&gt;
&lt;p&gt;Those improvements do come at a cost. Unicode is now required (even for Info
readers). To be honest, many Lisp libraries already had that implicit
requirement. Also, this release depends on improvements and bug fixes only
available in Texinfo 6.7, now a requirement as well. I have to thank Gavin
Smith, from the Texinfo team, for his collaboration.&lt;/p&gt;
&lt;p&gt;Apart from that, this release also has a number of bug fixes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some method specializers were not handled properly.&lt;/li&gt;
&lt;li&gt;The manuals were missing documentation for some non-Lisp source files.&lt;/li&gt;
&lt;li&gt;There were some glitches in the pretty-printing of unreadable objects.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Quickref 2.0 &#34;Be Quick or Be Dead&#34; is out</title>
      <link>https://didierverna.net/news/2019-04-08-quickref-2.0/</link>
      <pubDate>Mon, 08 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2019-04-08-quickref-2.0/</guid>
      <description>&lt;p&gt;Surfing on the energizing wave of ELS 2019, the 
, I&amp;rsquo;m happy to
announce the release of 

2.0 &amp;ldquo;Be Quick or Be
Dead&amp;rdquo;, our reference manual aggregator for Common Lisp libraries.&lt;/p&gt;
&lt;p&gt;The major improvement in this release, justifying an increment of the major
version number (and the very appropriate codename), is the introduction of
parallel algorithms for building the documentation. I presented this work last
week in Genova so I won&amp;rsquo;t go into the gory details here, but for the brave and
impatient, let me just say that using the parallel implementation is just a
matter of calling the &lt;code&gt;build&lt;/code&gt; function with &lt;code&gt;:parallel t :declt-threads x :makeinfo-threads y&lt;/code&gt; (adjust x and y as you see fit, depending on your
architecture).&lt;/p&gt;
&lt;p&gt;The second featured improvement is the introduction of an author index, in
addition to the original one. The author index is still a bit shaky, mostly
due to technical problems (calling &lt;code&gt;asdf:find-system&lt;/code&gt; almost two thousand
times simply doesn&amp;rsquo;t work) and also to the very creative use that some library
authors have of the ASDF &lt;code&gt;author&lt;/code&gt; and &lt;code&gt;maintainer&lt;/code&gt; slots in the system
descriptions. It does, however, a quite decent job for the majority of the
authors and their libraries&amp;rsquo;reference manuals.&lt;/p&gt;
&lt;p&gt;Finally, the repository now has a fully functional continuous integration
infrastructure, which means that there shouldn&amp;rsquo;t be anymore lags between new
Quicklisp (or Quickref) releases and new versions of the 
.&lt;/p&gt;
&lt;p&gt;Thanks to Antoine Hacquard, Antoine Martin, and Erik Huelsmann for their
contribution to this release! A lot of new features are already in the pipe.
Currently documenting 1720 libraries, and counting…&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quickref 1.0 &#34;The Trooper&#34; is out</title>
      <link>https://didierverna.net/news/2018-08-07-quickref-1.0/</link>
      <pubDate>Tue, 07 Aug 2018 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2018-08-07-quickref-1.0/</guid>
      <description>&lt;p&gt;8 months after the 
, we finally open-sourced 

, our reference manual
aggregator for Quicklisp libraries. The complete source code is now available

.&lt;/p&gt;
&lt;p&gt;I gave a lightning talk at 
, in which I claimed
I would release the code in &amp;ldquo;something like two weeks&amp;rdquo;. That was 4 months ago
😃. I apologize for the delay, especially to Zach who expressed interest in
how we did the Docker thing at the time. I wanted to clean up the code before
the first public release (I&amp;rsquo;m a maniac like that), which I did, but it took
some time.&lt;/p&gt;
&lt;p&gt;Compared to what I announced at ELS, Quickref also has a couple of new
features, most importantly the ability to generate documentation for only
what&amp;rsquo;s already installed, rather than for the whole Quicklisp world. This can
be very convenient if you just want some local documentation for the things
you use daily. Finally, there is also a very rudimentary support for
multithreading, which currently doesn&amp;rsquo;t bring much. But the code has been
prepared for going further in that direction; this will be the topic of
another internship which will start next September.&lt;/p&gt;
&lt;p&gt;Browse no less than 1588 reference manuals right now at

, and recreate your own local version with
this Docker 2-liner:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --name quickref quickref/quickref
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker cp quickref:/home/quickref/quickref .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Lisp, Jazz, Aikido, 10 years later</title>
      <link>https://didierverna.net/news/2018-05-02-lisp-jazz-aikido-10-years-later/</link>
      <pubDate>Wed, 02 May 2018 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2018-05-02-lisp-jazz-aikido-10-years-later/</guid>
      <description>&lt;p&gt;10 years ago, I published a 
 entitled &amp;ldquo;Lisp, Jazz, Aikido&amp;rdquo;, barely
scratching the surface of what I found to be commonalities between the 3
disciplines. At the time, I had the intuition that those ideas were the tip of
a potentially big iceberg, and I ended the blog with the following sentence:
&amp;ldquo;I&amp;rsquo;d like to write a proper essay about these things when I find the time…
someday.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Well, 10 years later, I did. The essay, which is 50 pages long, has been
published in the 
, and actually received the
Reviewers&amp;rsquo; Choice Award 2018. I&amp;rsquo;m not the bragging type, far from it, but I
had to mention this because this essay is so personal, and I invested so much
in its preparation (more than 300 hours) that I am as deeply touched by the
award as I would have been hurt, had it been negatively received&amp;hellip;&lt;/p&gt;
&lt;p&gt;The live presentation has unfortunately not been recorded, but I took the time
to make a screencast afterwards, which is now 
. Just like the essay, this presentation
is not in the typical setting that you&amp;rsquo;d expect at a scientific conference…&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got an artistic fiber, if you&amp;rsquo;re sensitive to the aesthetic
dimension in what you do, you may enjoy this work…&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Announcing Quickref: a Global Documentation Project for Common Lisp</title>
      <link>https://didierverna.net/news/2017-12-13-quickref/</link>
      <pubDate>Wed, 13 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2017-12-13-quickref/</guid>
      <description>&lt;p&gt;Today, we deployed the first version of

, a new global documentation
project for Common Lisp.&lt;/p&gt;
&lt;p&gt;The purpose of Quickref is to provide a centralized collection of reference
manuals for the whole 
 world. This means around 1500
libraries, for a total of around 3000 ASDF systems. The reference manuals are
generated by

, which
is probably the most complete documentation system for Common Lisp currently
available, and delivered in HTML (PDF versions could easily be made available
as well).&lt;/p&gt;
&lt;p&gt;A lot of things can still be improved, but I&amp;rsquo;m pretty satisfied with the
result so far. 3000 ASDF systems is a hell of a test suite for Declt, and I&amp;rsquo;m
happy to report that it passes on practically all of them. Only a couple of
issues remain, not even due to Declt itself, and less than a dozen or so
libraries still pose problems (mostly technical difficulties due to foreign
dependencies).&lt;/p&gt;
&lt;p&gt;Quickref was made by Antoine Martin, as part of an internship with me. Many
thanks to him! We still have some cleanup and packaging to do, but we expect
to open-source the infrastructure soon. I also want to thank Mark Evenson,
Erik Huelsmann and the 
 for
hosting the project on common-lisp.net (it was only natural)!&lt;/p&gt;
&lt;p&gt;Finally, let me restate this again (and again): reference manuals are not user
manuals. They are… reference manuals. Although automatically generated, there
are some things you can do, as a library author, to improve the output (this
is an area of Declt which I intend to work on in the future). Please refer to
the Declt user manual (notably section 3.2 
) for more
information.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 2.3 &#34;Robert April&#34; is out</title>
      <link>https://didierverna.net/news/2017-12-02-declt-2.3/</link>
      <pubDate>Sat, 02 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2017-12-02-declt-2.3/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the next release of 

, my reference
manual generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;The improvements and bug fixes in this release are the result of running Declt
against the whole Quicklisp world (around 3000 ASDF systems for 1500
libraries). See 
 for more
information.&lt;/p&gt;
&lt;p&gt;New in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Advertise file extensions in references.&lt;/li&gt;
&lt;li&gt;Advertise the type of foreign definitions.&lt;/li&gt;
&lt;li&gt;More robust display and indexing of, and with, lambda-lists.&lt;/li&gt;
&lt;li&gt;Use UTF8 special characters to denote invisble ones.&lt;/li&gt;
&lt;li&gt;More robust support for Texinfo brace escaping.&lt;/li&gt;
&lt;li&gt;Handle modules sharing the same location.&lt;/li&gt;
&lt;li&gt;Ensure output is done with standard IO syntax.&lt;/li&gt;
&lt;li&gt;Fix potential duplication of some (non-lisp) files and document all static
files.&lt;/li&gt;
&lt;li&gt;Fix potential duplication of packages documentation.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Standard IO syntax and the Robustness Principle</title>
      <link>https://didierverna.net/news/2017-10-27-standard-io-syntax-and-the-robustness-principle/</link>
      <pubDate>Fri, 27 Oct 2017 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2017-10-27-standard-io-syntax-and-the-robustness-principle/</guid>
      <description>&lt;p&gt;Here is a flagrant illustration of the 
, or rather, of
a failure to honor it.&lt;/p&gt;
&lt;p&gt;I was investigating a bug in 

where some floating point
numbers were printed with exponent markers (&lt;em&gt;e.g.&lt;/em&gt; &lt;code&gt;0.5f0&lt;/code&gt; instead of just
&lt;code&gt;0.5&lt;/code&gt;) in the Texinfo file, which broke the parsing of the file by Perl.&lt;/p&gt;
&lt;p&gt;Eventually, I found out a double infringement of the robustness principle.
First of all, Declt failed to comply with part 1 of the robustness principle:
&amp;ldquo;be lenient with the others&amp;rdquo;. The Texinfo file generation routine should have
been wrapped into a call to &lt;code&gt;with-standard-io-syntax&lt;/code&gt; and it wasn&amp;rsquo;t. Always do
that to be on the safe side.&lt;/p&gt;
&lt;p&gt;This failure on my part, however, had the interesting consequence of
exhibiting what I consider a serious infringement of part 2 of the robustness
principle: &amp;ldquo;be strict with yourself&amp;rdquo;. It would have remained unnocited
otherwise. The culprit here is not Declt. This time, it&amp;rsquo;s the

 library.
Problem: the simple fact of loading this library globally changes the value of
&lt;code&gt;*read-default-float-format*&lt;/code&gt; from &lt;code&gt;single-float&lt;/code&gt; (the default) to
&lt;code&gt;double-float&lt;/code&gt;. This is bad, and it can break your code in all sorts of nasty
ways.&lt;/p&gt;
&lt;h3 id=&#34;explanation&#34;&gt;Explanation&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;*read-default-float-format*&lt;/code&gt; tells the reader how to read floats when no
exponent marker is provided. By default, 0.5 will be read as a &lt;code&gt;single-float&lt;/code&gt;.
But this variable also influences the printer (out of a concern for printing
readably I guess): when printing a float of a different format than the
current default, then the appropriate exponent marker is also printed. So here
is precisely what happened. Declt had been compiled with some floats (&lt;em&gt;e.g.&lt;/em&gt;
0.5) read as &lt;code&gt;single-float&lt;/code&gt;s. Later on, those floats were supposed to be
printed aesthetically as such. But right after loading common-lisp-stat, the
default format changed to &lt;code&gt;double-float&lt;/code&gt; and all of a sudden &lt;code&gt;0.5&lt;/code&gt; started to
be printed as &lt;code&gt;0.5f0&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;consequences&#34;&gt;Consequences&lt;/h3&gt;
&lt;p&gt;This is bad enough already, but consider that messing with the standard IO
syntax globally like this can break your code in all other sorts of even
nastier ways. Imagine for instance that common-lisp-stat had been loaded
&lt;em&gt;before&lt;/em&gt; Declt, and Declt needed to be recompiled. All of a sudden, Declt
would be using double floats and the bug would be gone. That is, until the
next start of the REPL, after which all floats would be printed like &lt;code&gt;0.5d0&lt;/code&gt;…&lt;/p&gt;
&lt;p&gt;So granted, my code wasn&amp;rsquo;t robust enough. But please, don&amp;rsquo;t mess with standard
IO syntax globally.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 2.2 &#34;Christopher Pike&#34; is out</title>
      <link>https://didierverna.net/news/2017-10-16-declt-2.2/</link>
      <pubDate>Mon, 16 Oct 2017 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2017-10-16-declt-2.2/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the next release of 

my reference
manual generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;The improvements and bug fixes in this release are the result of running Declt
against the whole Quicklisp world (around 3000 ASDF systems for 1500
libraries). See 
 for
more information.&lt;/p&gt;
&lt;p&gt;New in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Require a UTF-8 environment.&lt;/li&gt;
&lt;li&gt;Understand ASDF&amp;rsquo;s notion of inferred system, and also be more protective
against ASDF extensions.&lt;/li&gt;
&lt;li&gt;Support for improper lambda lists (&lt;em&gt;e.g.&lt;/em&gt; destructuring ones).&lt;/li&gt;
&lt;li&gt;Improve contact defaulting code.&lt;/li&gt;
&lt;li&gt;Update support for SBCL&amp;rsquo;s setf expanders introspection.&lt;/li&gt;
&lt;li&gt;Accept ASDF system designators.&lt;/li&gt;
&lt;li&gt;Various bug fixes in the areas of method combinations, accessor definition
merging and setf expanders.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Declt 2.1 &#34;Jonathan Archer&#34; is out</title>
      <link>https://didierverna.net/news/2017-02-28-declt-2.1/</link>
      <pubDate>Tue, 28 Feb 2017 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2017-02-28-declt-2.1/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the next release of 

, my reference
manual generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;New in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handle recent change in SBCL&amp;rsquo;s &lt;code&gt;sb-int:info&lt;/code&gt; API.&lt;/li&gt;
&lt;li&gt;Handle list of contacts (strings) in ASDF systems author and maintainer
slots.&lt;/li&gt;
&lt;li&gt;Some backward-incompatible changes in the keyword arguments to the &lt;code&gt;declt&lt;/code&gt;
function.&lt;/li&gt;
&lt;li&gt;More hyperlinks between systems and source files.&lt;/li&gt;
&lt;li&gt;More robust system&amp;rsquo;s packages collection (no more code walking).&lt;/li&gt;
&lt;li&gt;More robust handling of unavailable ASDF components.&lt;/li&gt;
&lt;li&gt;More robust naming of cross-references.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Declt 2.0.1 &#34;Benjamin Sisko&#34; is out</title>
      <link>https://didierverna.net/news/2015-11-04-declt-2.0.1/</link>
      <pubDate>Wed, 04 Nov 2015 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2015-11-04-declt-2.0.1/</guid>
      <description>&lt;p&gt;The next edition of 

, my reference manual generator for
Common Lisp Libraries, is out. This is a bugfix release with one internal
change (a special variable was not following the earmuffs convention) and one
actual bugfix (the same Texinfo anchor was generated for symbols with the same
name but in different packages).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ASDF-FLV 2.0</title>
      <link>https://didierverna.net/news/2015-10-12-asdf-flv-2.0/</link>
      <pubDate>Mon, 12 Oct 2015 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2015-10-12-asdf-flv-2.0/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released version 2.0 of

,
my ASDF extension for supporting file-local variables (&lt;em&gt;a la&lt;/em&gt; &lt;code&gt;*package*&lt;/code&gt;).
The code hasn&amp;rsquo;t changed, but as for my other libraries, the system and package
names are now prefixed with &lt;code&gt;net.didierverna&lt;/code&gt;. ASDF-FLV is also available on

 now.&lt;/p&gt;
&lt;p&gt;The reason I&amp;rsquo;m doing this now is that at least two of my other libraries are
going to use it in a mandatory way, either directly or indirectly (and in
turn, that&amp;rsquo;s because no implementation has bothered to implement 
 yet 🥲.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Return of Segfaults</title>
      <link>https://didierverna.net/news/2015-08-05-the-return-of-segfaults/</link>
      <pubDate>Wed, 05 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2015-08-05-the-return-of-segfaults/</guid>
      <description>&lt;p&gt;I was watching the discussion between Gilad Bracha and Matthias Felleisen on
gradual typing this afternoon (it&amp;rsquo;s available on

). This was the last event at the
STOP workshop, part of ECOOP 2015 in Prague. I couldn&amp;rsquo;t attend it because I
was somewhere else (Curry On) at the time. The discussion is interesting, but
if you go all the way, in the last 10 minutes or so, you will notice that
Matthias seems to be completely obsessed with what he calls the &amp;ldquo;Return of
SegFaults&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Basically, the point is the following. Mathias dislikes the optional types in
Common Lisp because it&amp;rsquo;s opening the door to unsafety. Initially, any dynamic
language has a sound type system (all type errors are caught; at run-time,
yes, but they are caught). As soon as you introduce an optional type system &lt;em&gt;a
la&lt;/em&gt; Lisp, the compiler implementors are &amp;ldquo;pushed&amp;rdquo; to use the provided type
information for optimization, hence weakening the type system and breaking
soundness. It&amp;rsquo;s the &amp;ldquo;return of segfauts&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Of course, I agree with that, at least in principle. Yes, Common Lisp&amp;rsquo;s weak,
optional type system is an antiquated thing. However, it seems to me that
Matthias is forgetting two important things on the practical level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By default in many implementations that I know, if not all of them,
introducing type declarations doesn&amp;rsquo;t actually break the soundness of the
type system but leads to even more type checking. For example, &lt;code&gt;(defun plus (a b) (+ a b))&lt;/code&gt; works on every possible numerical value, but add &lt;code&gt;(declare (type fixnum a b))&lt;/code&gt; in there and it will suddenly stop working on anything
else but integers. It&amp;rsquo;s only if you require the compiler to optimize for
&lt;code&gt;speed&lt;/code&gt; at the expense of &lt;code&gt;safety&lt;/code&gt; that you effectively weaken your type
system.&lt;/li&gt;
&lt;li&gt;In practice, the risk of re-introducing segfaults in your application may be
mitigated by the interactive aspect of the development (TDD made easier,
simultaneous write / compile / run / test / debug phases &lt;em&gt;etc.&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So my impression is that Matthias is largely exaggerating the problem, but I&amp;rsquo;m
not really qualified to tell. That&amp;rsquo;s why I would like to know from you guys,
working with Lisp in the industry, writing large applications, lots of type
annotations, and &lt;code&gt;(declaim (optimize (speed 3) (safety 0) (debug 0))&lt;/code&gt; (EDIT:
that&amp;rsquo;s exaggerated of course, I really mean breaking safety for performance
reasons): how much of a problem the &amp;quot;return of the segfaults&amp;quot; really is in
practice ?&lt;/p&gt;
&lt;p&gt;As a side note, this reminds me of the dynamic vs. lexical scoping debate.
Many people were and still are strongly opinionated against dynamic scoping by
default. Of course, I too, at least in principle. But how dangerous dynamic
scoping really is in practice (EDIT: I&amp;rsquo;m not talking about expressiveness,
&lt;em&gt;e.g.&lt;/em&gt; closures, here. Only unsafety)? What I can tell you is that in the 15
years I was actively maintaining the XEmacs codebase, I may have run into name
clashes due to dynamic scoping… twice.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 2.0 &#34;Kathryn Janeway&#34; is out (important)</title>
      <link>https://didierverna.net/news/2015-07-13-declt-2.0/</link>
      <pubDate>Mon, 13 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2015-07-13-declt-2.0/</guid>
      <description>&lt;p&gt;A new major version of 

, my reference manual generator for
Common Lisp Libraries, is out.&lt;/p&gt;
&lt;p&gt;This release doesn&amp;rsquo;t contain any change in functionality, yet deserves a major
version upgrade since it contains 3 important changes: an infrastructure
revamp (along the lines of what


endured not
so long ago), a license switch from the GNU GPL to a BSD one, and finally a
system / package name change. The prefix is now &lt;code&gt;net.didierverna&lt;/code&gt; instead of
&lt;code&gt;com.dvlsoft&lt;/code&gt;. Do I need to apologize for this again? 😀&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.1 &#34;Jean-Luc Picard&#34; is out</title>
      <link>https://didierverna.net/news/2015-06-29-declt-1.1/</link>
      <pubDate>Mon, 29 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2015-06-29-declt-1.1/</guid>
      <description>&lt;p&gt;As promised last week, I&amp;rsquo;ve just released a new version of


, my reference manual generator for Common Lisp Libraries.
This new version is now able to document 

again (the
documentation of which has been updated on the website).&lt;/p&gt;
&lt;p&gt;New in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Declt now properly handles and documents complex system and component
dependencies, such as &lt;code&gt;:feature&lt;/code&gt; &lt;code&gt;:require&lt;/code&gt; and &lt;code&gt;:version&lt;/code&gt; statements,&lt;/li&gt;
&lt;li&gt;Declt also documents a system&amp;rsquo;s &lt;code&gt;:if-feature&lt;/code&gt; if any.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the most important addition is the ability to document several ASDF
systems in the same reference manual. More precisely, Declt now documents not
only the main system but also all its subsystems. A subsystem is defined as a
system on which the main one depends on in any way, and which is also part of
the same distribution (under the same directory tree). Declt also understands
multiple system definitions from the same &lt;code&gt;.asd&lt;/code&gt; file.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b24 is out (important)</title>
      <link>https://didierverna.net/news/2015-06-25-clon-1.0b24/</link>
      <pubDate>Thu, 25 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2015-06-25-clon-1.0b24/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the release of the next beta version of


, the Common Lisp / Command-Line Options Nuker. This release
contains few functional changes, but a lot of infrastructure ones, plus very
important and backward-incompatible modifications. So if you&amp;rsquo;re a Clon user,
please read on.&lt;/p&gt;
&lt;p&gt;First of all, a huge revamp of the library&amp;rsquo;s infrastructure (package
hierarchy, ASDF systems, and Makefiles) has occurred. A large portion of this
work is actually not mine, but Faré&amp;rsquo;s (big thanks to him, &amp;lsquo;cause the level of
ASDF expertise required just means that I couldn&amp;rsquo;t have done that by myself).
The purpose here was twofold: first, remove all logic from the ASDF files (so
that other system managers could be used; not sure that&amp;rsquo;s actually useful
right now) and second, split the library in two: the core, basic functionality
and the non-standard platform-dependent bells and whistles (read: &lt;code&gt;termio&lt;/code&gt;
support). The result is that Clon now comes with 4 different ASDF systems. A
setup system allows you to configure some stuff prior to loading the library,
a core system allows you to load only the basic functionality and the regular
one loads everything, autodetecting platform-dependent features as before. The
fourth system is auxiliary and not to be used by hand. All of this is properly
documented. For a code maniac like me, this new infrastructure is much more
satisfactory, and I&amp;rsquo;ve learned a lot about ASDF less known features.&lt;/p&gt;
&lt;p&gt;Next, I&amp;rsquo;ve moved the repository to

. Please update your links! It
seems that I&amp;rsquo;ve lost all my former tags in the process, but oh well&amp;hellip;Only the
Git repo has moved. The main Clon web page still contains the full history of
tarballs, the preformatted documentation, and will continue to do so in the
future.&lt;/p&gt;
&lt;p&gt;Finally (I&amp;rsquo;ve kept this to myself until the last minute because I&amp;rsquo;m scared
like hell to tell): I&amp;rsquo;ve changed the systems and packages names&amp;hellip; The
&lt;code&gt;com.dvlsoft&lt;/code&gt; prefix has been replaced with &lt;code&gt;net.didierverna&lt;/code&gt;. All other
libraries of mine will eventually endure the same surgery. It&amp;rsquo;s for the best,
I apologize for it and I swear I will never ever do that again, &lt;em&gt;ever&lt;/em&gt;
(fingers crossed behind my back).&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s next? Before considering an official 1.0 release, there are two
things that I want to do. First, cleanup some remaining &amp;ldquo;fixmes&amp;rdquo; and some
shaky error handling. Second, provide an even simpler way of using Clon than
what the Quick Start chapter in the doc demonstrates. The idea is to just
implement a &lt;code&gt;main&lt;/code&gt; function with keyword arguments, and those arguments
magically become command-line options.&lt;/p&gt;
&lt;p&gt;A side-effect of this work is that

 now
chokes on Clon, because some ASDF features that it doesn&amp;rsquo;t understand are in
use. So Declt has a couple of new challenges ahead, and you should expect a
new release in the weeks to come.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0 &#34;James T. Kirk&#34; is out</title>
      <link>https://didierverna.net/news/2013-08-24-declt-1.0/</link>
      <pubDate>Sat, 24 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2013-08-24-declt-1.0/</guid>
      <description>&lt;p&gt;After 15 betas, I&amp;rsquo;m happy enough with the current state of


, my reference manual generator for Common Lisp Libraries,
to finally make a 1.0 release.&lt;/p&gt;
&lt;p&gt;A lot of things have changed since the previous version, sometimes in a
backward-incompatible way. Many more items are documented (including, as you
have recently 
, method
combinations). In addition to the reference manual, generated by Declt itself,
there is now a real user manual.&lt;/p&gt;
&lt;p&gt;Declt is still SBCL-only, requires ASDF 3 and Texinfo 4 but generates code
that is compatible with Texinfo 5. Also, beware, I&amp;rsquo;ve deleted the old
repository and moved the project to

. Below is a more precise
description of what Declt currently does.&lt;/p&gt;
&lt;p&gt;Declt (pronounce &amp;ldquo;dec&amp;rsquo;let&amp;rdquo;) is a reference manual generator for Common Lisp
libraries. It works by loading an ASDF system and introspecting its contents.
The generated documentation contains the description for the system itself and
its components (modules and files), the packages defined in that system and
the definitions found in those packages.&lt;/p&gt;
&lt;p&gt;Exported and internal definitions are listed separately. This allows the
reader to have a quick view on the library&amp;rsquo;s public API. Within each section,
definitions are sorted lexicographically.&lt;/p&gt;
&lt;p&gt;In addition to ASDF system components and packages, Declt documents the
following definitions: constants, special variables, symbol macros, macros,
setf expanders, compiler macros, functions (including setf ones), generic
functions and methods (including setf ones), method combinations, conditions,
structures, classes and types.&lt;/p&gt;
&lt;p&gt;The generated documentation includes every possible bit of information that
introspecting can provide: documentation strings, lambda lists (including
qualifiers and specializers where appropriate), slots (including type,
allocation and initialization arguments), definition source file &lt;em&gt;etc.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every documented item provides a full set of cross-references to related
items: ASDF component dependencies, parents and children, classes direct
methods, super and subclasses, slot readers and writers, setf expanders access
and update functions &lt;em&gt;etc.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Finally, Declt produces exhaustive and multiple-entry indexes for every
documented item.&lt;/p&gt;
&lt;p&gt;Reference manuals are generated in Texinfo format (compatible, but not
requiring Texinfo 5). From there it is possible to produce readable /
printable output in info, HTML, PDF, DVI and PostScript with tools such as
&lt;code&gt;makeinfo&lt;/code&gt;, &lt;code&gt;texi2dvi&lt;/code&gt; or &lt;code&gt;texi2pdf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The Declt reference manual is the primary example of documentation generated
by Declt itself.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lisp Corner Cases: Method Combinations</title>
      <link>https://didierverna.net/news/2013-08-16-method-combinations/</link>
      <pubDate>Fri, 16 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2013-08-16-method-combinations/</guid>
      <description>&lt;p&gt;In the process of writing

, I had
to deepen my knowledge of some Lisp corner cases, notably in the area of
introspection. As you know, Common Lisp has more than 2 namespaces (calling it
a &amp;ldquo;Lisp-2&amp;rdquo; is somewhat misleading). Sometimes, introspecting a potential
symbol definition in one namespace is trivial (&lt;code&gt;compiler-macro-function&lt;/code&gt; is
one example). The &amp;ldquo;functional&amp;rdquo; namespace is heterogeneous but you can still
make your way out of macros, regular or generic functions very easily.
Distinguishing constants, special variables and symbol macros in the
&amp;ldquo;variables&amp;rdquo; namespace is more complicated because there is no standard way to
access that information, but with the help of some vendor-specific machinery
(&lt;em&gt;e.g.&lt;/em&gt; &lt;code&gt;sb-int:info&lt;/code&gt;), it&amp;rsquo;s still doable.&lt;/p&gt;
&lt;p&gt;At some point, I tackled the case of method combinations, and to my greatest
surprise, found out that introspecting a method combination by name is not
simple. In fact, it&amp;rsquo;s not even doable. The reason is that method combinations
don&amp;rsquo;t have a namespace proper. Let me explain why.&lt;/p&gt;
&lt;p&gt;You define a new method combination of some NAME with
&lt;code&gt;define-method-combination&lt;/code&gt;, and you use it with the &lt;code&gt;:method-combination&lt;/code&gt;
option to &lt;code&gt;defgeneric&lt;/code&gt;. But how do you introspect a NAME for a potential
method combination definition? Well, you can&amp;rsquo;t do exactly that. First, there
is no standard way to do so. Next, let&amp;rsquo;s look at what the MOP provides. One
would expect something along the lines of &lt;code&gt;find-class&lt;/code&gt;…&lt;/p&gt;
&lt;p&gt;There is indeed something called &lt;code&gt;find-method-combination&lt;/code&gt;, but either I&amp;rsquo;m
missing something, or it is broken by design. The arguments to this function
are: a generic function meta-object, a method combination name and some method
combination options. So if this function is supposed to be the equivalent of
&lt;code&gt;find-class&lt;/code&gt; for method combinations, what are the 1st and 3rd arguments for?
In fact, this funjction is not supposed to do what its name suggests.
According to the AMOP, p.191, the purpose of this function is to &amp;ldquo;determine
the method combination object used by a generic function&amp;rdquo;. In practice however
(at least in SBCL), it&amp;rsquo;s not doing that either (see below), and anyway,
determining the method combination object used by a generic function is better
achieved by using the &lt;code&gt;generic-function-method-combination&lt;/code&gt; accessor.&lt;/p&gt;
&lt;p&gt;So this protocol doesn&amp;rsquo;t seem to make any sense. In order to understand what
to make of all this, I looked at how SBCL handles method combinations (I don&amp;rsquo;t
know what other vendors do) and here is what I found. When you call
&lt;code&gt;define-method-combination&lt;/code&gt; for some NAME, SBCL creates a new method for
&lt;code&gt;find-method-combination&lt;/code&gt;, eql-specialized on that NAME. This method is
encapsulated in a closure containing the method combination&amp;rsquo;s definition,
&lt;em&gt;ignores&lt;/em&gt; its first argument (the generic function meta-object; that&amp;rsquo;s why I
said that it&amp;rsquo;s not really doing what the AMOP says it does), recreates and
returns a &lt;em&gt;new&lt;/em&gt; method combination object on the fly every time it is called.&lt;/p&gt;
&lt;p&gt;This has several consequences. First, the notion of &amp;ldquo;method combination named
NAME&amp;rdquo; doesn&amp;rsquo;t really make sense. Method combinations don&amp;rsquo;t have a proper
namespace. Every time you create a new generic function, the method
combination essentially becomes local to that function. Redefining a method
combination has no effect on existing generic functions using a method
combination of the same NAME. To put it differently, you can end up with
several generic functions using different, yet equally named, method
combinations.&lt;/p&gt;
&lt;p&gt;In Declt, I&amp;rsquo;m now assuming that programmers behave and only define method
combinations once. Which brings us to the second consequence. With that
assumption in mind, the &amp;ldquo;proper&amp;rdquo; way to introspect a NAME for a method
combination definition (at least in SBCL) is to first look for the existence
of a &lt;code&gt;find-method-combination&lt;/code&gt; method eql-specialized on that NAME, and then
call it to retrieve the actual definition.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t thought about it a lot yet, but it would be interesting to
investigate the idea of cleaning this up a bit. I mean, establishing a real
global namespace for method combinations, creating an alternative
&lt;code&gt;find-method-combination&lt;/code&gt; protocol more along the lines of &lt;code&gt;find-class&lt;/code&gt;. And
then, it could also be interesting to investigate on the potential
applications of allowing method combination redefinition to affect live
generic functions, just like class redefinition affects live instances&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nice little trick du jour</title>
      <link>https://didierverna.net/news/2013-06-26-nice-little-trick-du-jour/</link>
      <pubDate>Wed, 26 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2013-06-26-nice-little-trick-du-jour/</guid>
      <description>&lt;p&gt;This morning, I came up with a nice little trick which made my day. Perhaps
this is already well known or even idiomatic, but in case it is not, it goes
like this.&lt;/p&gt;
&lt;p&gt;Sometimes, I have to read a whole Lisp file containing more than just one
toplevel form and get the contents as an unprocessed list of expressions. This
happens for instance when loading a DSL program that needs post-treatment.&lt;/p&gt;
&lt;p&gt;Until now, I did something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;with-open-file&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;loop&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:for&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;expr&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:eof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;ss&#34;&gt;:if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;eq&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;expr&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:eof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:return&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;exprs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;ss&#34;&gt;:else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:collect&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;expr&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:into&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;exprs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For some reason, this has always felt clunky to me. I mean, instead of ogling
the family jewels of this poor shy file, I should be able to read it as a
whole (hint: &lt;code&gt;read-delimited-list&lt;/code&gt;) and preserve its intimacy.&lt;/p&gt;
&lt;p&gt;And then I realized that the only thing that prevents me from using
&lt;code&gt;read-delimited-list&lt;/code&gt; is the lack of an ending parenthesis. But as always,
Common Lisp immediately comes to the rescue, this time with its rich streams
API. The idea is that you can create a string stream that just contains the
closing parenthesis, and concatenate this stream at the end of the other one.
I can now do something like this instead:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;with-open-file&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read-delimited-list&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;make-concatenated-stream&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;make-string-input-stream&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not only it is shorter, it also looks much more elegant to me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0b15 is out</title>
      <link>https://didierverna.net/news/2012-10-23-declt-1.0b15/</link>
      <pubDate>Tue, 23 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-10-23-declt-1.0b15/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released a new version of 

, my reference manual
generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;This version underwent a major internals overhaul, required by some of the new
features described below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Packages sections now advertise all definitions instead of just the symbols
naming them. They also advertise their use-list and used-by-list, with
cross-references.&lt;/li&gt;
&lt;li&gt;Conditions, structures and classes now advertise their sub- and
super-classes, direct methods, initargs and slots, with cross-references.&lt;/li&gt;
&lt;li&gt;Slots documentation include docstring, type, initargs, initforms, readers
and writers with cross-references.&lt;/li&gt;
&lt;li&gt;Declt now documents symbol macros and compiler macros.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;*link-files*&lt;/code&gt; special is gone (&lt;code&gt;M-x all-hail-purely-functional-style&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;All ASDF components now advertise their descriptions and long descriptions,
if any.&lt;/li&gt;
&lt;li&gt;Docstrings are displayed in a more reader-friendly fashion.&lt;/li&gt;
&lt;li&gt;Documentation entries for methods are nested within the corresponding
generic function entry.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b23 is out</title>
      <link>https://didierverna.net/news/2012-09-26-clon-1.0b23/</link>
      <pubDate>Wed, 26 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-09-26-clon-1.0b23/</guid>
      <description>&lt;p&gt;A new version of 

, the Common Lisp / Command-Line Options
Nuker, is out.&lt;/p&gt;
&lt;p&gt;Amongst other things, the following improvements have been made.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for ABCL has been updated, now that it provides a full MOP.&lt;/li&gt;
&lt;li&gt;A workaround for SBCL&amp;rsquo;s CC environment variable problem has been
implemented. If the variable is not set (required for sb-grovel), Clon now
switches to restricted mode instead of aborting.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;dump&lt;/code&gt; macro has been extended to accept a &lt;code&gt;&amp;amp;rest&lt;/code&gt; argument that will be
passed on to the underlying, implementation-specific, dumping facility.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;contrib&lt;/code&gt; directory has been added, for storing unapplied patches,
suggestions &lt;em&gt;etc.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0b14 is out</title>
      <link>https://didierverna.net/news/2012-09-25-declt-1.0b14/</link>
      <pubDate>Tue, 25 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-09-25-declt-1.0b14/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released a new version of 

, my reference manual
generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;This release containts some improvements based on Sabra Crolleton&amp;rsquo;s feedback.
The most notable improvements are support for two new license types (MIT and
LGPL), a new &lt;code&gt;:declt-notice&lt;/code&gt; keyword argument that gives you control on the
&amp;ldquo;automatically generated by Declt&amp;rdquo; notice that appears in the reference
manuals, and a bug fix (missing support for empty lists in lambda-lists).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Language wars</title>
      <link>https://didierverna.net/news/2012-07-12-language-wars/</link>
      <pubDate>Thu, 12 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-07-12-language-wars/</guid>
      <description>&lt;p&gt;Programming languages are tools. Just like hammers. There&amp;rsquo;s nothing personal
about them. They just help you build stuff. Yet, there are many religious wars
about programming languages out there. Wars which despite being all about
science, are much more related to emotions, beliefs and personal aggressions
than about objective arguments. This is funny because do you know of any
religious wars about hammers? So what&amp;rsquo;s the difference?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a recent personal example. A guy explaining how the static typing of
Common Lisp works (type declarations) and what kind of performance-oriented
optimization can be achieved with it (C-like, static but weak typing in SBCL
for instance). And then, there&amp;rsquo;s inevitably the troll (whom I &amp;ldquo;know&amp;rdquo; knows
better) in the audience who goes:&lt;/p&gt;



  
  &lt;blockquote class=&#34;border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6&#34;&gt;
    &lt;p&gt;So, yeah, what you&amp;rsquo;re doing is just C code, and you have to type manually,
and it&amp;rsquo;s &lt;strong&gt;ugly&lt;/strong&gt;. So if it&amp;rsquo;s just for writing C code, I don&amp;rsquo;t see the point
in using another language.&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;p&gt;Hmmm. Let&amp;rsquo;s see. So, yes indeed, static typing in Common Lisp is ugly. And
yes, it&amp;rsquo;s not even strong typing. And yes, it would be nicer to have run-time
hotspot detection and automatic type-dependant optimization like what&amp;rsquo;s found
in some other languages or virtual machines, rather than having to do it by
hand. But what does that &lt;em&gt;really&lt;/em&gt; tell you? That no language is perfect? Wow,
thank you very much, that&amp;rsquo;s new. For as much as I think that &lt;em&gt;Lisp The Idea&lt;/em&gt;™
is perfect, I don&amp;rsquo;t think anyone ever pretended that Common Lisp (or any other
Lisp for that matter) was. But is that a reason for not using it &amp;ldquo;at all&amp;rdquo; and
sticking to C? Any sane computer scientist knows that the choice of a language
doesn&amp;rsquo;t boil down to only one parameter. Any computer scientist who tells
otherwise is a troll.&lt;/p&gt;
&lt;p&gt;In spite of all its defects, I still have a gazillon reasons to prefer Common
Lisp over C, C++, or any language that I know of currently (and this may very
well change in the future). The flexibility of lambda lists, the macros, the
MOP or more generally its structural and behavioral reflexivity. Its run-time
compilation, debugging, introspection and intersession capabilities. These are
just a few examples. Still, I don&amp;rsquo;t deny anyone the right to prefer another
language for whatever purpose and whatever reasons they may feel legitimate.&lt;/p&gt;
&lt;p&gt;So, I normally just ignore those purposedly trollesque and completely idiotic
remarks. Yet, sometimes like yesterday, I snap. It gets on my nerves and I
become all upset and angry. Why? I never get angry when someone tells me that
my hammer is a piece of crap (it&amp;rsquo;s not). I do enough 
 to know how to control my temper, but for
some reason, it doesn&amp;rsquo;t always work when it comes to programming languages. So
what is it about them that in spite of all your efforts, you can&amp;rsquo;t help from
getting personally and emotionally involved once in a while?&lt;/p&gt;
&lt;p&gt;I think the answer becomes apparent when you consider the artistic aspect in
programming. When an artist creates a piece (music, theater, dance, painting,
architecture, whatever you like), they expose a very intimate part of
themselves through their creation. The art &lt;em&gt;is&lt;/em&gt; the artist, and the artist
&lt;em&gt;is&lt;/em&gt; their art. In doing so, they put themselves in danger. It&amp;rsquo;s a well know
fact that many artists are very fragile, in the sense that they suffer from
their creation not being liked. Because a piece of art is intrinsically a
piece of the artist himself, when you say &amp;ldquo;I don&amp;rsquo;t like this piece of art&amp;rdquo;,
you&amp;rsquo;re actually saying &amp;ldquo;I don&amp;rsquo;t like the artist&amp;rdquo;. Then, it&amp;rsquo;s up to artist to
handle the fact of not being liked.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s the whole problem, which, also as a

, I know all too well. Where does the
artistic fiber come from? It&amp;rsquo;s an urge to express yourself. To express
something that you can&amp;rsquo;t express in any other way. A very deep and perpetual
wound of some sort, a feeling of not really belonging. More importantly, it&amp;rsquo;s
a calling. Sometimes, the simple fact of creating is enough to heal you a bit,
but more often, you create in order for your creation to be seen or heard. So
yes, it&amp;rsquo;s a cry to the Other. You expect them to answer your call by telling
you that they like you (your art, but that is the same). Artists often have
this urge to be liked by the others. So when you dislike some artwork, you&amp;rsquo;re
also not liking the artist himself (the part of him that lives in his
creation) and you&amp;rsquo;re actually giving him the exact opposite of what he was
looking for. And that hurts.&lt;/p&gt;
&lt;p&gt;Back to programming languages. Why do we get all emotional about them, and not
about hammers? The answer is in fact quite simple. Look at an architectural
masterpiece. Do you see the hammer that was used to build it? Now look at a
beautiful (definition left to the reader) program. Do you see the language
that was used to write it? That&amp;rsquo;s the crucial difference. You cannot decouple
the language from the program, even once it has been written (the art is not
in the executable; it&amp;rsquo;s in the source code). The language itself will always
be here for you to contemplate.&lt;/p&gt;
&lt;p&gt;All in all, I think that this is why there will always be language wars.
Programming languages are not just tools, actually. They&amp;rsquo;re not just like
hammers. Programming languages are… languages first: means to expressing your
inner self. As soon as you care about the code you write, your software
becomes artwork, you become an artist, and you start to be personally and
emotionally involved. Your software becomes part of &lt;strong&gt;you&lt;/strong&gt;. And contrary to
the hammer, your sticky programming language, being intrinsically bound to the
artwork, also becomes part of &lt;strong&gt;you&lt;/strong&gt;. That&amp;rsquo;s when the battle for objectivity
is lost. By criticizing the language, the troll also criticizes your artwork,
and in doing so, he tells you that he doesn&amp;rsquo;t like you. That may hurt.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s good to consider programming as art. Unfortunately, this also means that
there will always be language wars.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0b13 is out</title>
      <link>https://didierverna.net/news/2012-06-04-declt-1.0b13/</link>
      <pubDate>Mon, 04 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-06-04-declt-1.0b13/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released a new version of 

, my reference manual
generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;This release includes some uninteresting internals update, plus an important
bug fix: there were two calls to &lt;code&gt;find-method&lt;/code&gt; missing an &lt;code&gt;errorp&lt;/code&gt; flag set to
nil, leading to Declt throwing an error where it shouldn&amp;rsquo;t have.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b22 is out</title>
      <link>https://didierverna.net/news/2012-05-22-clon-1.0b22/</link>
      <pubDate>Tue, 22 May 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-05-22-clon-1.0b22/</guid>
      <description>&lt;p&gt;A new version of 

, the Common Lisp / Command-Line Options
Nuker, is out.&lt;/p&gt;
&lt;p&gt;The most important change in this release is the support for LispWorks, which
brings the number of supported implementations to 8. One left to go, and I may
eventually switch to RC status. Thanks to Martin Simmons for providing a fully
functionnal version of LW 6.1. As for CLISP and Allegro, there is an optional
dependency on CFFI for LispWorks.&lt;/p&gt;
&lt;p&gt;Two backward incompatible changes that may affect you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Variables renamings: &lt;code&gt;*current-context*&lt;/code&gt; has been renamed &lt;code&gt;*context*&lt;/code&gt;, and
&lt;code&gt;*default-synopsis*&lt;/code&gt; has been renamed &lt;code&gt;*synopsis*&lt;/code&gt;. This should remain
transparent unless you&amp;rsquo;re using Clon in a somewhat advanced way.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clon:exit&lt;/code&gt; has been upgraded to SBCL&amp;rsquo;s new quitting protocol. If you use
this function (or if you want to compile the demo programs), please upgrade
to SBCL 1.0.57.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, support for terminal autodetection and stream handling in general has
been improved for all implementations.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Syntax Extension Myth</title>
      <link>https://didierverna.net/news/2012-05-14-syntax-extension/</link>
      <pubDate>Mon, 14 May 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-05-14-syntax-extension/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a little Monday Troll.&lt;/p&gt;
&lt;p&gt;To my greatest disappointment, I discovered today that it is not possible to
replace Lisp parenthesis by, say, curly braces. What a shame. Hell, it&amp;rsquo;s not
even possible to freely mix the two. Very naively, I had expected that&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\{&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\(&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;would suffice, but no. All implementations that I have tested seem to agree on
this, although the error messages may differ. For instance, trying to evaluate
&lt;code&gt;{and}&lt;/code&gt; gives you an &amp;ldquo;unmatched close parenthesis error&amp;rdquo; except for CMU-CL
which chooses to ignore it, but then report an end-of-file error. The
unmatched close parenthesis, of course, is the closing curly brace. So what is
going on here?&lt;/p&gt;
&lt;p&gt;When an opening curly brace is read, the original left paren macro function is
called. In SBCL for instance, this is &lt;code&gt;sb-impl::read-list&lt;/code&gt;, which looks for a
hardwired right parenthesis on the stream. Yuck. It doesn&amp;rsquo;t find one, but it
finds my closing brace which triggers the &amp;ldquo;standalone&amp;rdquo; right paren behavior
(spurious parenthesis alert). In passing, it also surprised me that
&lt;code&gt;sb-impl::read-list&lt;/code&gt; is not implemented in terms of &lt;code&gt;read-delimited-list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; as mentioned in several comments, we could use &lt;code&gt;read-delimited-list&lt;/code&gt;
to look for a closing curly brace, but even this won&amp;rsquo;t work completely. The
problem is with dotted lists (see Pascal&amp;rsquo;s comment). SBCL hard-wires &lt;code&gt;#\)&lt;/code&gt; in
its dotted lists parsing procedures.&lt;/p&gt;
&lt;p&gt;So it appears that dispatching macro characters are only shaky. What we miss
is a true concept of syntactic categories (Common Lisp character syntax types
are close, but not quite there yet). In fact, TeX, with its notion of
&amp;ldquo;catcodes&amp;rdquo; (category codes), seems to be the only language that gets this
right. Ideally, any character with a status of list terminator should do as
good as a right paren (the problem is only with closing, not opening).&lt;/p&gt;
&lt;p&gt;Instead of hard-wiring the right parenthesis in the Lisp parser, a quick
workaround would be to check whether the next character on the stream is a
dispatching one, and in such a case, whether its macro function is the one
originally associated with the right paren. If so, it should then simply stand
as a list terminator. This is actually an interesting idea I think: could the
built-in macro functions become equivalent to actual category codes, and could
we completely remove hard-wired characters in Lisp parsers?&lt;/p&gt;
&lt;p&gt;Anyway, this whole story is a true scandal because it ruined an otherwise cool
live demo of mine. So much for syntax extensibility.&lt;/p&gt;
&lt;h3 id=&#34;comments&#34;&gt;Comments&lt;/h3&gt;
&lt;h4 id=&#34;from-pascal-bourguignon&#34;&gt;From Pascal Bourguignon&lt;/h4&gt;
&lt;p&gt;Indeed, the main point is that CL doesn&amp;rsquo;t export facilities to read
dotted-lists, only proper lists. And implementing dotted list reading is not
even easy (you cannot just use peek-char and read, you need lower level
parsing).&lt;/p&gt;
&lt;p&gt;Nonetheless, syntax extensibility can be as easy as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cl-user&amp;gt; (make-lisp-list-macro-character #\{)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#\}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cl-user&amp;gt; &amp;#39;{a {1 2 3} {} c . d}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(a (1 2 3) nil c . d)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See 
.&lt;/p&gt;
&lt;p&gt;PS: Thanks for that blog entry, I found a bug in my lisp reader 😉&lt;/p&gt;
&lt;h4 id=&#34;from-eivind-midtgård&#34;&gt;From Eivind Midtgård&lt;/h4&gt;
&lt;p&gt;This is explained in CLTL2, just the way you found it to be, in the entry for
set-syntax-from-char, p.541, 542.&lt;/p&gt;
&lt;h4 id=&#34;from-greg-pfeil&#34;&gt;From Greg Pfeil&lt;/h4&gt;
&lt;p&gt;You can achieve your goal almost as simply, though:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read-delimited-list&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\}&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The problem with your original attempt, IMO, is that if CL were defined in a
way that allowed that, the result would be to allow (and} and {and) in
addition to the expected {and}, which seems very non-intuitive to me.&lt;/p&gt;
&lt;p&gt;If you want to (} and {) to work, it&amp;rsquo;s possible, but it does (and should)
require more work to do so.&lt;/p&gt;
&lt;p&gt;That said, with Unicode, an implementation might be able to define #( such
that it matched the mirrored character in the Unicode DB, and then
&lt;code&gt;(set-macro-character #\{ (get-macro-character #\())&lt;/code&gt; could work in the
intuitive way, but I don&amp;rsquo;t know if that would be conforming, and it certainly
wouldn&amp;rsquo;t be portable.&lt;/p&gt;
&lt;h4 id=&#34;from-danm&#34;&gt;From DanM&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;m sorry you&amp;rsquo;re disappointed, but think that your expectation is simply not
in accord with the CL reader&amp;rsquo;s implementation model. You should be able to
quite easily do what you wanted thus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read-delimited-list&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\}&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;an object cannot start an object with #\}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The second call serves two purposes: it causes the closing brace to be treated
as something other than a constituent character when it appears alone, and
(because the optional non-terminating-p argument to set-macro-character is
allowed to default to nil) makes it terminate a symbol without becoming part
of it.&lt;/p&gt;
&lt;p&gt;So you can do what you want easily with no additional infrastructure.&lt;/p&gt;
&lt;p&gt;This is quite elegant and requires no further.&lt;/p&gt;
&lt;h4 id=&#34;from-me&#34;&gt;From me&lt;/h4&gt;
&lt;p&gt;@Pascal: exactly. There are 2 other places in SBCL where &lt;code&gt;#\)&lt;/code&gt; is hard-wired,
and these have to do with reading dotted lists. Thanks for the paste BTW!&lt;/p&gt;
&lt;p&gt;@Eivind: thank you for the pointer.&lt;/p&gt;
&lt;p&gt;@Greg, Cosman, Dan: yes, you can use read-delimited-list, but this will still
not function properly in all cases. See Pascal&amp;rsquo;s comment (I should have
mentionned this in my original post).&lt;/p&gt;
&lt;h4 id=&#34;from-jerry-boetje&#34;&gt;From Jerry Boetje&lt;/h4&gt;
&lt;p&gt;Yes, CLforJava and I are still around and working. When I saw post, I went to
see how CLforJava handles your test. Of course, it had a similar result.
However, after reading the rest of your text, I remembered that we devised a
character syntax type system into the base of the reader. Might be an
interesting job for a student…&lt;/p&gt;
&lt;h4 id=&#34;from-marc-espie&#34;&gt;From Marc Espie&lt;/h4&gt;
&lt;p&gt;TeX gets it right, except it does not have enough introspection.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s darn nigh impossible to get it to regurgitate text and fudge with the
catcodes, leading to appendix D and the very obscure \afterassignment
hack.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b21 is out</title>
      <link>https://didierverna.net/news/2012-03-12-clon-1.0b21/</link>
      <pubDate>Mon, 12 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-03-12-clon-1.0b21/</guid>
      <description>&lt;p&gt;One year between b19 and b20. 4 days between b20 and b21&amp;hellip;&lt;/p&gt;
&lt;p&gt;This new version of 

, the Common Lisp / Command-Line Options
Nuker, introduces support for a new compiler, Allegro Common Lisp, in both
standard and modern form. Support for dumping is only rudimentary for ACL
(although it&amp;rsquo;s only a marginal feature of the library). The &lt;code&gt;dump&lt;/code&gt; macro uses
Allegro&amp;rsquo;s dumplisp mechanism to dump a lisp image which is not directly
executable (full application delivery is complicated and only available in the
Enterprise edition). Apart from that, the rest should work fine. As in the
case of CLISP, Allegro may benefit from the presence of CFFI in order to
provide terminal autodetection. This is an optional dependency only.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b20 is out</title>
      <link>https://didierverna.net/news/2012-03-08-clon-1.0b20/</link>
      <pubDate>Thu, 08 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2012-03-08-clon-1.0b20/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce a new release of 

, the Common Lisp /
Command-Line Options Nuker. In addition to a lot of uninteresting code and
infrastructure changes, this new release comes with several important
improvements and new features.&lt;/p&gt;
&lt;h4 id=&#34;at-the-end-user-level&#34;&gt;At the end-user level&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;There is a new error handler available via the &lt;code&gt;--clon-error-handler&lt;/code&gt;
option, called &amp;ldquo;interactive&amp;rdquo;. This error handler provides the same restarts
as the one called &amp;ldquo;none&amp;rdquo; (which actually triggers the Lisp debugger), but in
a less frightening way for end-users not knowing about Lisp at all. In
particular, the error and restart messages are more readable and you don&amp;rsquo;t
see a Lisp stack anywhere. See the 

and the 

for more information.&lt;/li&gt;
&lt;li&gt;There is a new option called &lt;code&gt;--clon-lisp-information&lt;/code&gt; which, as its name
suggests, provides information about the underlying Lisp (implementation
type and version). This will in fact be more useful for developers than for
end-users, but it&amp;rsquo;s still and end-user level feature. See the 

for (not) much more information.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;at-the-user-level&#34;&gt;At the user-level&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Clon now provides a command-line polling API through the functions
&lt;code&gt;cmdline-options-p&lt;/code&gt; and &lt;code&gt;cmdline-p&lt;/code&gt;. See the 

for more information.&lt;/li&gt;
&lt;li&gt;Support for using Clon interactively, that is, &amp;ldquo;without&amp;rdquo; dumping executables
has been improved. This is mostly useful for debugging purposes. See the


for more information.&lt;/li&gt;
&lt;li&gt;Clon now provides a compile-time / run-time unified configuration facility
thanks to a variable named &lt;code&gt;cl-user::com.dvlsoft.clon.configuration&lt;/code&gt; that is
handled before the ASDF system is loaded. Thanks to this, Clon is now able
to communicate its own indentation information to Emacs directly (thanks to
a process that I&amp;rsquo;ve previously described

), and
also handles portability problems in a smoother way (see below).&lt;/li&gt;
&lt;li&gt;One of the available configuration options is called &lt;code&gt;:restricted&lt;/code&gt; mode. In
this mode, Clon never attempts to communicate with TTYs via IOCTL calls, at
the expense of terminal autodetection (size and highlighting). This is
implemented by making a &lt;code&gt;termio&lt;/code&gt; ASDF module conditionally loaded in the
system definition. There are cases where Clon will switch to restricted mode
automatically (&lt;em&gt;e.g.&lt;/em&gt; when using CLISP compiled without FFI support).
However, some other situations are more problematic, for instance when using
SBCL under MinGW, in which case the &lt;code&gt;sb-grovel&lt;/code&gt; module is available but
doesn&amp;rsquo;t work. In such situations, it is necessary to configure Clon
explicitely for restricted mode before loading the system. See the 

for more information.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>CL-RCFiles 2.0 is out</title>
      <link>https://didierverna.net/news/2011-11-28-cl-rcfiles-2.0/</link>
      <pubDate>Mon, 28 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-11-28-cl-rcfiles-2.0/</guid>
      <description>&lt;p&gt;Just a quick note to mention the release of


2.0. This version adds pre-loading initialization files.&lt;/p&gt;
&lt;p&gt;This very small Common Lisp library provides a way to add initialization files
to ASDF systems. Every time ASDF loads &lt;code&gt;system&lt;/code&gt;, one or several corresponding
&lt;code&gt;system&lt;/code&gt;.lisp files are loaded automatically afterwards. This lets you
conditionally plug in additional behavior on a per-system basis without
cluttering up any global Common Lisp initialization file.&lt;/p&gt;
&lt;p&gt;By default, these initialization files are expected to be found in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;~/share/common-lisp/rc/pre/ for pre-loading initialization,&lt;/li&gt;
&lt;li&gt;~/share/common-lisp/rc/post/ for post-loading initialization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For backward-compatibility, files found directly in the rc/ directory are
considered to be post-loading initialization files.&lt;/p&gt;
&lt;p&gt;You can modify the rc-files location by changing the values of the global
variables &lt;code&gt;*directory*&lt;/code&gt;, &lt;code&gt;*pre-directory*&lt;/code&gt;, and &lt;code&gt;*post-directory*&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>One More Indentation Hack</title>
      <link>https://didierverna.net/news/2011-07-20-one-more-indentation-hack/</link>
      <pubDate>Wed, 20 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-07-20-one-more-indentation-hack/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s yet another indentation hack that I came up with recently.&lt;/p&gt;
&lt;p&gt;All the work done by Nikodemus on the Slime indentation contrib is pretty
cool, especially the notion of indentation style (though I wish the styles
were Custom variables, but that is another story). I tend to use indentation
styles for global, maybe collaborative preferences, but on several occasions
however, I find that this approach has a couple of drawbacks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of them is that the indentation information is far away from the
corresponding symbol, in a separate file. If you change a function&amp;rsquo;s
prototype for instance, you may also need to load the file(s) in which the
corresponding style(s) is (are) defined and edit them.&lt;/li&gt;
&lt;li&gt;The other problem is that if you want to let other people edit your source
code and honor your indentation style, you also need to provide them with
the style definition, and they need to load it separately.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For those reasons, I tend to think that the indentation style approach is not
very well suited for project-specific indentation settings. What I would like
is to provide indentation information close to the function definition, and
also to have that information automatically available when &lt;em&gt;anyone&lt;/em&gt; loads the
project into Slime. Here&amp;rsquo;s a way to do it.&lt;/p&gt;
&lt;p&gt;The key to success here is the function &lt;code&gt;swank:eval-in-emacs&lt;/code&gt; which, as its
name suggests, sends some Emacs Lisp code to your Emacs session for
evaluation. This function effectively allows you to trigger some Emacs Lisp
computation from a Common Lisp file. Remember that indentation information is
stored in the &lt;code&gt;common-lisp-indent-function&lt;/code&gt; property of a symbol. The function
&lt;code&gt;clindent&lt;/code&gt; below does this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;clindent&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;symbol&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;Set SYMBOL&amp;#39;s indentation to INDENT in Emacs.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;This function sets SYMBOL&amp;#39;s `common-lisp-indent-function&amp;#39; property.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;If INDENT is a symbol, use its indentation definition.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;Otherwise, INDENT is considered as an indentation definition.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;member&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:swank&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*features*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		       &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;find-symbol&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;MY.LIBRARY.CONFIGURATION&amp;#34;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:cl-user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;configuration&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;boundp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getf&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;symbol-value&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:swank-eval-in-emacs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;funcall&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;intern&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;EVAL-IN-EMACS&amp;#34;&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:swank&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;put&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;,symbol&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;common-lisp-indent-function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	    &lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;symbolp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		  &lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;,indent&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;common-lisp-indent-function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		  &lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;&amp;#39;,indent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As explained in the docstring, this function will ask Emacs to put &lt;code&gt;SYMBOL&lt;/code&gt;&amp;rsquo;s
&lt;code&gt;common-lisp-indent-function&lt;/code&gt; property to a definition, either provided
directly, or retrieved from another symbol. For example, if your library
defines an &lt;code&gt;econd&lt;/code&gt; macro, you may want to call it like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clindent&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;econd&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;cond&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function ensures that Swank is actually available before using it (first
condition in the &lt;code&gt;and&lt;/code&gt; clause). I will explain the other weird bits later on.&lt;/p&gt;
&lt;p&gt;The next question is when exactly do we want to call this function? The answer
is: pretty much on all occasions. Your code might be loaded from source and
interpreted, or it might be compiled. But then, it might be compiled within or
outside a Slime environment. In any case, you want your indentation
information to be sent to Emacs everytime it&amp;rsquo;s possible. So obviously, we&amp;rsquo;re
gonna wrap this function in an &lt;code&gt;eval-when&lt;/code&gt; form thanks to a macro. This is
also a good opportunity to save some quoting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmacro&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;defindent&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;symbol&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;Set SYMBOL&amp;#39;s indentation to INDENT in Emacs.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;SYMBOL and INDENT need not be quoted.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;See `clindent&amp;#39; for more information.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;eval-when&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:compile-toplevel&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:execute&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:load-toplevel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clindent&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;,symbol&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;,indent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now, right on top of your &lt;code&gt;econd&lt;/code&gt; definition, you can just say this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;defindent&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;econd&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cond&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now here&amp;rsquo;s one final step. If your library uses its own readtable, it&amp;rsquo;s even
more convenient to define a reader-macro for indentation information. I choose
&lt;code&gt;#i&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;i-reader&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;subchar&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;arg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;Read an argument list for the DEFINDENT macro.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;declare&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ignore&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;subchar&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;arg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;cons&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;defindent&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-dispatch-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\#&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\i&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;i-reader&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*readtable*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now, the code will look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;econd&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cond&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmacro&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;econd&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;#|...|#&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All right. We still have two weirdos to explain in the &lt;code&gt;clindent&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;First, you noticed that the function&amp;rsquo;s computation is conditionalized on the
existence of a &lt;code&gt;cl-user::my.library.configuration&lt;/code&gt; variable, which actually
stores a property list of various compiling or loading options for this
package. The option we&amp;rsquo;re interested in is &lt;code&gt;:swank-eval-in-emacs&lt;/code&gt;, which must
be set to non-nil. Here&amp;rsquo;s why. The execution of Emacs Lisp code from Swank is
(rightfully) considered as a security risk so it is disabled by default. If
you want to authorize that, you need to set the (Emacs) variable
&lt;code&gt;slime-enable-evaluate-in-emacs&lt;/code&gt; to &lt;code&gt;t&lt;/code&gt;. Otherwise, calling
&lt;code&gt;swank:evaluate-in-emacs&lt;/code&gt; is like calling 911. So we have a chicken-and-egg
problem here: if we want to avoid an error in &lt;code&gt;clindent&lt;/code&gt;, we would need to
check the value of this variable, but in order to do that, we would need to
evaluate something in Emacs… 🤨&lt;/p&gt;
&lt;p&gt;The solution I choose is hence to disable the functionality by default, and
document the fact that if people want to use my indentation information, they
need to set &lt;em&gt;both&lt;/em&gt; the Slime variable and my library-specific option to &lt;code&gt;t&lt;/code&gt;
before loading the library (possibly setting them back to &lt;code&gt;nil&lt;/code&gt; afterwards).
They also need to trust that I&amp;rsquo;m not going to inject anything suspicious into
their Emacs session at the same time…&lt;/p&gt;
&lt;p&gt;The last bit we need to explain is the final &lt;code&gt;t&lt;/code&gt; argument passed to
&lt;code&gt;swank:eval-in-emacs&lt;/code&gt;. The corresponding parameter is called &lt;code&gt;nowait&lt;/code&gt; in the
function&amp;rsquo;s prototype. It has something to do with asynchronous computation,
and in fact, I don&amp;rsquo;t really know what&amp;rsquo;s going on under the hood, but what I do
know is that if you set it to &lt;code&gt;t&lt;/code&gt;, Swank doesn&amp;rsquo;t care about the return value
of your form anymore, which is fine because we&amp;rsquo;re only doing a side effect. On
the other hand, if you omit that parameter, Swank will try to interpret the
return value in some way, and you will most probably get a serialization
error. Indeed, the return value is the indentation definition itself, so for
example, &lt;code&gt;(&amp;amp;rest (&amp;amp;whole 2 &amp;amp;rest 1))&lt;/code&gt; doesn&amp;rsquo;t make (Common Lisp) sense.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0b12 is out</title>
      <link>https://didierverna.net/news/2011-06-29-declt-1.0b12/</link>
      <pubDate>Wed, 29 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-06-29-declt-1.0b12/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released the next version of 

, my reference
manual generator for Common Lisp Libraries.&lt;/p&gt;
&lt;p&gt;This release includes some fixes for the Info format target but most notably,
support for documenting (generic) writer functions and methods. When it makes
sense, the documentations for &lt;code&gt;func&lt;/code&gt; and &lt;code&gt;(setf func)&lt;/code&gt; are grouped together.
Getting closer to an official 1.0 stable version…&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Read-Time String Concatenation</title>
      <link>https://didierverna.net/news/2011-06-21-read-time-string-concatenation/</link>
      <pubDate>Tue, 21 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-06-21-read-time-string-concatenation/</guid>
      <description>&lt;p&gt;Sometimes, I miss the string concatenation capability of C. I mean, the way
that you can split a long string into smaller ones and have them automatically
concatenated together. The &lt;code&gt;format&lt;/code&gt; function has a tilde (~) directive that
does something along these lines, but there are two problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first, I&amp;rsquo;m not necessarily facing the problem in &lt;code&gt;format&lt;/code&gt; calls,&lt;/li&gt;
&lt;li&gt;next, my favorite text editor cannot properly indent the string contents
when I press the &lt;code&gt;TAB&lt;/code&gt; key.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defclass&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;sample&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;slot&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:documentation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;s&#34;&gt;&amp;#34;A very long slot documentation, that doesn&amp;#39;t even fit in 80 columns, which is a shame...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If that were C code, I could write this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defclass&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;sample&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;slot&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:documentation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;s&#34;&gt;&amp;#34;A very long slot documentation, &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;s&#34;&gt;&amp;#34;that doesn&amp;#39;t even fit in 80 columns, &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;s&#34;&gt;&amp;#34;which is a shame...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But this is not C code. We can come very close to that however. Here&amp;rsquo;s a small
reader function that will automatically concatenate strings prefixed with a
tilde (~) character (in honor of the eponymous &lt;code&gt;format&lt;/code&gt; directive):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;~-reader&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;Read a series of ~\&amp;#34;string\&amp;#34; to be concatenated together.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;declare&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ignore&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;flet&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;read-string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;check-type&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;a string&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		   &lt;span class=&#34;nc&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;apply&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;#&amp;#39;concatenate&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;read-string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;loop&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;char=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;peek-char&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\~&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		 &lt;span class=&#34;ss&#34;&gt;:do&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read-char&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		 &lt;span class=&#34;ss&#34;&gt;:collect&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;read-string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s add it to the current readtable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-macro-character&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;#\~&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;~-reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now I can write this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defclass&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;sample&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;slot&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:documentation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;nv&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;A very long slot documentation, &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;nv&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;that doesn&amp;#39;t even fit in 80 columns, &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	 &lt;span class=&#34;nv&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;which is a shame...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Everyday of my life I thank Common Lisp for being so flexible. The next step
would be to make &lt;code&gt;cl-indent.el&lt;/code&gt; aware that tilde-strings really are the same
object, and hence should be vertically aligned in all contexts. I&amp;rsquo;m not there
yet. Jeeze, this indentation hacking will never end… 😃&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0b11 is out</title>
      <link>https://didierverna.net/news/2011-05-31-declt-1.0b11/</link>
      <pubDate>Tue, 31 May 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-05-31-declt-1.0b11/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just released a new version of 

, my Texinfo reference
manual generator for Common Lisp Libraries. This release contains only one
bugfix: when trying to create links to source files, Declt now checks whether
the files actually exist or not.&lt;/p&gt;
&lt;p&gt;Tracking this bug down had the side-effect of exhibiting a misfeature of
SBCL&amp;rsquo;s introspection facility: the &lt;code&gt;copy-&amp;lt;struct&amp;gt;&lt;/code&gt; functions (automatically
generated by &lt;code&gt;defstruct&lt;/code&gt; calls) have their definition source set to
&lt;code&gt;target-defstruct.lisp&lt;/code&gt; which is an SBCL source file. It would make more sense
to set it to the file containing the &lt;code&gt;defstruct&lt;/code&gt; call instead, as is already
the case for constructors, predicates and accessor functions. Patch sent to
the SBCL developers.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Common Lisp indentation in Emacs</title>
      <link>https://didierverna.net/news/2011-05-06-common-lisp-indentation-in-emacs/</link>
      <pubDate>Fri, 06 May 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-05-06-common-lisp-indentation-in-emacs/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; since the original publication of this article, Nikodemus Siivola
and I have done some more work on various other aspects of Common Lisp
indentation, and I must say that the result is pretty satisfactory. Nikodemus
has merged all the changes into Slime, and I have done so for XEmacs. If
you&amp;rsquo;re an XEmacs user, you don&amp;rsquo;t need to use the slime-indentation contrib to
get these improvements. Simply upgrade the &amp;ldquo;prog-modes&amp;rdquo; package and load
&lt;code&gt;cl-indent.el&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I have just modified 
 to improve the
indentation of Common Lisp code. This change involves two things: the support
for multiple method qualifiers in a call to &lt;code&gt;defmethod&lt;/code&gt; and, much more
importantly, a cleaner and more flexible scheme for indenting lambda-lists.
The patch has also been submitted to the 
 developers. Below is a more
detailed description of what you get with these changes.&lt;/p&gt;
&lt;h4 id=&#34;method-qualifiers&#34;&gt;Method qualifiers&lt;/h4&gt;
&lt;p&gt;Until now, only one method qualifier was understood. Below are some examples
demonstrating that the one method qualifier and the argument list are indented
by 4 characters, and the method&amp;rsquo;s body only by 2:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                           &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                   &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                           &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                     &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                   &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s add a second method qualifier:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;              &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                          &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Woops. Neither is correct. But now, you get this instead:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                                &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                        &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Three more examples to show how confused we were:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                                &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;                 &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                        &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                        &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                          &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And how better we just got:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defmethod&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                              &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;                 &lt;span class=&#34;nv&#34;&gt;comb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                          &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                      &lt;span class=&#34;ss&#34;&gt;:around&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                  &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                          &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Indeed, you can see that everything between the method&amp;rsquo;s name and its body is
now correctly indented by 4.&lt;/p&gt;
&lt;h4 id=&#34;lambda-lists&#34;&gt;Lambda-Lists&lt;/h4&gt;
&lt;p&gt;The next round of changes deals with the formatting of lambda-lists. As such,
this will apply everywhere a lambda-list is expected, such as &lt;code&gt;defun&lt;/code&gt;,
&lt;code&gt;defgeneric&lt;/code&gt;, &lt;code&gt;defmethod&lt;/code&gt;, &lt;em&gt;etc.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;First of all, here are two examples showing that we were not very clever
before:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Basically, everything was blindly aligned at the beginning of the lambda-list.
Here is what you get now:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                          &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The difference is that keyword parameters are indented with respect to their
corresponding keyword. The amount of indentation is provided by a new
customizable user option named
&lt;code&gt;lisp-lambda-list-keyword-parameter-indentation&lt;/code&gt; (oh boy, what a mouthful). If
you prefer, you can also have the parameters vertically aligned with each
other. Set the new customizable user option named
&lt;code&gt;lisp-lambda-list-keyword-parameter-alignment&lt;/code&gt; to &lt;code&gt;t&lt;/code&gt; and you will get this
instead:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                  &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                  &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                  &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, just as you could align keyword parameters together, you can also
align the keywords together. Set the new customizable user option named
&lt;code&gt;lisp-lambda-list-keyword-alignment&lt;/code&gt; to t, and you will get this (only the
second example differs):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                          &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                          &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                        &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                  &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                             &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;val3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                              &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These are in fact my preferred settings, although both alignment options
default to &lt;code&gt;nil&lt;/code&gt;. Here is a final example demonstrating how you could format a
long lambda-list with plenty of arguments:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mand1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mand2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;optional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;nv&#34;&gt;opt1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt2&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;opt3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;nv&#34;&gt;key1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key2&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;key3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;&amp;amp;aux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;nv&#34;&gt;aux1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux2&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;aux3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;do-this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These indentation problems have been a huge peeve of mine for quite a long
time. I hope you will find the changes useful!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>File-Local Variables</title>
      <link>https://didierverna.net/news/2011-04-26-cdr-9/</link>
      <pubDate>Tue, 26 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-04-26-cdr-9/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; this document is finalized. It can now be officially referred to
as &amp;ldquo;
&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In my 
 lightning talk, I
announced the development of a new Common Lisp library called XFormat
(&lt;strong&gt;update:&lt;/strong&gt; now actually called FoCus), which provides extensible format
strings. A first release of this library is imminent. In this talk, I also
mentionned the need for what I called &amp;ldquo;file-local variables&amp;rdquo;. A file-local
variable is a user-defined special variable that would behave as &lt;code&gt;*package*&lt;/code&gt;
and &lt;code&gt;*readtable*&lt;/code&gt; with respect to &lt;code&gt;*load*&lt;/code&gt; and &lt;code&gt;*compile-file*&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I have just created and released a very small library called


which provides file-local variables through ASDF. In an ideal world, this
library would become obsolete because file-local variables are so simple to
implement that they should rather be done as an extension to the Common Lisp
Standard, and provided by every Lisp vendor. That is the purpose of a new CDR
proposal that I also just published on the discussion mailing list.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Declt 1.0b9 is out</title>
      <link>https://didierverna.net/news/2011-02-23-declt-1.0b9/</link>
      <pubDate>Wed, 23 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-02-23-declt-1.0b9/</guid>
      <description>&lt;p&gt;The next edition of 

, the Documentation Extractor from
Common Lisp to Texinfo, is out.&lt;/p&gt;
&lt;p&gt;In this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bugfix: rendering the documentation for methods with EQL specializers didn&amp;rsquo;t
work.&lt;/li&gt;
&lt;li&gt;Feature: licensing and copyrighting the reference manual is now optional.
Licenses currently supported are BSD and GPL.&lt;/li&gt;
&lt;li&gt;Declt now generates its own reference manual by default.&lt;/li&gt;
&lt;li&gt;Some package infrastructure changes that should remain transparent.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Clarification proposal for CLHS 22.3</title>
      <link>https://didierverna.net/news/2011-02-11-cdr-7/</link>
      <pubDate>Fri, 11 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-02-11-cdr-7/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; this document (in version 1.1) has been submitted and accepted as
a new item in the Common Document Repository. It can now be officially
referred to as &amp;ldquo;
&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There are some fuzzy corner cases in the way the Common Lisp standard
describes the syntax and semantics of &lt;code&gt;format&lt;/code&gt; directives. I have prepared a
first draft of a clarification proposal for the relevant parts of the
standard. I&amp;rsquo;m giving myself some time for comments and feedback before
actually submitting this to the 
.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b19 is out</title>
      <link>https://didierverna.net/news/2011-02-09-clon-1.0b19/</link>
      <pubDate>Wed, 09 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-02-09-clon-1.0b19/</guid>
      <description>&lt;p&gt;

, the Common Lisp / Command-Line Options Nuker, version
1.0b19 has just been released. This version comes with a couple of fixes
related to error handling and a switch from the GPL to the BSD license.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Which Open Source License for Lisp?</title>
      <link>https://didierverna.net/news/2011-02-08-which-open-source-license-for-lisp/</link>
      <pubDate>Tue, 08 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-02-08-which-open-source-license-for-lisp/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a long time since I last thought about this. Software licensing is
probably the most dreadful computer science topic to me. So out of boredom,
laziness, but also out of a feeling of adherence to the ideas behind the FSF,
I used to blindly stick the 

to most of my code. A couple of things made me rethink about that passive
attitude recently though, notably the fact that the viral nature of the GPL is
not something that I always want.&lt;/p&gt;
&lt;p&gt;Even in Lisp, you can make a difference between (more or less) standalone
applications and actual language extensions or libraries that other people
might want to use in their own code. While I still think that the GPL is okay
for my applications (as Pascal Bourguignon would put it: &amp;ldquo;I want to see your
code too!&amp;rdquo;), I find it too restrictive for my libraries. I sympathize with the
FSF concerns, and we probably need something so idealistic to make the open
source culture progress, but I can also understand why people wanting to make
a living out of their development &amp;ldquo;need&amp;rdquo; to close their source. For example,
I consider the few proprietary Common Lisp vendors as my friends, and I would
be glad to see them use my libraries in their own products.&lt;/p&gt;
&lt;p&gt;The other thing with the GPL is that it is long, difficult to read and gives
me a feeling of over-complication. Probably just me and my allergy to software
licensing issues, but on the other hand, it is notorious that the GPL doesn&amp;rsquo;t
fit very well with Lisp, for the same reasons that it doesn&amp;rsquo;t fit very well
with C++ code constituted mostly of templates. In those environments, the
distinction between static or dynamic linking, compile-time or run-time,
&lt;em&gt;etc.&lt;/em&gt;, is blurred to a considerable extend, to the point that it doesn&amp;rsquo;t make
much sense anymore.&lt;/p&gt;
&lt;h4 id=&#34;choices&#34;&gt;Choices&lt;/h4&gt;
&lt;p&gt;So I was ready to spend, say, 30 minutes looking for a non-viral alternative
to the GPL. The first one that comes to mind is of course the

, but it looks even more
complicated than the GPL itself, and as misfitted to Lisp as its mother
license. To the point that some people at 

created the &amp;ldquo;Lisp Lesser GNU General Public License&amp;rdquo;, &lt;em&gt;a.k.a.&lt;/em&gt; the LLGPL. This
license is in fact constituted with the original LGPL plus a

 aimed at clarifying or
precising some terms used in the license itself, in the context of Lisp. This
preamble left me quite sceptical. While it seems to indeed clarify a few
points, I think it also adds to the confusion. For instance, it says at some
point:&lt;/p&gt;



  
  &lt;blockquote class=&#34;border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6&#34;&gt;
    &lt;p&gt;Since Lisp only offers one choice, which is to link the Library into an
executable at build time [&amp;hellip;]&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;p&gt;which I think is confusing. What about a Lisp application that dynamically
loads an ASDF system. Shouldn&amp;rsquo;t this be considered as very close to dynamic
linking? So no. I want something simpler, widely used and accepted. This
leaves me basically with 
, or

 style, plus

 that Daniel Herring suggested
on &lt;code&gt;comp.lang.lisp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The MIT license is probably too liberal for me. It is essentially a big
disclaimer but that&amp;rsquo;s all. Also, some words are frightening. For instance,
what does &amp;ldquo;sublicensing&amp;rdquo; exactly mean in this context? The Boost one is nice,
apart from one thing: it makes acknowledgments optional for binary
distribution, and I don&amp;rsquo;t like that. It seems to me that the least you can do
when you&amp;rsquo;re using a software component written by someone else is to mention
it. It will also help people interested by the feature in question to find its
source.&lt;/p&gt;
&lt;p&gt;So that leaves me with BSD which I decided to use with a bit of rewording and
one specific part removed: the &amp;ldquo;All rights reserved&amp;rdquo; part. I think it doesn&amp;rsquo;t
make any sense since the purpose of the license itself is to grant you some
rights.&lt;/p&gt;
&lt;h4 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h4&gt;
&lt;p&gt;Even though I find that acknowledgments are important, I don&amp;rsquo;t want it to be a
burden on the shoulders of my &amp;ldquo;clients&amp;rdquo;. One simple way to ease their life is
to include the complete license as a header in every single file of your
library. The BSD license is so short that it fits nicely in headers (actually,
the whole license doesn&amp;rsquo;t take much more space that the GNU GPL header alone).
For binary distribution, I also include a LICENSE file in my libraries, so
that people can just copy it into their own packages and be compliant.&lt;/p&gt;
&lt;h4 id=&#34;texinfo-files&#34;&gt;Texinfo Files&lt;/h4&gt;
&lt;p&gt;As for Texinfo files, the copyright material needs some adjustment with respect to the original GNU recommendation. Most notably, I don&amp;rsquo;t need the FSF to approve translations of the copyright notice anymore. I find that the following template fits my needs nicely:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zed&#34; data-lang=&#34;zed&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copying&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;quotation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Copyright&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copyright&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COPYRIGHT_DATE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Didier&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Verna&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;granted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;distribute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;verbatim&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;manual&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;provided&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copyright&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;are&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;preserved&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copies&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ignore&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;granted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;through&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TeX&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;provided&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;printed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;carries&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copying&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;notice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;identical&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;one&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;except&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;removal&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;paragraph&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;paragraph&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;not&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;being&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;relevant&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;printed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;manual&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ignore&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;granted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;distribute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;modified&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;versions&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;manual&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;under&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conditions&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;verbatim&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copying&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;provided&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;also&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;that&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;section&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entitled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;``&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Copying&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;included&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exactly&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;original&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;granted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;distribute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;translations&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;manual&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;into&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;another&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;language&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;under&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;above&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conditions&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;modified&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;versions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;except&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;that&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;permission&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;may&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;be&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;translated&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;well&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;quotation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copying&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So that&amp;rsquo;s it. You can expect most of my Lisp libraries to be released under a
BSD style license now.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b18 is out</title>
      <link>https://didierverna.net/news/2011-01-25-clon-1.0b18/</link>
      <pubDate>Tue, 25 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-01-25-clon-1.0b18/</guid>
      <description>&lt;p&gt;

, the Common Lisp / Command-Line Options Nuker, version
1.0b18 is now out. Compared to the previous version, the only small bit of
change is the fact that the CLISP implementation now depends only &lt;em&gt;optionally&lt;/em&gt;
on CFFI, whereas that dependency was mandatory before. Doing this is actually
quite simple but raised the question of optional ASDF system dependencies, a
topic on which there&amp;rsquo;s quite a bit to be said.&lt;/p&gt;
&lt;p&gt;A bit of context first. Clon has a terminal autodetection feature which allows
it to automatically highlight its output on a TTY (see
&lt;code&gt;--clon-highlight=auto&lt;/code&gt;) and also compute the output line width in case the
COLUMNS environment variable is not set. This feature requires an IOCTL call
which is beyond Lisp. Since one of my goals is to have as few dependencies as
possible (zero being the ideal number), I looked at compiler-specific
solutions to this problem. The result is that SBCL, CMU-CL, CCL and ECL
provide solutions almost out-of-the-box: SBCL has a grovel contributed module,
CMU-CL and CCL already have system bindings and ECL has its own FFI interface.
The ABCL port doesn&amp;rsquo;t support terminal autodetection yet, but that&amp;rsquo;s another
(Java) story. The only black sheep in the picture is CLISP which, as far as I
can tell, neither has a native binding for IOCTL, nore any built-in grovel
facility, hence the need for CFFI.&lt;/p&gt;
&lt;p&gt;Previously, my system definition file was like that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;asdf:operate&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;asdf:load-op&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:cffi-grovel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;asdf:defsystem&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:com.dvlsoft.clon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cm&#34;&gt;#| ... |#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:cffi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:module&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;clisp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;cffi-grovel:grovel-file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;constants&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;module&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;clisp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;#| ... |#&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then later, I had a file with the concerned utility function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;stream-line-width&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;#| CLISP implementation |#&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cm&#34;&gt;#| etc. |#&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that, I started looking at ways to make the dependency on cffi optional.
After all, it makes sense to avoid that dependency at the cost of not being
able to autodetect terminals.&lt;/p&gt;
&lt;p&gt;One thing I fell on almost by accident is ASDF&amp;rsquo;s &lt;code&gt;:weakly-depends-on&lt;/code&gt; keyword.
Here is an interesting


about it. It was an accident because that feature is 
 🙁. People, however,
have very mitigated feelings about it, as shown in


other thread (syntax and semantics both appear somewhat shaky and
underspecified). Besides, the aparent behavior is that if A weakly depends on
B and B is not present, then A is operated anyway. So I could probably have my
&amp;ldquo;src&amp;rdquo; module weakly depend on the &amp;ldquo;clisp&amp;rdquo; one, but that doesn&amp;rsquo;t change the
fact the &amp;ldquo;clisp&amp;rdquo; module should &lt;em&gt;not&lt;/em&gt; be included at all if CFFI is not
there.&lt;/p&gt;
&lt;p&gt;In the same thread, somebody proposes another kind of dependency called
&lt;code&gt;:contigent-on&lt;/code&gt; which looks closer to what I would need for the &amp;ldquo;clisp&amp;rdquo;
module: a module the contingency of which is not present will &lt;em&gt;not&lt;/em&gt; be
processed. This new kind of dependency doesn&amp;rsquo;t seem to be implemented yet,
however.&lt;/p&gt;
&lt;p&gt;So, all of this seems a bit frightening. Too borderline for my taste.
Fortunately, my solution is much simpler, although probably not universal.&lt;/p&gt;
&lt;p&gt;This first thing to do is &lt;em&gt;try&lt;/em&gt; to load &lt;code&gt;cffi-grovel&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;eval-when&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:load-toplevel&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:execute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;handler-case&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;asdf:operate&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;asdf:load-op&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:cffi-grovel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;asdf:missing-component&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*error-output*&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;~
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;*********************************************************************
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;* WARNING: ASDF component CFFI-GROVEL not found.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;* Clon will be loaded without support for terminal autodetection.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;* See section A.1 of the user manual for more information.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;*********************************************************************&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that, if loading it was successful, we end up with &lt;code&gt;cffi&lt;/code&gt; as a feature,
so we can just conditionalize on that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;asdf:defsystem&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:com.dvlsoft.clon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cm&#34;&gt;#| ... |#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cffi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:cffi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cffi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:module&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;clisp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:serial&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;cffi-grovel:grovel-file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;constants&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;module&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cffi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;clisp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;cm&#34;&gt;#| ... |#&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One last problem remains however: what to do in the source code, for the
feature-dependent parts. Conditionalizing an ASDF system may indeed lead to
trouble: for instance, what would happen if the function &lt;code&gt;stream-line-width&lt;/code&gt;
was compiled with CFFI around, and later used in a context where it is not? To
be on the safe side, what you really need is to check for the feature
&lt;em&gt;dynamically&lt;/em&gt;. One possible solution is this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;move all feature-dependent code to the &amp;ldquo;clisp&amp;rdquo; module and make that a
protocol,&lt;/li&gt;
&lt;li&gt;everytime you need to access the feature, dynamically check whether the
protocol functions are &lt;code&gt;fbound&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my specific case, what I did was to implement a CLISP-specific version of
&lt;code&gt;stream-line-width&lt;/code&gt;, called &lt;code&gt;clisp/stream-line-width&lt;/code&gt; and put it in a new file
in the &amp;ldquo;clisp&amp;rdquo; module, now defined as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cffi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:module&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;clisp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:depends-on&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:serial&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	  &lt;span class=&#34;ss&#34;&gt;:components&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;cffi-grovel:grovel-file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;constants&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;				   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;util&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, the original function is rewritten like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;stream-line-width&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;#+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;fboundp&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;clisp/stream-line-width&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;clisp/stream-line-width&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cm&#34;&gt;#| etc. |#&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So now I think I&amp;rsquo;m on the safe side, and Clon has zero mandatory dependency
again&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b17 is out</title>
      <link>https://didierverna.net/news/2011-01-24-clon-1.0b17/</link>
      <pubDate>Mon, 24 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-01-24-clon-1.0b17/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the release of 

, the Common Lisp /
Command-Line Options Nuker, version 1.0b17. This version notably introduces
support for ABCL and expands the documentation in the portability section.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Towards ABCL Standalone Executables</title>
      <link>https://didierverna.net/news/2011-01-22-towards-abcl-standalone-executables/</link>
      <pubDate>Sat, 22 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2011-01-22-towards-abcl-standalone-executables/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; ABCL now supports the POSIX-compliant use of &lt;code&gt;--&lt;/code&gt;, so I&amp;rsquo;ve
modified this article to reflect that. I&amp;rsquo;ve also added a final trick to
emulate the existence of a proper &lt;code&gt;argv[0]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Creating standalone executables in Common Lisp is already a portability
minefield, as the standard doesn&amp;rsquo;t specify anything in that regard. The
situation is even worse with ABCL because it is a Java-based implementation of
Common Lisp, and Java has no notion of standalone executable at all. In this
article, we will try to figure out how far we can go in that direction
nevertheless.&lt;/p&gt;
&lt;p&gt;This work comes from my wish to port 

to ABCL. In order to
make it work, ABCL itself needed some changes, so if you want to try out the
code provided below, beware that you need at least revision 13156 from the
ABCL Subversion trunk (or version 0.24.0).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start by writing a great Common Lisp application for ABCL, and call it
&lt;code&gt;greet.lisp&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Hello,~{ ~A~}!~%&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;extensions:*command-line-argument-list*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;extensions:exit&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:status&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you guessed, &lt;code&gt;extensions:*command-line-argument-list*&lt;/code&gt; stores the list of
command-line options passed to the program. Now, let&amp;rsquo;s try it out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;abcl&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;--noinform&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;--noinit&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;--nosystem&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;--load&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;greet.lisp&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;John&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;Doe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Hello,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;John&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;Doe!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So far so good: ABCL-specific options were eaten by ABCL. Not very standalone
however. Let&amp;rsquo;s create a wrapper script around that, and call it &lt;code&gt;greet&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#! /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; abcl --noinform --noinit --nosystem --load greet.lisp &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In fact, we have a problem:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ./greet --help me
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Parameters:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--help displays this &lt;span class=&#34;nb&#34;&gt;help&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--noinform suppresses the printing of version info
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--eval &amp;lt;form&amp;gt; evaluates the &amp;lt;form&amp;gt; before initializing REPL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--load &amp;lt;file&amp;gt; loads the file &amp;lt;file&amp;gt; before initializing REPL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--load-system-file &amp;lt;file&amp;gt; loads the system file &amp;lt;file&amp;gt; before initializing REPL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--batch enables batch mode. The --load, --load-system-file and --eval
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  parameters are handled, and abcl exits without entering REPL 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--noinit suppresses loading a .abclrc startup file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--nosystem suppresses loading the system startup file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Woops! We were expecting to get &lt;code&gt;Hello, --help me!&lt;/code&gt; weren&amp;rsquo;t we? In other
words, our own command-line options may conflict with ABCL&amp;rsquo;s which is not
nice. One thing we can do with a recent ABCL version is to use &lt;code&gt;--&lt;/code&gt; to
separate ABCL&amp;rsquo;s own command-line arguments from ours. Our script becomes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#! /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; abcl --noinform --noinit --nosystem --load greet.lisp -- &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And we now get this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ./greet --help me
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello, --help me!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is better, although we&amp;rsquo;re still not very standalone: our Lisp file is a
separate beast, and the &lt;code&gt;abcl&lt;/code&gt; thing is also just a wrapper script (see
below). If we want to be more standalone, we need to go the Java way.&lt;/p&gt;
&lt;p&gt;The first thing to understand is that there&amp;rsquo;s actually no such thing as an
ABCL executable. ABCL is packed into a JAR (Java archive) file, a zip file,
really, and what the wrapper does is simply to call &lt;code&gt;java -jar /path/to/abcl/abcl.jar options…&lt;/code&gt;. The JAR file contains a &lt;code&gt;Main&lt;/code&gt; class with a
&lt;code&gt;main&lt;/code&gt; function the purpose of which is to launch a Lisp interpreter. This is
done by calling the method &lt;code&gt;Interpreter.createDefaultInstance&lt;/code&gt;, which, amongst
other things, handles the command-line options. There is also a method called
&lt;code&gt;Interpreter.createInstance&lt;/code&gt; which does not handle the command-line at all, so
it seems that this is the one we could use, provided that we find a way to set
&lt;code&gt;extensions:*command-line-argument-list*&lt;/code&gt; manually.&lt;/p&gt;
&lt;p&gt;The following code does exactly that. Let&amp;rsquo;s call it &lt;code&gt;Greet.java&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.armedbear.lisp.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Greet&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Runnable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Runnable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	  &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LispObject&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmdline&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Lisp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;NIL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmdline&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cons&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmdline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmdline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nreverse&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Lisp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;_COMMAND_LINE_ARGUMENT_LIST_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setSymbolValue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmdline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Interpreter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;createInstance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;greet.lisp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ProcessingTerminated&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getStatus&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Thread&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;interpreter&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;4194304L&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our Greet class mimics what ABCL&amp;rsquo;s Main class does, only with some tweaks of
our own:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We build the value of &lt;code&gt;extensions:*command-line-argument-list*&lt;/code&gt; manually
from the actual &lt;code&gt;argv&lt;/code&gt; passed to the function &lt;code&gt;main&lt;/code&gt;, by consing equivalent
Lisp objects and then reversing the list. That way, we completely bypass
ABCL&amp;rsquo;s options processing code.&lt;/li&gt;
&lt;li&gt;As mentioned earlier, we use &lt;code&gt;Interpreter.createInstance&lt;/code&gt; instead of
&lt;code&gt;Interpreter.createDefaultInstance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We also take the opportunity to load our lisp file directly with the
function &lt;code&gt;Load.load&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, the &lt;code&gt;try/catch&lt;/code&gt; construct intercepts calls to &lt;code&gt;extensions:exit&lt;/code&gt; and
effectively leaves the Java environment.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s compile this beast now.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ javac -cp  /path/to/abcl/abcl.jar Greet.java
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-cp&lt;/code&gt; option to &lt;code&gt;javac&lt;/code&gt;, the Java compiler, tells it where to find ABCL
classes. This command gives us a &lt;code&gt;Greet.class&lt;/code&gt; file, but also a second one
named &lt;code&gt;Greet$1.class&lt;/code&gt;. That&amp;rsquo;s because our code creates an &amp;ldquo;anonymous inner
class&amp;rdquo;, whatever that means, in the Java jargon. Now, how do we bypass ABCL&amp;rsquo;s
main function and use or own instead? This is actually very simple. The Java
command-line lets you specify (read: override) the name of the class in which
to find the &lt;code&gt;main&lt;/code&gt; function. So it turns out that we don&amp;rsquo;t even have to modify
ABCL itself for this to work. We can simply go:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ java -cp  /path/to/abcl/abcl.jar:. Greet John Doe
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello, John Doe!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and it works. By the way, we can also go:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ java -cp  /path/to/abcl/abcl.jar:. Greet --help me
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello, --help me!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and see that it still works. Since ABCL doesn&amp;rsquo;t process its command-line
anymore, there&amp;rsquo;s no question about &lt;code&gt;--&lt;/code&gt; or whatever. Note that this time, we
need to add the current directory to the class path option in order for Java
to find the files &lt;code&gt;Greet.class&lt;/code&gt; and &lt;code&gt;Greet$1.class&lt;/code&gt;. Note also that with our
custom interepreter, there&amp;rsquo;s no more need for all those &amp;ldquo;standalone&amp;rdquo; options
like &lt;code&gt;--noinit&lt;/code&gt;, &lt;code&gt;--noinform&lt;/code&gt; etc. Wrapping this in a shell script is left as
an exercise, although not a difficult one.&lt;/p&gt;
&lt;p&gt;Still, we&amp;rsquo;re not quite standalone yet. For example, it&amp;rsquo;s not cool to have
these two &lt;code&gt;Greet&lt;/code&gt; class files floating around like this. All other class files
are in the ABCL JAR file, so we can think of adding ours in too. If we want to
do that, we also need to state that the main class in the JAR file should be
our &lt;code&gt;Greet&lt;/code&gt; class, not ABCL&amp;rsquo;s &lt;code&gt;Main&lt;/code&gt; one. This can be done by modifying the
so-called JAR &amp;lsquo;&amp;lsquo;manifest&amp;rsquo;&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s create a manifest file first and call it &lt;code&gt;Greet.txt&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Main-Class: Greet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It says what it says: our application&amp;rsquo;s &lt;code&gt;Main&lt;/code&gt; class (where the &lt;code&gt;main&lt;/code&gt;
function is) is &lt;code&gt;Greet&lt;/code&gt;. Now let&amp;rsquo;s make a copy of &lt;code&gt;abcl.jar&lt;/code&gt; and add our class
file to it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cp /path/to/abcl/abcl.jar greet.jar
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ jar umf Greet.txt greet.jar Greet.class Greet&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;.class
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Jan 22, &lt;span class=&#34;m&#34;&gt;2011&lt;/span&gt; 5:50:32 PM java.util.jar.Attributes &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WARNING: Duplicate name in Manifest: Main-Class.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ensure that the manifest does not have duplicate entries, and
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;that blank lines separate individual sections in both your
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;manifest and in the META-INF/MANIFEST.MF entry in the jar file.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;u&lt;/code&gt; stands for &amp;ldquo;update&amp;rdquo;, the &lt;code&gt;m&lt;/code&gt; stands for &amp;ldquo;manifest&amp;rdquo; and the &lt;code&gt;f&lt;/code&gt; stands
for target (JAR) &amp;ldquo;file&amp;rdquo;. The manifest and JAR files must appear in the same
order as their corresponding options. Don&amp;rsquo;t worry about the warning. That&amp;rsquo;s
because we&amp;rsquo;re changing the &lt;code&gt;Main&lt;/code&gt; class (ABCL had one already).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try it out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ java -jar  greet.jar John Doe
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello, John Doe!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cool. But what about the Lisp file? It&amp;rsquo;s still floating around. As a matter of
fact, the JAR file may contain anything you want, not just class files. ABCL
itself has a bunch of lisp files in its JAR file already. So we can put it in
there just as well:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ jar uf greet.jar greet.lisp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The last question is: how to have ABCL load a lisp file that&amp;rsquo;s in its own JAR?
The answer is: dig into the code and figure out that there is a method called
&lt;code&gt;Load.loadSystemFile&lt;/code&gt; which does just that. ABCL uses it to load its own
&lt;code&gt;boot.lisp&lt;/code&gt; for instance. We hence need to modify our &lt;code&gt;main&lt;/code&gt; function and
replace the line that calls &lt;code&gt;Load.load&lt;/code&gt; with this one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;loadSystemFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/greet.lisp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note the leading slash. It is needed because we have stored &lt;code&gt;greet.lisp&lt;/code&gt; at
the root of the JAR file. Let&amp;rsquo;s update our JAR file once again:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ javac -cp /path/to/abcl/abcl.jar Greet.java
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ jar uf greet.jar Greet.class Greet&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;.class
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And voilà! What you get this time is your application completely packed up in
the JAR file. You can move this file around, distribute it, … everything&amp;rsquo;s
inside.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a final additional trick and I think we&amp;rsquo;re done. As you know, ABCL
stores the command-line argument list in
&lt;code&gt;extensions:*command-line-argument-list*&lt;/code&gt;. One potential problem is that
there&amp;rsquo;s no notion of a program name (&lt;code&gt;argv[0]&lt;/code&gt;) in ABCL (the program is in
fact always Java). Since we&amp;rsquo;re going standalone, however, maybe we would like
to have that. Something like, say, a variable named &lt;code&gt;extensions:*argv0*&lt;/code&gt;. So
here&amp;rsquo;s a way to do it 

does this as part of its built-in
dump facility): in the &lt;code&gt;Greet&lt;/code&gt; class, replace the line&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Interpreter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;createInstance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;with this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Interpreter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;interpreter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Interpreter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;createInstance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;interpreter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;eval&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;(defvar extensions::*argv0* \\&amp;#34;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;greet&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\\&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;interpreter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;eval&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;(export &amp;#39;extensions::*argv0* &amp;#39;extensions)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So that&amp;rsquo;s it I guess. It seems to me that this is as far as you can go in the
direction of standalone ABCL executables. Of course, this example is overly
simple. We didn&amp;rsquo;t try to incorporate full ASDF systems in the archive, and
stuff. But you get the idea…&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b16 is out</title>
      <link>https://didierverna.net/news/2010-11-30-clon-1.0b16/</link>
      <pubDate>Tue, 30 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2010-11-30-clon-1.0b16/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to annouce the release of 

, the Common Lisp /
Command-Line Options Nuker, version 1.0b16. Most notable news for this release
is the support for CLISP, which comes at the expense on one dependency (over
CFFI).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b15 is out</title>
      <link>https://didierverna.net/news/2010-11-18-clon-1.0b15/</link>
      <pubDate>Thu, 18 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2010-11-18-clon-1.0b15/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to annouce the release of 

, the Common Lisp /
Command-Line Options Nuker, version 1.0b15. Most notable news for this release
is the support for ECL.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b12 is out</title>
      <link>https://didierverna.net/news/2010-11-11-clon-1.0b12/</link>
      <pubDate>Thu, 11 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2010-11-11-clon-1.0b12/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to annouce the release of 

, the Common Lisp /
Command-Line Options Nuker, version 1.0b12. Most notable news for this release
is the support for CCL.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clon 1.0b11 is out</title>
      <link>https://didierverna.net/news/2010-11-09-clon-1.0b11/</link>
      <pubDate>Tue, 09 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2010-11-09-clon-1.0b11/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to annouce the release of 

, the Common Lisp /
Command-Line Options Nuker, version 1.0b11. Most notable news for this release
is the support for CMU-CL.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Announcing Declt, a Documentation Generator for Common Lisp Libraries</title>
      <link>https://didierverna.net/news/2010-09-21-declt-1.0b1/</link>
      <pubDate>Tue, 21 Sep 2010 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2010-09-21-declt-1.0b1/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the first public release of 

, the
&amp;ldquo;Documentation Extractor from Common Lisp to Texinfo&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Declt (pronounce &amp;ldquo;dec&amp;rsquo;let&amp;rdquo;) is a reference manual generator for Common Lisp
libraries. It extracts and formats documentation from ASDF systems, including
the system itself and its components, the packages defined in the system and
definitions like constants, special variables, macros, functions, generic
functions and methods, conditions, structures and classes.&lt;/p&gt;
&lt;p&gt;Reference manuals are generated in Texinfo format which can be subsequently
converted into info, HTML, DVI, PostScript or PDF. The generated manuals are
fully indexed and provide a complete set of cross-references between
documentation elements. For instance, files and packages point to the
definitions they provide, and those definitions point back to package and file
in which they can be found.&lt;/p&gt;
&lt;p&gt;Declt requires SBCL to work. If you&amp;rsquo;re interested in porting it, &lt;code&gt;grep PORTME&lt;/code&gt;
in the sources. Also, ASDF 2 has not been tested yet.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Announcing Clon, the Common Lisp / Command-Line Options Nuker</title>
      <link>https://didierverna.net/news/2010-08-31-clon-1.0b1/</link>
      <pubDate>Tue, 31 Aug 2010 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2010-08-31-clon-1.0b1/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce the first public release of 

, the
Common Lisp / Command-Line Options Nuker, the Common Lisp / Command-Line
Options Nuker library for Common Lisp.&lt;/p&gt;
&lt;p&gt;Clon is a library for managing command-line options in standalone Common Lisp
applications. It provides a unified option syntax with both short and long
names, automatic completion of partial names and automatic
retrieval/conversion of option arguments from the command-line, associated
environment variables, fallback or default values. Clon comes with a set of
extensible option types (switches, paths, strings &lt;em&gt;etc.&lt;/em&gt;). Clon also provides
automatic generation and formatting of help strings, with support for
highlighting on TTYs through ISO/IEC 6429 SGR. This formatting is customizable
through &amp;ldquo;themes&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Clon currently requires SBCL to work. If you want to help porting it to other
implementations, please &lt;code&gt;grep PORTME&lt;/code&gt; in the sources.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>:o( Smilisp :o)  A new and revolutionary dialect of Lisp</title>
      <link>https://didierverna.net/news/2009-04-01-smilisp/</link>
      <pubDate>Wed, 01 Apr 2009 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2009-04-01-smilisp/</guid>
      <description>&lt;p&gt;Today, I just released ☹️SmiLisp🙂, a new dialect of Lisp featuring a novel
programming paradigm called &amp;ldquo;Emotional Programming&amp;rdquo;. This is truely a
revolution in the Lisp world… The logo is not exactly like that, but my
blogging software wants to put smileys everwhere…&lt;/p&gt;
&lt;p&gt;Get it 
.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lisp, Jazz, Aikido</title>
      <link>https://didierverna.net/news/2008-09-08-lisp-jazz-aikido/</link>
      <pubDate>Mon, 08 Sep 2008 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2008-09-08-lisp-jazz-aikido/</guid>
      <description>&lt;p&gt;This is something I originally posted on my 
, but I&amp;rsquo;m reposting it here because, as you
will figure out pretty quickly, it belongs in here as much as in my Jazz
website…&lt;/p&gt;
&lt;p&gt;What can computer science, music and martial arts possibly have in common?
These are like &amp;ldquo;strange attractors&amp;rdquo; in my life: no matter how much distance I
may have put between them and me in the past, I always ended up coming back to
them, and I know this will remain the case in the future.&lt;/p&gt;
&lt;p&gt;I can remember pretty well the excitement I felt when I discovered the Lisp
language, when I was first introduced to Jazz and improvisation, and when I
had my first Aikido practice session. Different things, same emotion. And also
the feeling that in some way, I was born to be a lisper, a jazzman and an
aikidoka. I just didn&amp;rsquo;t know until then.&lt;/p&gt;
&lt;p&gt;Recently I was talking about my half-scientific / half-musical life with an
old teacher of mine, and he asked me if I had suddenly turned completely
schizophrenic. He was right! To ask, I mean… So I started thinking about it,
and I tried to figure out what these three domains have in common and why they
all adhere so well to my own philosophy of life.&lt;/p&gt;
&lt;p&gt;But perhaps I should begin with explaining what&amp;rsquo;s my philosophy of life, then.
I guess it&amp;rsquo;s basically described in three words: Beauty, Fun, Unification.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Beauty lies in being able to evolve comfortably within a set of constraints,
limits or rules. Note that this begins with accepting the existence of these
constraints, limits or rules in the first place.&lt;/li&gt;
&lt;li&gt;Fun, however, lies in breaking those rules at will, knowing how to get rid
of them, and then get back to them, a bit like a cat jumping in any kind of
direction and yet always falling back on his feet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s a corollary to these two points: real freedom is not to have no limit,
but to know your limits so well that you can either evolve at will within
them, or break them at will.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unification means drawing bridges between apparently unrelated fields,
starting to figure out what is the common essence of things. By the way,
this is precisely what I am doing right now… 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;why-is-lisp-beautiful-fun-and-unifying-&#34;&gt;Why is Lisp beautiful, fun and unifying ?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;rsquo;s beauty in writing code in any language (yes, there&amp;rsquo;s even beauty in
writing shell code). The beauty lies in your ability to adapt your concepts
to the constraints of the language you&amp;rsquo;re using, in other words, to make the
best out of it, given its inherent limitations in expressiveness.&lt;/li&gt;
&lt;li&gt;However, and this is where the fun lies, Lisp allows you to break the rules
of traditional languages because you can adapt the language to your concepts
as much as you need to adapt your concepts to the language. Lisp is known
(or at least, it should be) as the &amp;ldquo;programmable programming language&amp;rdquo;:
thanks to the power of its macro system and the customizability of its
reader for instance, you can create a completely new language (even with a
completely new syntax, see the loop macro for instance) within Lisp and
adapt it to your personal needs. This makes Lisp the language of choice for
implementing a DSL (Domain Specific Language) for instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is interesting to note that with some experience in Lisp, adapting the
language to your needs becomes an integral part of the art of programming; a
rule in itself. In this way, what you do is really pushing the limits farther
away, making a rule of what was an exception before.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lisp is also the language of unification. While it is mainly known to be a
functional language (pure or impure, by the way), it is also imperative,
procedural, object-oriented and even context-oriented if you want it to be.
It is also declarative: look at the abundant literature on how easy it is to
implement Prolog in Lisp. So Lisp really is any kind of language you want it
to be: where a particular programming paradigm exists by construction in
another language, it is usually implemented as a mere library in Lisp. Most
recent (and fashionable) programming languages today are just re-discovering
things that existed in Lisp since its invention in the 60&amp;rsquo;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;why-is-jazz-beautiful-fun-and-unifying-&#34;&gt;Why is Jazz beautiful, fun and unifying ?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;rsquo;s beauty in playing a song, in any kind of music. The beauty lies in
your ability to adapt your personal musical ideas, your way of playing, in
other words, your musical personality, to the constraints of the song.
People often forget that a song is by definition (or, so to speak, by
composition) limited in expressiveness, just as an average programming
language is: it has a pitch, a tempo, a rhythmic style, a chord progression;
all things actually specified by the score. In traditional music, you are
expected to evolve within these limits.&lt;/li&gt;
&lt;li&gt;However, and this is where the fun lies, Jazz (specifically improvisation)
allows you to break the rules of traditional music by playing &amp;ldquo;out&amp;rdquo;, both
harmonically and rhythmically. Improvisation is by essence the musical
practice that allows you to modify a score in real time: you can change the
ambiance, the chords, the rhythm, you can temporarily escape from the song
and then get back to it (remember the cat ?), even play &amp;ldquo;out&amp;rdquo; (roughly
meaning using scales that do not correspond to the underlying chords).
During this process, you are actually adapting the song to your musical
concepts instead of adapting your musical concepts to the song. This is
exactly like adapting Lisp to your programming needs instead of adapting
your needs to the language. And when the other musicians follow you on this
&amp;ldquo;song tweaking game&amp;rdquo;, that&amp;rsquo;s were the fun really begins!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is interesting to note that with some experience in jazz, playing &amp;ldquo;out&amp;rdquo;
becomes an integral part of the art of improvisation; a rule in itself. When
Miles Davis started to mix major and minor harmony (for instance using a minor
3rd on a major chord), numerous conservator alligators wanted to burn the
heretic alive. Now, all of this is well known, and you can learn actual
techniques for chords substitution and atonal improvisation in Jazz schools.
Again, in this way, what you do is really pushing the limits farther away,
making a rule of what was an exception before.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jazz is also the music of unification. A very narrow view of it is as a
musical style: the ternary &amp;ldquo;chabada&amp;rdquo; drums pattern, the walking bass and so
on. But Jazz is really not that. It is a philosophy, a way to envision all
styles of music. Michel Petrucciani once said &amp;ldquo;Jazz is a music of thieves&amp;rdquo;,
and he was right ! A Jazz musician is fundamentally curious. He&amp;rsquo;s interested
in everything he can ear, and tries to appropriate all the ideas he&amp;rsquo;s
exposed to by adapting them to his own personality. This is a process that
happens in composition as well as in improvisation, but improvisation is the
key factor that unifies all musical styles in Jazz. So just like Lisp
unifies all programming concepts into a philosophy of programming, Jazz
unifies all music styles into a philosophy of music.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;why-is-aïkido-beautiful-fun-and-unifying-&#34;&gt;Why is Aïkido beautiful, fun and unifying ?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;rsquo;s beauty in practicing any martial art (as long that it has not become
just sports). The beauty lies in executing the techniques that define your
martial art to the perfection. But one has to understand that as long as you
are practicing only a set of techniques (which is a very narrow view of
martial arts), you are evolving in a very limited environment, however
beautiful (and Aikido is aesthetically beautiful).&lt;/li&gt;
&lt;li&gt;The fun begins when you start to understand the Budo which is behind martial
arts, and especially behind Aikido. The Budo is a philosophy, just as Jazz
or Lisp are philosophies. By emphasizing on values such as personal
cultivation, self-control and self-awareness, the Budo renders techniques
unimportant, or at least secondary, because being able to react in any
situation is more important than the way you react to them. Techniques are
just tools to reach a greater goal. Aikido masters are so far away beyond
technique that you can&amp;rsquo;t see them anymore in their movements. The rules are
broken, the techniques are gone. What&amp;rsquo;s left is a &amp;ldquo;purified&amp;rdquo; state; what&amp;rsquo;s
left is the Ki.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is interesting to note that in Aikido, breaking the rules, that is,
avoiding being enslaved by technique is a constant preoccupation. For example,
in Aikido, there is no distinction between beginners and experienced
practitioners. Mixing levels in practice is one of the ways of ensuring that
you will constantly face new and unexpected situations. As such, breaking the
rules has also become a rule in itself. The ultimate rule-breaking exercise in
Aikido is probably the Randori. When faced with 2 or 4 adversaries
simultaneously, there is no room for rules or techniques, you just have to
react. This is exactly like improvising in Jazz: in real time, there is no
room for rules or harmony analysis, you just have to play.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aikido is also the martial art of unification. At least in two ways. On the
technical plan, we know that Morihei Ueshiba, the father of Aikido, was a
master in several martial arts (both &amp;ldquo;soft&amp;rdquo;, like ju-jutsu, and &amp;ldquo;hard&amp;rdquo;, like
ken-jutsu or jutte-jutsu) when he founded his own. As such, Aikido unifies
martial arts in general by incorporating techniques from many different
sources. This is also pointed out by the fact that Jigoro Kano, founder of
Judo, sent his best students to learn Aikido. On a spiritual plan, O
Sensei&amp;rsquo;s interpretation of the Budo not only encompasses the traditional
meaning of the term (notably including personal cultivation) but extends to
such notions as love and protection of all things, respect for all lives
(see his &amp;ldquo;revelation&amp;rdquo; in spring 1925), which are much more universal
concerns.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Lisp, Jazz and Aikido are more than kinds of programming, music, or martial
arts. They are philosophies of programming, music and martial arts. More than
that, they are actually different appearances of the same philosophy of life.
There is much more to say about it. There are also links to establish with
scientific research in general. But not in a blog&amp;hellip; I&amp;rsquo;d like to write a
proper essay about these things when I find the time… someday.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CCL Objective-C Bridge Code Indentation</title>
      <link>https://didierverna.net/news/2008-07-01-ccl-objective-c-bridge-code-indentation/</link>
      <pubDate>Tue, 01 Jul 2008 00:00:00 +0000</pubDate>
      <guid>https://didierverna.net/news/2008-07-01-ccl-objective-c-bridge-code-indentation/</guid>
      <description>&lt;p&gt;A whole bunch of CCL Cocoa coding involves calls to Objective-C methods. For
instance, the following Objective-C code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Objective-C&#34; data-lang=&#34;Objective-C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cell&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;drawWithFrame&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;frame&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;inView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;view&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;will translate into this in CLL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;/drawWithFrame:inView:&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cell&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;frame&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;view&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Indeed, Objective-C is designed around the record-based model (methods belong
to classes), so the cell object receives the &lt;code&gt;drawWithFrame:inView:&lt;/code&gt; message
via its Smalltalk descendant syntax. On the other hand, the Lisp translation
involves a generic function call with the usual funcall syntax. The dispatch
occurs on the first argument (the cell), and the rest is actual arguments to
the message.&lt;/p&gt;
&lt;p&gt;This layout is obviously not optimal for readability. One could define a
bracket reader-macro to simulate Objective-C&amp;rsquo;s message passing syntax in Lisp,
but I prefer to stick to the &amp;ldquo;Lisp Way&amp;rdquo;. The first argument should still be
considered &amp;ldquo;special&amp;rdquo; though.&lt;/p&gt;
&lt;p&gt;For readability (especially when the method name is long), I like to put the
arguments to the message (not the receiver!) on subsequent lines. However,
Emacs&amp;rsquo;s &lt;code&gt;cl-indent-function&lt;/code&gt; will indent this as an ordinary function call,
like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;/drawWithFrame:inView:&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                         &lt;span class=&#34;nv&#34;&gt;frame&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;view&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which is awfull. What I want is the following indentation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Lisp&#34; data-lang=&#34;Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;/drawWithFrame:inView:&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;cell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;frame&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;view&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This kind of indentation is normally achieved by putting a
&lt;code&gt;common-lisp-indent-function&lt;/code&gt; property of 1 on the function symbol. However,
you don&amp;rsquo;t want to do that on all possible Objective-C message by hand (and you
don&amp;rsquo;t know them all in advance anyway). The following advice on
&lt;code&gt;common-lisp-indent-function&lt;/code&gt; (from the &lt;code&gt;cl-indent&lt;/code&gt; package does the trick. It
dynamically puts the property on each relevant symbol every time it is subject
to indentation. A bit brute force, but it works smoothly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Emacs-Lisp&#34; data-lang=&#34;Emacs-Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defadvice&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;common-lisp-indent-function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;before&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;ccl-objc-bridge&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;activate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;Improve indentation scheme of the CCL Objective-C bridge.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;Currently, this does the following:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;- All (#/doThis:withThat: ...) forms are indented as per a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;lisp-indent-function property of 1. This effectively treats the first argument
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;(an object or a class) as special. The indentation you get is:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;(#/function arg1        instead of:        (#/function arg1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  arg2 ...)                                            arg2 ...)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;containing-form-start&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;elt&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;goto-char&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;containing-form-start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;forward-char&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cond&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;looking-at&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;#/\\\\(\\\\w\\\\|:\\\\)*:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; We&amp;#39;re looking at a (#/doThis:withThat: ...) form. In its holy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; brokenness, common-lisp-indent-function with the help of&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; parse-partial-sexp will consider that the function name in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; this form is &amp;#34;/functioncall:&amp;#34;. Our trick here is to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; dynamically put a lisp-indent-function property of 1 on this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; symbol, so that the subsequent (original) indenting function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;c1&#34;&gt;;; will handle it.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;let*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;beg&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;progn&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;forward-char&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;point&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sym&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;progn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;forward-sexp&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                       &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;intern&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;downcase&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;buffer-substring&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;beg&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;point&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	       &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;put&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;sym&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;common-lisp-indent-function&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One last thing and I&amp;rsquo;ll be happy. I want to indent CCL&amp;rsquo;s &lt;code&gt;slet&lt;/code&gt; and &lt;code&gt;slet*&lt;/code&gt;
constructs just as &lt;code&gt;let&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Emacs-Lisp&#34; data-lang=&#34;Emacs-Lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;put&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;slet&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;common-lisp-indent-function&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;o&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;&amp;amp;whole&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt; &lt;span class=&#34;kp&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;&amp;amp;whole&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;kp&#34;&gt;&amp;amp;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;put&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;slet*&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;common-lisp-indent-function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;o&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;&amp;amp;whole&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt; &lt;span class=&#34;kp&#34;&gt;&amp;amp;rest&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;&amp;amp;whole&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;kp&#34;&gt;&amp;amp;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And voilà!&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
