<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>Embeddable Common-Lisp</title> <link>https://common-lisp.net/project/ecl</link> <atom:link href="https://common-lisp.net/project/ecl/rss.xml" rel="self" type="application/rss+xml" /> <language>en-us</language> <pubDate>Tue, 05 May 2026 09:34:02 +0000</pubDate> <item> <title>ECL 26.5.5 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-2655-release.html</link> <pubDate>2026-05-05 12:00</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-2655-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <p>We are announcing a bugfix ECL release that addresses a few issues that has
slipped through testing of the recent one.</p>

<p>Addressed issues:</p>

<ul>
<li><p>bugfix: MAKE-PACKAGE destructively modified defining form's cons cells of
  the package local nicknames, breaking package literals in bytecmp (#839)</p></li>
<li><p>bugfix: the first environment is now always page-aligned by using the
  same allocation mechanism as all subsequent envs (#828)</p></li>
<li><p>bugfix: allow loading concatenated fasc files (#842)</p></li>
<li><p>bugfix: defclass does not redefine existing classes at compile time with
  forward-referenced classes in the bytecodes compiler (#843)</p></li>
</ul>

<p>This release is available for download in a form of a source code archive (we do
not ship prebuilt binaries):</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-26.5.5.tgz" >ECL 26.5.5 tarball archive</a></li>
<li><a href="https://common-lisp.net/project/ecl/static/files/manual/ecl-26.5.5/" >The ECL Manual</a></li>
</ul>

<p>Happy Hacking,<br/>
The ECL Developers</p>
 ]]></description> </item><item> <title>ECL 26.3.27 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-26327-release.html</link> <pubDate>2026-03-27 10:00</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-26327-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <p>We are announcing a new stable ECL release. This release highlights:</p>

<ul>
<li>bytecodes closures are now faster and avoid capturing unused parts of the
  lexical environment</li>
<li>improvements to the native compiler, including better separation between
  compiler frontend and backend, reduced function call overhead, more aggressive
  dead code elimination and many internal improvements and bug fixes</li>
<li>hash table implementation improvements and bug fixes for collisions</li>
<li>streams: extensions EXT:PEEK-BYTE, EXT:UNREAD-BYTE, GRAY:STREAM-PEEK-BYTE and
  GRAY:STREAM-UNREAD-BYTE, bugfixes and implementation refactor</li>
<li>the codebase has been updated to conform to the C23 standard</li>
<li>simplified procedure for cross-compiling ECL itself</li>
<li>support for cross-compilation of Common Lisp code to different
  targets using a new :TARGET option for COMPILE-FILE</li>
<li>some fixes for the emscripten target</li>
</ul>

<p>The release also incorporates many other bug fixes and performance improvements
as well as an updated manual. We'd like to thank all people who contributed to
ECL with code, testing, issue reports and otherwise.</p>

<p>People listed here contributed code in this iteration: Daniel Kochmański, Marius
Gerbershagen, Tarn W. Burton, Kirill A. Korinsky, Dmitry Solomennikov, Kevin
Zheng, Mark Shroyer and Sebastien Marie.</p>

<p>People listed here did extensive release candidate testing on various platforms:
Marius Gerbershagen, Daniel Kochmański, Dima Pasechnik, Matthias Köppe, Jeremy
List, Mark Damon Hughes and Paul Ruetz.</p>

<p>This release is available for download in a form of a source code archive (we do
not ship prebuilt binaries):</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-26.3.27.tgz" >ECL 26.3.27 tarball archive</a></li>
<li><a href="https://common-lisp.net/project/ecl/static/files/manual/ecl-26.3.27/" >The ECL Manual</a></li>
</ul>

<p>Finally, a note on the release schedule: ECL releases often take some time to
come out, partially because we do extensive testing against supported platforms
and existing libraries to find regressions. In the meantime all improvements are
incrementally incorporated in the branch <code>develop</code>. It is considered stable and
it is tested and reviewed with necessary dilligence. If release cycle is too
slow for your needs, then we suggest following the branch <code>develop</code> for the most
recent changes.</p>

<p>Happy Hacking,<br/>
The ECL Developers</p>
 ]]></description> </item><item> <title>Web ECL Grant Announcement</title> <link>https://common-lisp.net/project/ecl/posts/Web-ECL-Grant-Announcement.html</link> <pubDate>2025-07-29 13:30</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/Web-ECL-Grant-Announcement.html</guid> <category><![CDATA[ grant ]]></category> <description><![CDATA[ <p>Dear Community,</p>

<p>I'm happy to share that I've received a grant from NLnet to work on improving
the WebAssembly integration and ECL.</p>

<p>The project has four milestones that are expected to be finished within a year:</p>

<ol>
<li>Implement a protocol for interoperation with the web environment (DOM)</li>
<li>Integrate a set of tools to develop Common Lisp code directly in a browser</li>
<li>Port ECL to the Web Assembly System Interface (WASI)</li>
<li>Implement a virtual filesystem extension for ECL</li>
</ol>

<p>As you might have noticed, the first two milestones focus on using ECL in the
browser setting. Progress of this part of the project may be tracked in a
separate <a href="https://fossil.turtleware.eu/wecl/timeline" >repository</a>. I've already
begun work on this, and the repository will now see much more activity.</p>

<p>After the first milestone it should be possible (and hopefully convenient) to
directly incorporate Common Lisp scripts on websites that allow controlling DOM
elements and implementing the application logic. I plan to design the protocol
after CLIM II to make it easier to port McCLIM to this platform in the future.</p>

<p>The second milestone is related to developing a set of reusable components like
a listener, a debugger and a code editor, and integrate them into a sample
development environment for Common Lisp.</p>

<p>The next two steps will be far more involved with ECL internals and will benefit
all platforms. Porting to WASI will improve ECL's portability and reduce its
dependency on libc. I also hope to include my recent work on green threads in
this step. A virtual filesystem will enable us to store entire systems in memory
and work on files even when the host lacks a filesystem.</p>

<p>Some goals may change during development, but this is a general outline of the
direction. If you have some questions (or suggestions), please write to our
<a href="mailto:ecl-devel@common-lisp.net" >mailing list</a>, or contact me directly.</p>

<p>Best regards,<br/>
Daniel</p>

<h2>Funding</h2>

<p>This project is funded through <a href="https://nlnet.nl/commonsfund" >NGI0 Commons Fund</a>, a fund established by <a href="https://nlnet.nl" >NLnet</a> with financial support from the European Commission's <a href="https://ngi.eu" >Next Generation Internet</a> program. Learn more at the <a href="https://nlnet.nl/project/ECL" >NLnet project page</a>.</p>

<p><a href="https://nlnet.nl" ><img src="https://nlnet.nl/logo/banner.png" alt="NLnet foundation logo" width="20%" /></a>
<a href="https://nlnet.nl/commonsfund" ><img src="https://nlnet.nl/image/logos/NGI0_tag.svg" alt="NGI Zero Logo" width="20%" /></a></p>
 ]]></description> </item><item> <title>ECL 24.5.10 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-24510-release.html</link> <pubDate>2024-05-10 13:30</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-24510-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <p>Dear Community,</p>

<p>We are announcing a new stable ECL release. The release mainly includes a
number of bug fixes, including changes that prevent rare crashes in the
garbage collector on Mac OS X, some bug fixes for gray streams and for
pathname related functionality. Moreover, the release features new
extensions for gray streams (gray:stream-line-length,
gray:stream-file-length, gray:stream-file-string-length and generic
versions of cl:pathname and cl:truename) as well as improved emscripten
support (allowing shared library builds) and small improvements to the
manual.</p>

<p>We'd like to thank all people who contributed to ECL with code, testing,
issue reports and otherwise.</p>

<p>People listed here contributed code in this iteration: Daniel Kochmański,
Kirill A. Korinsky, Marius Gerbershagen, Tarn W. Burton, Mark Shroyer,
Dmitry Solomennikov, Kevin Zheng.</p>

<p>This release is available for download in a form of a source code archive
(we do not ship prebuilt binaries):</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-24.5.10.tgz" >ECL 24.5.10 tarball archive</a></li>
<li><a href="https://common-lisp.net/project/ecl/static/manual/" >The ECL Manual</a></li>
</ul>

<p>Happy Hacking,<br/>
The ECL Developers</p>
 ]]></description> </item><item> <title>ECL 23.9.9 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-2399-release.html</link> <pubDate>2023-09-09 08:00</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-2399-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <p>Dear Community,</p>

<p>We are happy to announce a new stable ECL release tagged <code>23.9.9</code>. The new
release includes many bug fixes, some new features, improvements to the
compiler and more. Changes include but are not limited to:</p>

<ul>
<li>Complete overhaul of thread synchronization primitives (mutexes,
  condition variables, etc.). Users of bordeaux-threads will have to update
  as this breaks workarounds for missing timeouts on condition variable
  wait operations in version 0.9.1 and earlier of this library.</li>
<li>Better unicode support: add new functions to convert between Lisp strings
  and byte arrays in different encodings, allow non-ascii characters in
  pathnames and as arguments to ext:run-program.</li>
<li>Preliminary support for the Emscripten target (bytecodes compiler only).</li>
<li>Various bug fixes and internal improvements to the compiler.</li>
<li>Better conformance to the ANSI standard.</li>
</ul>

<p>We'd like to thank all people who contributed to ECL with code, testing,
issue reports and otherwise.</p>

<p>People listed here contributed code in this iteration: Caleb Xu, Catherine
Tower, Daniel Kochmański, Dima Pasechnik, Dmitry Solomennikov, Eric
Timmons, Florian Margaine, Jeronimo Pellegrini, Kevin Zheng, Kirill
A. Korinsky, Marius Gerbershagen, Nick Faro, Tarn W. Burton, Ulrich Müller,
Yuguo Zhang, Yuri D. Lensky.</p>

<p>People listed here tested ECL extensively before the release: Kirill
A. Korinsky, Marius Gerbershagen and Paul Ruetz.</p>

<p>This release is available for download in a form of a source code archive
(we do not ship prebuilt binaries):</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-23.9.9.tgz" >ECL 23.9.9 tarball archive</a></li>
<li><a href="https://common-lisp.net/project/ecl/static/files/manual/ecl-23.9.9" >The ECL Manual</a></li>
</ul>

<p>Happy Hacking,<br/>
The ECL Developers</p>
 ]]></description> </item><item> <title>ECL 21.2.1 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-2121-release.html</link> <pubDate>2021-02-01 14:21</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-2121-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <p>Dear Community,</p>

<p>We are announcing a new stable ECL release which fixes a number of bugs
from the previous release. Changes made include amongst others</p>

<ul>
<li>working generational and precise garbage collector modes</li>
<li>support for using precompiled headers to improve compilation speed</li>
<li>the bytecompiler correctly implements the ANSI specification for load
  time forms of literal objects in compiled files</li>
<li>fixes for encoding issues when reading in the output of the MSVC compiler</li>
<li>issues preventing ECL from compiling on Xcode 12 and running on ARM64
  versions of Mac OS have been rectified</li>
</ul>

<p>More detailed information can be obtained from the CHANGELOG file and git
commit logs. We'd like to thank all people who contributed to this release.
Some of them are listed here (without any particular order): Paul Ruetz,
Karsten Poeck, Eric Timmons, Vladimir Sedach, Dima Pasechnik, Matthias
Köppe, Yuri Lensky, Tobias Hansen, Pritam Baral, Marius Gerbershagen and
Daniel Kochmański.</p>

<p>This release is available for download in a form of a source code archive
(we do not ship prebuilt binaries):</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-21.2.1.tgz" >ECL 21.2.1 tarball archive</a></li>
<li><a href="https://common-lisp.net/project/ecl/static/files/manual/ecl-21.2.1/" >The ECL Manual</a></li>
</ul>

<p>Happy Hacking,<br/>
The ECL Developers</p>
 ]]></description> </item><item> <title>ECL 20.4.24 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-20424-release.html</link> <pubDate>2020-04-24 12:00</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-20424-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <p>Dear Community,</p>

<p>After more than three years of development, we are proud to announce a new
ECL release having the version tag <code>20.4.24</code>. During that time many
important improvements have been made including bug fixes, stability
enhancements and new features. Changes include but are not limited to:</p>

<ul>
<li>package local nicknames support</li>
<li>atomic operations support</li>
<li>specialized representations of complex float types</li>
<li>a port to the iOS platform</li>
<li>fixes for weak hash tables and weak pointers</li>
<li>fixes for race conditions in the ECL internals</li>
<li>hash table extensions (synchronization and custom test functions)</li>
<li>better MOP conformance and improved meta-stability</li>
<li>improvements to the manual</li>
</ul>

<p>For more information please read the file CHANGELOG which is located in the
source code, and browse commits. We'd like to thank all people who made
this release possible by contributions of code, documentation, issue
reports, testing and others. Some of them are listed here (without any
particular order): Paul Ruetz, Karsten Poeck, Vadim Penzin, Roger Sen, Stas
Boukarev, Michael Fox, Erik Bray, Bo Yao, Jeremy Cooper, Florian Margaine,
Fabrizio Fabbri, Tomek Kurcz, Kris Katterjohn, Marcin Kolenda, Zhang Yuguo,
Sébastien Villemot, Moritz Petersen, Marius Gerbershagen and Daniel
Kochmański. We'd also like to thank the company Rigetti Computing for
sponsoring the work on specialized complex float representations.</p>

<p>We have another important announcement we'd like to make. Embeddable
Common-Lisp project has now two maintainers: Daniel Kochmański and Marius
Gerbershagen. After numerous contributions from Marius I've proposed him
this responsibility and to my rejoice he has accepted it. That reflects our
community growth.</p>

<p>This release is available for download in a form of a source code archive
(we do not ship prebuilt binaries):</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-20.4.24.tgz" >ECL 20.4.24 tarball archive</a></li>
<li><a href="https://common-lisp.net/project/ecl/static/manual/" >The ECL Manual</a></li>
</ul>

<p>Happy Hacking,<br/>
The ECL Developers</p>
 ]]></description> </item><item> <title>ECL license</title> <link>https://common-lisp.net/project/ecl/posts/ECL-license.html</link> <pubDate>2017-12-15 13:30</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-license.html</guid> <category><![CDATA[ license ]]></category><category><![CDATA[ free software ]]></category><category><![CDATA[ distribution ]]></category> <description><![CDATA[ <p>From time to time a little misconception emerges regarding the ECL
license - namely some people seem to have the impression that it is
GPL-2.0, while in fact it is LGPL-2.1+. In this post I want to talk a
little about the history of ECL and to describe what the practical
implications of such licensing are.</p>

<p>The heritage of Embeddable Common Lisp is rich, as you can read
<a href="https://common-lisp.net/project/ecl/static/manual/pr01s03.html" >here</a>. The
software has had a few maintainers throughout its history who hold
copyrights to various parts of the code. ECL was licensed under
GPL-2.0, but that license was changed after ECLS (or ECL-Spain) and
ECoLisp were once again one project and Prof. Juanjo García-Ripoll
changed the license to LGPL-2.1+ with agreement of Prof. Giuseppe
Attardi. That's the point from which I took over in 2015 with blessing
from the previous maintainer. I do not own all copyrights to the
software and I can't change its license to anything that is
incompatible with working in LGPL-2.1+. Note that parts of the
codebase are licensed more liberally (like programs in the <code>examples</code>
directory which may be used for any purpose and are licensed under the
terms of BSD-2-Clause).</p>

<p>That said, I feel very comfortable with current licensing. It
preserves a reasonable balance between producent and consumer rights
and fits project goals perfectly. The meaning of our current license
is, in short, the following: you can use ECL for any purpose in any
setting (including commercial applications), but if you commit changes
to ECL itself you are obliged to share these changes (and only them).</p>

<p>The core library is a shared object <code>libecl.so</code> and it is dynamically
linked with the software. The binary called <code>ecl</code> is just a program
which is a client of this library. Moreover, ECL compilation artifacts
are usually shared objects themself (usually disguised under the <code>fas</code>
extension):</p>

<pre><code>➜  ~ ldd `which ecl`
    linux-vdso.so.1 =&gt;  (0x00007ffff80c3000)
    libecl.so.16.1 =&gt; /home/jack/Pulpit/lisps/ecl-16.1.3/lib/libecl.so.16.1 (0x00007fc7c4665000)
    libc.so.6 =&gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc7c427a000)
    libgmp.so.10 =&gt; /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fc7c3ffa000)
    libffi.so.6 =&gt; /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fc7c3df2000)
    libpthread.so.0 =&gt; /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc7c3bd4000)
    libdl.so.2 =&gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc7c39ce000)
    libm.so.6 =&gt; /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc7c36c5000)
    /lib64/ld-linux-x86-64.so.2 (0x00005592f1735000)
➜  ~ cd .cache/common-lisp/ecl-16.1.3-21f0b92f-linux-x64/home/jack/Pulpit/repo/mcclim/Apps/Listener
➜  Listener ls listener*
listener.fas listener.o
➜  Listener ldd listener.fas 
    linux-vdso.so.1 =&gt;  (0x00007fffb43f5000)
    libecl.so.16.1 =&gt; /home/jack/Pulpit/lisps/ecl-develop/lib/libecl.so.16.1 (0x00007fa2bbfc1000)
    libc.so.6 =&gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa2bbbd6000)
    libgmp.so.10 =&gt; /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fa2bb956000)
    libffi.so.6 =&gt; /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fa2bb74e000)
    libpthread.so.0 =&gt; /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa2bb530000)
    libdl.so.2 =&gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa2bb32a000)
    libm.so.6 =&gt; /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa2bb021000)
    /lib64/ld-linux-x86-64.so.2 (0x0000563db6716000)
➜  Listener file listener.fas 
listener.fas: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ed1cece88028eb3a388ab0a589a9ee12415532e9, not stripped</code></pre>

<p>There are a few implications of this. First, I will explain
(informally) what <a href="http://opensource.franz.com/preamble.html" >LLGPL</a>
clarification to LGPL is. Many Common Lisp implementations don't work
with the notion of linking, so &quot;static linking&quot; and &quot;dynamic linking&quot;
doesn't make much sense in them. Libraries are simply added to the
image. That may raise questions whenever a binary with an LGPL library
in it may be considered derivative work or not? My strong belief lies
on the side that it is not derived work and if the author of the Lisp
library gave it the LGPL license – they meant it. If we take another
interpretation, then it is no different than licensing it with GPL, so
it would be nonsense. I think that what is tested in court is
intention and there is no rational interpretation of giving a Lisp
library the LGPL license except the one that the software does not
influence other image components. LLGPL additionally clarifies some
wording to make it less ambiguous and clear up unnecessary doubts.</p>

<p>The point above is reinforced by the fact, that the Free Software
Foundation itself made a
<a href="https://www.gnu.org/licenses/lgpl-java.html" >clarification</a> about
dynamic linking in the context of Java programming language, but
equally applicable to Common Lisp, and it addresses both the &quot;linking&quot;
and the &quot;inheritance&quot; problem. But are macro expansions derivative
work? The compiler output is not the subject of the compiler license
and macros should not be much different with this regards.</p>

<p>All that said, ECL is safe from concerns like that and such
clarification is not necessary because it works with the very same
notion LGPL talks about (static and dynamic linking). There is no
program image, only objects which a binary is composed of and linked
with (exactly like in C programs).</p>

<p>Another interesting license (with which ECL is compatible with thanks to &quot;or
later version&quot; clause) is LGPL-3.0. This license is for example used by ECL's
fork named <a href="https://common-lisp.net/project/mkcl/" >MKCL</a>
and <a href="https://gmplib.org/" >GMP</a> since version 6. In short, this license adds an
important restriction to LGPL-2.1+ called
the <a href="http://www.linfo.org/tivoization.html" >anti-tivoization</a> provision. This
privision adds a new freedom for software users – they must have the ability to
update the library on a device with software under this license to their own
version of it. This effectively means that the device can't be a complete black
box.</p>

<p>This leads us to another topic. ECL is licensed under LGPL-2.1+ license and it
is linked with GMP. As we have noted in the paragraph above, the newest version
of GMP is licensed under LGPL-3.0. In practice this means that if you use ECL
and GMP in your application and any of them is LGPL-3.0 you can't put
such a
bundle on a camera device which doesn't allow changing its software. To prevent
such situation ECL has bundled its own version of GMP, which is a slightly modified
version of GMP version 4, which was licensed under the LGPL-2.1+ terms. By default,
when building it tries to link against <code>libgmp.so</code> on your system, but given
appropriate configure flags it may use the bundled GMP version and link it
statically into <code>libecl.so</code> (ECL doesn't export symbols from <code>libeclgmp.a</code> to
avoid symbol name conflicts with the original libgmp.so).</p>

<p>I think that summarises it. Now I will provide some made up FAQ to illustrate
licensing implications in shorter form:</p>

<p>Q: <em>Is ECL GPL-2.0?</em><br/>
A: No, ECL is LGPL-2.1+.</p>

<p>Q: <em>Can you provide a commercial license for us?</em><br/>
A: No, I don't own all the copyrights.</p>

<p>Q: <em>Can we use ECL in our commercial product with proprietary components?</em><br/>
A: Yes, but you have to keep ECL linked dynamically with them (as a shared object).</p>

<p>Q: <em>Can you incorporate proprietary components in ECL?</em><br/>
A: God no (and I wouldn't do that even if I could).</p>

<p>Q: <em>Can we use ECL in our LGPL/GPL/AGPL product?</em><br/>
A: Yes, you can even link ECL statically for that purpose. Your license will be
intact.</p>

<p>Q: <em>Can you incorporate LGPL/GPL/AGPL components in ECL?</em><br/>
A: If you incorporate LGPL-2.1+, then ECL remains in LGPL-2.1+ and it can be
integrated in the upstream; but if you incorporate LGPL-3.0, GPL or AGPL, then
your fork of ECL will become LGPL-3.0, GPL or AGPL and it won't be integrated
upstream.</p>

<p>Q: <em>Can we use ECL in our BSD/MIT/Apache-2.0 product?</em><br/>
A: Yes. If it is dynamically linked there are no further implications. If you
link it statically, the overall license is LGPL-2.1+.</p>

<p>Q: <em>Can you incorporate BSD/MIT/Apache-2.0 components in ECL?</em><br/>
A: Yes, sometimes I do that.</p>

<p>Q: <em>If I compile my software with ECL is it LGPL-2.1+?</em><br/>
A: No, products of compilation are not influcenced by compiler license. You may
compile any kind of free and proprietary software with ECL without any
implications on the compilation artifacts or the code it compiles. I would
appreciate not using it for something unethical though.</p>

<p>Q: <em>Can I put ECL in an embedded device to which the consumer doesn't have access to?</em><br/>
A: Yes. You may need to build ECL with bundled GMP library to avoid LGPL-3.0
implications.</p>

<p>Q: <em>If I use two libraries in my application - one being LGPL and the other MIT – what is my program license?</em><br/>
A: That depends. If you link them statically (monolithic programs), then
resulting work will be covered at least with LGPL (you may add more restrictions
if you want). If you link them dynamically (default), then you may use any
license you want.</p>

<p>Q: <em>If I use GPL libraries in my application – what is my program license?</em><br/>
A: Its license is at least GPL.</p>

<p>Q: <em>Are you a lawyer?</em><br/>
A: Nope. You may want to consult one. But hey, you should also consult a lawyer
regarding the terms of services you probably agree on surfing the web and EULAs
bundled with your favourite software and hardware (i.e phone).</p>

<p>Q: <em>Did you cover all LGPL-2.1+ implications?</em><br/>
A: No, I recommend reading the license. I have talked about things which I find
relevant to this post.</p>

<p>Q: <em>Can I buy something from you?</em><br/>
A: Yes, you may buy developer time to work on ECL or to help integrate ECL with
your application. I'll probably do it anyway if you drop by on the IRC channel.</p>

<p>If you have more questions you may ask on the mailing list and IRC (channel #ecl
on libera.chat).</p>

<p>Thank you for reading,<br/>
Daniel Kochmański</p>

<p>-- </p>

<ul>
<li><p>I want to thank Elias Mårtenson, Pascal Bourguignon and Tomek Kurcz for
proofreading this text and for providing valuable remarks before publishing it
on the blog.</p></li>
<li><p>In this post I've used <a href="https://spdx.org/licenses/" >SPDX-License-Identifier</a>
format where appropriate.</p></li>
</ul>
 ]]></description> </item><item> <title>Lisp (ECL) and QML (Qt5) on Android?</title> <link>https://common-lisp.net/project/ecl/posts/Lisp-ECL-and-QML-Qt5-on-Android.html</link> <pubDate>2017-07-15 12:00</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/Lisp-ECL-and-QML-Qt5-on-Android.html</guid> <category><![CDATA[ EQL ]]></category><category><![CDATA[ Android ]]></category><category><![CDATA[ QML ]]></category><category><![CDATA[ QT5 ]]></category> <description><![CDATA[ 
For up to date version of this article
see
[https://lights-of-holiness.eu/blog/ECL-QML-Android.htm](https://lights-of-holiness.eu/blog/ECL-QML-Android.htm).


<!-- <!doctype html> -->
<!-- <html lang="en"> -->
<!--   <head> -->
<!--     <title>Lisp and QML on Android</title> -->
<!--     <link rel="stylesheet" href="css/style.css" type="text/css"> -->
<!--     <link rel="stylesheet" href="css/code.css" type="text/css"> -->
<!--     <meta charset="utf-8"> -->
<!--   </head> -->
<!--   <body style="margin: 20px;"> -->
    <div style="width: 700px; margin: 20px;">
      <script src="/project/ecl/static/eql-android/js/highlight.pack.js"></script>
      <script>hljs.initHighlightingOnLoad();</script>

      <small>(please note that I'm assuming a <b>Linux/64</b> bit platform or VirtualBox image)</small>

      <p>Preamble: about a month ago, I was completely void of any android experience.
      <br>This is to say: using both QML (which is easy to learn) and Common Lisp (which I assume you already know) to develop android apps is not a difficult task at all, as you'll see.</p>

      <p>So, if you are like me just a month ago, there are no excuses not to write your own, first android app using this new "EQL5-Android" project!</p>

      <p>We will build a small game (Sokoban), which uses <b>Lisp</b> for the program logic, and <b>QML</b> for the UI, and build an <b>APK</b> for the android platform.</p>

      <hr style="width: 25%;">

      <p>Being the author of that very first attempt of integrating Lisp and Qt4 (see <a target="_blank" href="https://sourceforge.net/projects/lisp-cffi-qt4/files/">lisp-cffi-qt4</a>), what I would like to accomplish is providing you with a ca. 3 MB download, which can be tried out instantly.</p>

      <p><u>10 years ago</u>, the <code><b>lisp-cffi-qt4.zip</b></code> (a runnable win32 binary version), was a 3 MB download, including both ECL and Qt4 (UPX compressed, but still).
      <br><u>10 years later</u>, this time on android, what download size is to be expected?
      <br>We will see...</p>

      <hr style="width: 25%;">

      <p>Since all the documentation needed for preparing the development environment is already covered in the "EQL5-Android" project itself, I will give only the link here:</p>

      <p><a target="_blank" href="https://gitlab.com/eql/EQL5-Android/blob/master/README-PREPARE.txt">README-PREPARE.txt</a></p>

      <p>So, I'm assuming that you already have everything installed and set up (<b>Qt</b> 5.7.1, Android <b>NDK</b> 10e, Android <b>SDK</b>, Java <b>JDK</b>, and obviously the EQL5-Android sources from <a target="_blank" href="https://gitlab.com/eql/EQL5-Android/tree/master">gitlab</a>), in order to build android packages (APK files).</p>

      <p>(EQL5 itself, the desktop version, is not strictly needed to follow this example; but for developing your own apps, you will obviously need it; even here it's very helpful for testing and debugging, if something doesn't work as expected.)</p>

      <p>If you already know the process of building EQL5 apps for the desktop, you will find that building (cross-compiling) to android is very similar, with only a few more steps involved.</p>

      <p>Since we use an example of EQL5-Android itself, everything has already been set up. But I want to remember the steps that are not obvious, if you are not familiar with Qt and EQL:</p>

      <ul>
        <li>you need to add all your external resources, like QML files, PNG files etc. to a Qt resource file (ending <code>.qrc</code>); this will integrate them (compressed) directly into the executable
        <li>you need to add all your Lisp files, in exact order of loading, to <code>make.lisp</code> (in a future version of EQL5, I will try to integrate this step with ASDF)
      </ul>

      <p>And that's it, basically (except the app name, which needs to be adapted to the <code>*.qrc</code> file name, to your <code>*.pro</code> file name and contents (see <code>TARGET</code> and <code>RESOURCES</code>), and to the contents of the third script <code>3-build-apk.sh</code> (see <code>*.json</code> file name).</p>

      <p>Everything else will stay the same for every project.</p>

      <p>Now I want to call your attention on the huge advantage of using Qt for your android apps: you can first build a desktop <code>exe</code>, with the exact same sources, and try/debug it. If the desktop version works, the android app will generally work too (the only things that may need adaption are e.g. font sizes and similar).</p>

      <p>So, let's get practical! In the EQL5-Android sources, switch to <code>'examples/sokoban/'</code>.</p>

      <p>Building a desktop exe would be this 3 liner:</p>
      <pre><code>
  $ <b>eql5</b> make-desktop.lisp
  $ <b>qmake</b> sokoban_desktop.pro
  $ make
      </code></pre>

      <p>(To test if all resources have really been included in the <code><b>sokoban_desktop</b></code> executable, you need to move it to a different directory, and launch it from there.)</p>

      <p>Here's a screenshot of our app running on the desktop:</p>

      <img src="/project/ecl/static/eql-android/img/sokoban-desktop.png">

      <p>But now let's do the <b>cross-compile</b> dance!</p>

      <p>First let's copy the needed shared libraries to the <code>'android-build/'</code> directory.
      <br>Just run script number 1:</p>
      <pre><code>
  $ ./1-copy-libs.sh
      </code></pre>

      <p>This step needs only be done once for every new project. It will copy the cross-compiled ECL and EQL5 libs into our android build directory.</p>

      <p>The next steps are very similar to a desktop build:</p>

      <pre><code>
  $ <b>ecl-android</b> -shell make.lisp
  $ <b>qmake-android</b> sokoban.pro
  $ make
      </code></pre>

      <hr style="width: 25%;">

      <p>Since cross-compiling requires a special "host ECL", which needs to match the target platform (that is, 32 bit, no double floats), we would be in trouble with cross-compiling EQL5 code: we certainly don't want a seperate EQL5 32 bit version, only for cross-compiling...</p>

      <p>But there is a solution to this (see <code>'utils/EQL5-symbols.lisp'</code> in sources): for cross-compiling -- which is the job of our "host ECL" -- we pretend to be the <code><b>eql5</b></code> executable, by defining all packages and symbols, defining all EQL5 macros (otherwise we can't compile), and simply defining dummy-functions for all EQL5 functions, so the compiler will not complain.</p>

      <p>So, loading <code><b>'utils/EQL5-symbols.lisp'</b></code> in our <b>host ECL</b> will be sufficient for cross-compiling EQL5 code.</p>

      <p>If you are interested in how the cross-compile environment is set up, please see:</p>

      <p><a href="https://gitlab.com/eql/EQL5-Android/blob/master/utils/cross-compile.lisp"><code>utils/cross-compile.lisp</code></a></p>

      <p>(thanks to Sylvain Ageneau, who wrote the original version; this is a simplified version not depending on ASDF; the latter will be integrated in a future version)</p>

      <hr style="width: 25%;">

      <p>So, the above 3 liner will build the shared library of our app, ready to be included in the android build. To copy it where the android build expects it, use script number 2:</p>

      <pre><code>
  $ ./2-install-lib.sh
      </code></pre>

      <p>The last step, which will build our <b>APK</b> file, is a verbose one (for eventual debugging), and a little time consuming: it will create the whole package structure, and compile the whole thing into an APK file, ready to be installed on an android device.</p>

      <p>There is this great tool (courtesy Qt) called <code><b>androiddeployqt</b></code>, which automates the whole and complex process of creating an APK file, with all the needed options already set in our 3rd script:</p>

      <pre><code>
  $ ./3-build-apk.sh
      </code></pre>

      <p>Here the contents of the above script, where you can see all the selected options:</p>

      <pre><code>
  $ ~/Qt5.7.1/5.7/android_armv7/bin/<b>androiddeployqt</b> \
        --input android-libsokoban.so-deployment-settings.json \
        --output android-build \
        --deployment ministro \
        --gradle \
        --verbose
      </code></pre>

      <p>If it will tell you <code><b>BUILD SUCCESSFUL</b></code>, then you'll find the APK file (ready for deployment) in <code>'android-build/build/outputs/apk/'</code>.

      <p>The last step is copying over the APK file to your android device, and install / run it. Normally you're not allowed to do this, because it requires special developer settings (please search the web for instructions how to enable them, as they are different for every android version).</p>

      <p>After connecting via <b>USB</b> and copying the APK file over to your device, just tap it from there. This will ask for installing, and then for opening the app.</p>

      <p>Here's a screenshot of the sokoban app running on a tablet:</p>

      <img src="/project/ecl/static/eql-android/img/splash.png">

      <p>Above you see the splash screen, because startup will take a few seconds.</p>

      <p>Below the game:</p>

      <img src="/project/ecl/static/eql-android/img/sokoban-android.png">

      <p>After seeing the result, I'd like to consider a few QML and Lisp snippets.</p>

      <p>QML is easy to learn. You just need to declare <b>what</b> you want (and it will do the <b>how</b> behind the scenes).
      <br>Let's see this snippet for defining and placing our arrow buttons:</p>

      <pre><code class="qml">
  // container for arrow buttons
  Item {
      id: arrows
      width: up.width * 3
      height: up.height * 3
      anchors.margins: 10
      anchors.right: parent.right
      anchors.verticalCenter: parent.verticalCenter

      Ext.Button {
          id: up
          objectName: "up"
          source: "img/up.png"
          anchors.horizontalCenter: parent.horizontalCenter
      }

      Ext.Button {
          objectName: "left"
          source: "img/left.png"
          anchors.verticalCenter: parent.verticalCenter
      }

      Ext.Button {
          objectName: "right"
          source: "img/right.png"
          anchors.verticalCenter: parent.verticalCenter
          anchors.right: parent.right
      }

      Ext.Button {
          objectName: "down"
          source: "img/down.png"
          anchors.horizontalCenter: parent.horizontalCenter
          anchors.bottom: parent.bottom
      }
  }
      </code></pre>

      <p>So, we define an <code>Item</code> as container for the buttons, giving it the width (<code>up.width * 3</code>) and height (<code>up.height * 3</code>), according to the button sizes: this may be any calculation or function call, and may refer to any item of the file, referred to by its <code>id</code>.<p>

      <p>For placing the container itself, and the single arrow buttons, we just need to define <code><b>anchors</b></code>, which can be relative to other items (here: the <code>parent</code> item).</p>

      <p>The <code>Ext.Button</code> is a user defined item class, which can be found in <code>'qml/ext/Button.qml</code>. That is, the whole directory <code>'ext/'</code> is imported as <code>Ext</code>:</p>

      <pre><code class="qml">
  import "ext/" as Ext
      </code></pre>

      <p>This means that every file in <code>'ext/'</code> is now a new QML class, which can be referred to via <code>Ext</code> (like a namespace).</p>

      <p>The definition of our image button class (see <code>'qml/ext/Button.qml')</code> is:</p>

      <pre><code class="qml">
  import QtQuick 2.0

  Image {
      signal pressed()

      MouseArea {
          anchors.fill: parent
          onPressed: { parent.pressed() }
      }
  }
      </code></pre>

      <p>So, we don't need a real button, but only a clickable image: adding a mouse area will allow us to capture mouse events; this event is then passed to the parent (that is, the <code>Image</code> class), where a Qt signal will be emitted: this will allow us to connect to it from Lisp:</p>

      <pre><code class="lisp">
  (defun connect ()
    (macrolet ((pressed (item function)
                 `(qconnect (find-quick-item ,item) "pressed()"
                            (lambda () ,function))))
      (pressed "up"       (sokoban:move :north *maze*))
      (pressed "down"     (sokoban:move :south *maze*))
      (pressed "left"     (sokoban:move :west *maze*))
      (pressed "right"    (sokoban:move :east *maze*))
      (pressed "previous" (change-level :previous))
      (pressed "next"     (change-level :next))
      (pressed "undo"     (undo))
      (pressed "restart"  (reset-maze))
      (pressed "solve"    (solve))))
      </code></pre>

      <p>If you already played the game finishing a level, you will have noticed that there are 2 animations (rotation of the player, wiggling of all boxes) which run queued.
      <br>This is a little tricky to do, but with the help of a Lisp macro, we only need these lines in Lisp (being <code><b>queued</b></code> a macro):</p>

      <pre><code class="lisp">
  (defun final-animation ()
    (queued (qml-set "rotate_player" "running" t)
            (qml-set-all "wiggle_box" "running" t)))
      </code></pre>

      <p>Please see the sources for all the details. And this would not be possible without a Lisp function called from QML for notifying us whenever an animation state changes, see <code>'qml/ext/RotationAnimation.qml'</code>:</p>

      <pre><code class="qml">
  import QtQuick 2.0
  import EQL5 1.0

  RotationAnimation {
      onRunningChanged: Lisp.call("qsoko:animation-change", running)
  }
      </code></pre>

      <hr style="width: 25%;">

      <p>What I left out to explain is the dynamic (at run time) creation of QML items (see <code>'qml/items/*'</code> and <code>'lisp/sokoban.lisp'</code>); let's just say that this is left as an exercise to the reader, as all sources will patiently stay there to be read...</p>

      <hr style="width: 25%;">

      <p>Well. But I still didn't answer the initial question: how big of a download is to be expected, 10 years later?</p>

      <p>Since our APK file uses the <b>ministro</b> service for automatically installing the needed Qt libraries at the first launch of the app, it will only need to include both the ECL and EQL5 libraries (you can therefore use different ECL and EQL5 versions for every app you deploy).</p>

      <p>So, to finally answer the question: our download will be ca. <b>3.5 MB</b> (instead of 3 MB, 10 years ago, although we obviously compare <i>apples and oranges</i> here).</p>

      <p>Seems acceptable.</p>

      <p>And since I promised you to test it instantly (if you own a device with ARM processor), here you are:</p>

      <p><a target="_blank" href="http://lights-of-holiness.eu/tmp/sokoban.apk">sokoban.apk</a></p>

      <p>Enjoy!</p>

      <p>&nbsp;</p>
      <p>&nbsp;</p>
      <p>&nbsp;</p>

    </div>
<!--   </body> -->
<!-- </html> -->

 ]]></description> </item><item> <title>ECL 16.1.3 release</title> <link>https://common-lisp.net/project/ecl/posts/ECL-1613-release.html</link> <pubDate>2016-12-19 11:30</pubDate> <author>Daniel Kochmański</author> <guid isPermaLink="true">https://common-lisp.net/project/ecl/posts/ECL-1613-release.html</guid> <category><![CDATA[ release ]]></category> <description><![CDATA[ <h1>Announcement<a id="orgheadline1"></a></h1>

<p>Dear Community,</p>

<p>After almost a year of development we are proud to present a new
release of ECL tagged with version <code>16.1.3</code>. All changes are backward
compatible fixing bugs and other issues, implementing new interfaces
and cleaning up the code base.</p>

<p>ECL manual has been updated in a few places. Work on a new
documentation is still pending. New documentation is still incomplete,
but you may see it here:
<a href="https://common-lisp.net/project/ecl/static/ecldoc/">https://common-lisp.net/project/ecl/static/ecldoc/</a>.</p>

<p>Before this release we have performed extensive tests on many
platforms (Linux, FreeBSD, OpenBSD, NetBSD, OSX, Windows MSVC, Windows
MinGW, Windows Cygwin, Android and Haiku). For details please consult
<a href="https://gitlab.com/embeddable-common-lisp/ecl/issues/307">https://gitlab.com/embeddable-common-lisp/ecl/issues/307</a>. Extra
attention has been paid to Windows testing to improve that platform
support.</p>

<p>This release is available for download in form of a source archive:</p>

<ul>
<li><a href="https://common-lisp.net/project/ecl/static/files/release/ecl-16.1.3.tgz" >ECL 16.1.3 tarball archive</a>.</li>
</ul>

<p>Best regards,<br/>
<em>ECL Development Team</em></p>

<h1>API changes<a id="orgheadline2"></a></h1>

<ul>
<li><p>Added better interface for package-locks.</p>

<p>Introduced functions:</p>

<pre><code>ext:package-locked-p package
ext:lock-package package
ext:unlock-package package
ext:without-package-locks &amp;body body
ext:with-unlocked-packages (&amp;rest packages) &amp;body body
</code></pre>

<p>To use these functions user has to require the module</p>

<pre><code>(require '#:package-locks)
</code></pre>

<p><code>defpackage</code> accepts new option <code>lock</code> to allow locking package on
creation:</p>

<pre><code>(defpackage foo (:lock t))
</code></pre></li>
<li><p><code>mp:holding-lock-p</code>: introduce new function for multiprocessing. Function
verifies if lock is hold by the thread which calls the function. Usage:
<code>(mp:holding-lock-p my-lock)</code>.</p></li>
<li><p><code>make-random-state</code>: fix problem with simple-vectors. The correct
initialization types for <code>make-random-state</code> are: <code>(OR RANDOM-STATE
  FIXNUM (MEMBER T NIL))</code>.</p>

<p>Initializing a random state with an appropriate array (element type and
arity dependent on platform) is also possible.</p></li>
<li><p><code>ext:random-state-array</code>: new extension for random-states. Usage:
<code>(ext:random-state-array random-state)</code>.</p></li>
<li><p><code>ext:terminate-process</code>: new extension for external processes. Usage:
<code>(ext:terminate-process process)</code> with a second, optional boolean
argument whenever termination should be forced or not.</p></li>
</ul>

<h1>Enhancements<a id="orgheadline3"></a></h1>

<ul>
<li><p>Implemented <code>CDR-7</code>.
<a href="https://common-lisp.net/project/cdr/document/7/index.html">https://common-lisp.net/project/cdr/document/7/index.html</a></p></li>
<li><p>implemented CDRs: <code>CDR-1</code>, <code>CDR-5</code>, <code>CDR-14</code>. Both <code>CDR-1</code> and <code>CDR-5</code>
  were already implemented, CDR-14 made us to list them in <code>*features*</code>
  (<a href="https://common-lisp.net/project/cdr/document/14/index.html">https://common-lisp.net/project/cdr/document/14/index.html</a>).</p></li>
<li><p>if ECL is build with <code>--with-cxx</code> option, <code>:CXX-CORE</code> is present in
<code>*features*</code>.</p></li>
<li><p>deprecated configure option <code>--with-local-gmp</code> has been removed - use
<code>--enable-gmp</code> (defaults to auto).</p></li>
<li><p>configure options has been revised.</p></li>
<li><p>ASDF has been upgraded to version 3.1.7.26 (with a few patches scheduled
for 3.2.0).</p></li>
<li><p>bundled CLX has been purged. Lately I've fixed ECL support on portable
CLX maintained by sharplispers on <a href="https://github.com/sharplispers/clx">https://github.com/sharplispers/clx</a>
(available via QuickLisp).</p></li>
<li><p>initial port for the Haiku platform. The port is done by Kacper Kasper's
work, one of Haiku developers. Threads are not supported yet.</p></li>
<li><p>refactored ECL internal tests framework. Tests in <code>src/tests</code> are now
asdf-loadable (with <code>load-source-op</code>) and divided into test suites. <code>make
  check</code> target runs all regression and feature tests which aren't supposed
to fail.</p></li>
<li><p>removed 15000 lines of obsolete code. Files not included in the
buildsystem but lingering in the codebase or options failing to
build. All info is added in the new documentation in the section &quot;Removed
interfaces&quot;.</p></li>
<li><p>improved man page and help output. Man page now contains up-to-date list
of flags, as well as explanation of flag's behavior.</p></li>
<li><p>deprecated long flags with one dash, added two-dash version. Flags that
aren't one-character, but start with one dash (e.g. <code>-eval</code>) are now
deprecated; long version <code>--eval</code> was added instead.</p></li>
<li><p>indented C/C++ code to follow emacs's gnu C style.  This is a first step
towards coding standards in the documentation. Additionally all in the
src/c/ directory are listed in the appropraite documentation section
(new-doc).</p></li>
<li><p>refactored <code>list_current_directory in unixfsys.d</code>. Function was
obfuscated with ifdefs with non-even pairs of <code>#\{</code> and <code>#\}</code>.</p></li>
</ul>

<h1>Issues fixed<a id="orgheadline4"></a></h1>

<ul>
<li><p>ECL signals floating point exceptions in top-level console.</p></li>
<li><p><code>mp:rwlock</code> is treated as built-in class (previously process crashed if
<code>class-of</code> was called on such object).</p></li>
<li><p>ECL builds now succesfully with <code>--with-ieee-fp=no</code> option.</p></li>
<li><p><code>ext:file-stream-fd</code>: doesn't cause an internal-error if called
with something not being a <code>file-stream</code> (signals a
<code>SIMPLE-TYPE-ERROR</code> condtition).</p></li>
<li><p><code>stable-sort</code>: bugfix and improvement in speed. Adapted from SBCL by
Diogo Franco.</p></li>
<li><p>typep: accept <code>*</code> type specifier as abbreviation of <code>T</code> as described in
<code>2.4.3 Type Specifiers</code> of the specification.</p></li>
<li><p>MOP: fix problemes when redefining non-standard and anonymous
classes. Bugs identified and fixed by Pascal Costanza.</p></li>
<li><p><code>getcwd</code>: fix issue with too long pathname. This fixes the regression,
which crashed ECL at start when pathname exceeded 128 characters limit.</p></li>
<li><p><code>make-random-state</code>: fix a problem with simple-vectors. Until now <code>#$</code>
reader macro accepted simple vectors as an argument, what lead to bugs if
vector didn't match specific requirements like the element type or the
arity. Now we sanitize this.</p></li>
<li><p><code>make-load-form</code>: provide implementation for random-state objects.</p></li>
<li><p>thread fix on msvc: on windows importing thread was closing the thread
handler so the thread wakeup wasn't working because the handler is not
more valid.</p></li>
<li><p>import thread wasn't set upping a proper environment: on some case the
thread was mistakenly thinking that the thread was already registered.</p></li>
<li><p><code>ECL_HANDLER_CASE</code> and <code>ECL_RESTART_CASE</code> didn't work as expected. Bug
identified and fixed by Vadim Penzin.</p></li>
</ul>
 ]]></description> </item> </channel> </rss>