Allegro CL version 9.0
Moderate update since 9.0 release.
8.2 version

Release Notes for Allegro CL 9.0

This document contains the following sections:

1.0 Introduction
2.0 Information on changes and new stuff since the 10.1 release
3.0 Information on changes and new stuff since the 9.0 release
4.0 Fasl files are not-compatible between versions and operating systems
   4.1 All pre-9.0 Lisp compiled files must be recompiled (old fasl files will not load)
   4.2 Fasl files may be incompatible in different Lisps on same hardware
5.0 Release Notes for installation
6.0 Release notes for specific platforms
   6.1 Required versions of OpenSSL needed for the :ssl module
   6.2 macOS notes
      6.2.1 Allegro CL must be updated to work with macOS 10.10
      6.2.2 Installing Mavericks OS (macOS 10.9) may break X11
      6.2.3 Installing Mountain Lion OS (macOS 10.8) may uninstall X11
   6.3 Heap start locations
7.0 Release Notes for the base Lisp
   7.1 New features in the base Lisp
      7.1.1 Features added to Allegro CL 8.2 after the initial release of Allegro CL 8.2
   7.2 Non-backward-compatible changes in the base Lisp
      7.2.1 New features in Allegro CL 9.0
   7.3 Other changes to and notes about the base Lisp
   7.4 Multiprocessing and SMP release notes
   7.5 Base Lisp platform-specific information
8.0 Release Notes for CLIM
9.0 Release Notes for Common Graphics and the IDE
   9.1 Common Graphics and the IDE on the Mac
   9.2 Significant changes in Common Graphics
   9.3 Non-backward-compatible changes in Common Graphics
   9.4 Other changes in Common Graphics
   9.5 IDE release notes
      9.5.1 Opening projects from releases prior to 9.0
   9.6 Functionality to handle differences between Windows and GTK
   9.7 Release notes for the winapi module
10.0 Release notes for AllegroServe
11.0 Release notes for The Emacs/Lisp interface
12.0 Availability of CLX for Allegro CL
13.0 Release notes for Orblink
Appendix A. ANSI Conformance in Allegro CL

1.0 Introduction

This document provides the release notes for release 9.0 of Allegro Common Lisp and related products. Many sections are divided into non-backward-compatible changes (that produce different behavior in release 9.0 compared to release 8.2) and changes unrelated to backward-compatibility. Note that a bug fix is not considered a backward-incompatible change even if it does result in changed behavior because the previous behavior was erroneous.

You may wish to look at the 8.2 Release Notes, included in this distribution as the file version-82-release-notes.htm.

This document describes the changes, major and minor, from 8.2 to 9.0. Please look particularly at these sections:

If you notice changed or unexpected behavior with an operator, variable, class, or facility, search for its name in this document to see whether there is an entry concerning it.

2.0 Information on changes and new stuff since the 10.1 release

The following changes have been implemented by patches and/or updates since the initial release of Allegro CL 10.1. See sys:update-allegro for information on getting patches and updates.

This section is included in the versions 10.0 and 9.0 updated release notes because some updates are retrofitted to those earlier releases. Each change says whether it applies to releases prior to version 10.1.

  1. Allegro CL 10.1 now supports SSL 1.1. You may now load either SSL 1.0 or 1.1 into Allegro CL 10.1. See Secure Socket Layer (SSL) in socket.htm for more information. Allegro CL 9.0 and 10.0 only support SSL 1.0.
  2. The Allegro CL FAQ has moved to a new location. The FAQ is now found at The previous location now simply contains a link to the new location. Links within the documentation are being updated but some may still point to the old location. As part of the move, obsolete items (references to old OS's and expired Allegro CL versions, for example) have been removed.
  3. The buffer argument to make-buffer-input-stream and with-input-from-buffer can be an aligned pointer (10.1 only). An aligned pointer is a fixnum which is interpreted as a machine integer, as described in Aligned Pointers and the :aligned type in ftype.htm. The buffer argument to make-buffer-input-stream and with-input-from-buffer is usually a vector but can also be an aligned pointer so data can be read from C space. This change added by a patch released in July, 2019 and is for 10.1 and later only.
  4. New fixed index feature for class slots (10.1 only). A new feature added to Allegro CL 10.1 is the ability to specify the index which the value of a slot will have in an instance's slot values vector. When an instance of a class is created, it is provided a vector of slot values. Generally, which slot value is at which index in that vector cannot be easily determined and subsequent changes to classes may result in the index changing. A new slot option, excl:fixed-index (note: a symbol in the excl package, not in the keyword package) can be used to specify the index of a slot in the vector. That index is then fixed regardless of subsequect class changes. (Conflicting indices cause errors when an attempt is made to create an instance.) Knowing the index allows significant optimization of slot accesses. This change added by a patch released in July, 2019 and is for 10.1 and later only.
  5. New embellisher metaclass allows adding code to the class definition (10.1 only). Because defclass forms are macroexpanded when seen but macroexpanded code is usually executed later when the class is actually defined, it is difficult to add code to execute along with the macroexpanded defclass code. A new feature in Allegro CL (10.1 and later only) defines the defclass-embellisher-class metaclass. Subclasses of this metaclass will add desired code to the defclass macroexpansion. Two such metaclasses are defined (fixed-index-class and fixed-index-filling-class) and another is shown in an example. Users can write their own as well. As said, this feature, added by a patch released in July, 2019, is for 10.1 and later only.
  6. New pgid keyword argument to run-shell-command (UNIX only, 10.1 only). run-shell-command has a new keyword argument pgid. It allows control of the process group of the process spawned by the run-shell-command call, which allows better control over signal distribution. A Control-C typed to interrupt the Lisp will send a SIGINT to every process in that Lisp's process group. Using the pgid argument to specify that the spawned process will be in a separate process id group, Lisp can be interrupted while the spawned process continues to run. . This argument is available in release 10.1 only. It is not supported in releases 9.0 and 10.0.
  7. New function wait-for-io-available in 10.1. mp:wait-for-io-available is similar to wait-for-input-available but allows an application to wait for output possible on one set of streams as well as for input availble on another set. This function is for version 10.1 only and is not defined in version 9.0 or 10.0. The patch for this function was released in May, 2019.
  8. New quiet keyword argument to build-lisp-image. build-lisp-image (and generate-executable and generate-application, which call build-lisp-image) can generate a great deal of output which is only of interest if there is a problem creating the desired image. The new quiet keyword argument, accepted by all three functions, suppresses that output unless an error is signaled. See building-images.htm for details of the quiet argument.
  9. AllegroServe documentation moved to github. The AllegroServe documentation is now in github rather than being part of the regular Allegro CL documentation set. The documents are Main AllegroServe document, htmlgen document, and AllegroServe Tutorial.
  10. The macro with-at-most-one-form released for 10.1. The macro with-at-most-one-form will signal an error if its body contains more than one form and optionally, depending on the value of the if-null-body keyword argument, if the body contains no forms. The purpose is to ensure conditionalized code where only one form is supposed to be executed, will error if two or more forms or, optionally, no forms would execute. This macro was reported to have been released in 2018 for versions 10.0 and 10.1 but that information was incorrect. The macro has now been released for version 10.1 only.
  11. New process pool facility allows reusing processes multiple times. The new process pool facility allows setting up a pool of processes, each of which runs a task and then remains available for a further task. Using a pool saves the overhead of creating and destroying process objects. This is useful when you expect to have many short to medium tasks to be run in their own processes. This new facility is in release 10.1 (and later) only.
  12. Support for Allegro Composer has ended. Allegro Composer (see composer.htm), a development environment for Allegro CL, depends on various out of date tools (such as no-longer-supported versions of CLX). We have determined it is no longer possible to continue to support this product. Users on Windows, Linux, and MacIntosh machines are urged to use the IDE (see cgide.htm) instead.
  13. Many supported message digest function previously undocumented. The section MD*, SHA*, HMAC, and other message digest support, and RC4 cypher functions in the miscellaneous.htm document describes supported message digest functions. Until a recent documentation update, many digest functions were present but not documented (including support for MD4, SHA224, SHA256, SHA384, SHA512, and RMD160). This has been corrected. These functions exist in versions 9.0, 10.0 and 10.1.
  14. Significant changes to the runtime analyzer [10.1 only]. A series of patches released in December, 2018, make significant changes to the runtime analyzer. (See for information on released patches.) These changes are for release 10.1 (and later) only. Releases 9.0 and 10.0 are unchanged.
  15. More changes to net.uri:parse-uri and net.uri:render-uri and new operators net.uri:string-to-uri and net.uri:uri-to-string. The change listed just below has been partly reverted. net.uri:parse-uri will not decode the characters #\+, #\= and #\& in the query field if they are percent encoded. This is contrary to RFC 3986, but otherwise there is no way to pass these characters as field values. The new function net.uri:string-to-uri does no decoding of the query field. Its inverse is the new generic function net.uri:uri-to-string. This update applies to all supported versions (9.0, 10.0, and 10.1).
  16. URI and URN implementation brought up to modern standards. A patch changes the implementation of the handling of URIs to follow RFC3986 (which replaces the obsolete RFC2396) and RFC8141. New accessors have been added (for IPv6 and zone-id of URIs and r-, q-, and f-components of URNs). The URI interface is described in uri.htm. This update applies to all supported versions (9.0, 10.0, and 10.1).
  17. Running Lisp with a shell script facility improved. This now works on all platforms, including Windows (in a UNIX-like command shell like that provided by Cygwin) and FreeBSD (prior to the recent update, you could not run Lisp with a shell script on Windows or FreeBSD). Other changes include using environment variables to specify certain control arguments. See Starting using a shell script in startup.htm. The change is for 10.1 and later only.
  18. add-typep-transformer has a new re-exapnd keyword argument. add-typep-transformer allows the compiler to transform the form (typep x type) into (funcall predicate x). The new argument, when it is true and when the predicate is a symbol naming a function, causes the transformed form to be (predicate x), potentially allowing compiler macros for predicate (if such exist) to further inline code. Thie feature is for 10.1 and later only.
  19. Macro with-coverage modified to cover all functions within a function group. The macro with-coverage reports of calls to functions specified in a list which is the first argument of the macro during evaluation of the body of the macro. A change introduced by a patch means that additionally all function within a function group, such as functions defined with flet forms, are also instrumented even when they are not explicitly included in the function list. See with-coverage for more information and an example. Also, a bug where flet functions in the list could cause purespace storage errors has been fixed. The patch is for 10.0 and 10.1 only.
  20. The patch for the macro with-at-most-one-form has been released for 10.1 only. In an earlier version of these release notes, we said that the patch for the macro with-at-most-one-form was released for versions 10.0 and 10.1. By an oversight, the patch was not released. It now has been but for version 10.1 only. The macro ensures that one and only one of a set of conditionalized forms results from the evaluation of the macro's body. The case where zero forms result is also handled.
  21. Support added in the :ssl module for for Service Name Indication (SNI). The value of the new variable acl-socket:*ssl-features* is a list of supported SSL features. In 10.1, it contains :sni only. Also, acl-socket:make-ssl-client-stream accepts a server-name keyword argument. This feature and the variable are 10.1 only. They are not supported (and the variable does not exist) in 9.0 and 10.0.
  22. mplog facility. Allegro CL has had since version 10.0 a multiprocessing logging facility which, when enabled, writes a log of multiprocessing events which may assist in debugging multiprocessing problems. This facility is now documented. It is already in the product (10.0 and 10.1) and can be loaded by evaluating (require :mplog). This facility is not available in Allegro CL 9.0.
  23. The Lisp Base start for Windows 64-bit increased to #x200000000 in 10.1. This change (from #x100000000) was made with the initial release of Allegro CL 10.1 but was not noted in its own release note. (The table in Section 6.3 Heap start locations was updated. The 64-bit SMP version on Windows already had a Lisp Base start of #x200000000.)
  24. prefixp generic function has a new prefix-length optional argument. The generic function prefixp has a new optional argument prefix-length restricts the prefix sequence to (subseq prefix 0 prefix-length). The value of prefix-length must be nil or a non-negative fixnum less than or equal to the length or the prefix argument. With the value nil (the default) the results are unchanged. Modified by a patch released in April, 2018. The change is for release 10.1 only.
  25. New date functions calculate values of days and dates ignoring time of day. A new suite of functions take universal time values and calculate the number of days between them, or which happens on an earlier or later day, or return a universal time falling on a day a specific number of days after a given universal time, along with other such calculations. The functions include day-difference, date=, day-number, and so on. These functions are only available in release 10.1 (and is not available in 10.0 or 9.0).
  26. New function excl:day-difference. Replaced by entry just above.
  27. Websocket update. A subsequent patch has enhanced the Websocket API.  This applies to Allegro CL 10.0 and 10.1 only.
  28. New Support for Websockets. A new module which implements the websocket protocol specified in RFC 6455 has been made available as a patch to 10.1 and 10.0.  This applies to Allegro CL 10.0 and 10.1 only.
  29. Installing 32-bit Allegro CL on Fedora Linux 25 and later requires extra installation steps. See Getting 32-bit Allegro CL to run on 64-bit Fedora 25 and later in installation.htm for more information. This applies to Allegro CL 9.0, 10.0, and 10.1.
  30. New macro mp:do-periodically. The new macro mp:do-periodically alternates executing a body of code with sleeping a specified amount of time, all within a non-returning loop (you can break out of the loop by calling return). While coding such a loop is easy, a hand-coded one may cons excessively while mp:do-periodically is tailored to cons hardly at all. See the description of mp:do-periodically for more information. This change applies to releases 9.0, 10.0 and 10.1.
  31. New :utf-8s strict external format. When this external format is in effect, non-UTF8 characters will be filtered out, replaced by a designated error character. Optionally, a warning or error may be signaled when an improper character or character sequence or associated improper octets are encountered. This change applies to releases 10.0 and 10.1 but not to release 9.0.
  32. Mouse wheel support for GTK. This was actually added some time ago but the documentation was not updated. It is now. See mouse-wheel, mouse-wheel-present, and mouse-wheel-scroll-lines.

3.0 Information on changes and new stuff since the 9.0 release

These changes were made after the initial release of Allegro CL 9.0. You must update you images to use most of the functionality described (see sys:update-allegro).

  1. OpenSSL libraries must be installed in order to use OpenSSL in socket communication. Except on Windows, prior to a patch released in June, 2016, Allegro CL included the necessary OpenSSL libraries with its SSL module. This meant that users did not have to obtain those libraries themselves but it also meant that users could not use the latest OpenSSL version until the Allegro CL module was updated. (Note that not all Allegro CL versions support SSL.) With the patch released in June, 2016, this has changed. OpenSSL libraries must be installed on all platforms. These will be linked to when the Allegro CL SSL module is loaded. An error will be signaled if the needed OpenSSL library files cannot be found. See Secure Socket Layer (SSL) in socket.htm for more infrmation on the new scheme. Note that some operating systems include OpenSSL libraries with their standard OS updates. On those platforms (which include the Mac and some versions of Linux), Allegro CL users will likely have to take no action: the OpenSSL libraries will be found in the standard location for the platform. Also, as said above, there is no change in Windows, where users have always downloaded the OpenSSL library files, other than the change to the API described in Secure Socket Layer (SSL) in socket.htm.
  2. Some compiler switches obsolete. The compiler switches comp:peephole-optimize-switch, and comp:save-arglist-switch are no longer used. The variables still exist and can be set (so existing code will not beak) but the values are ignored. Peephole optimizations are now always done during compilation and arguments are always saved. It was determined that any possible savings were too small to be worth doing. This change was made in the initial 9.0 release but was not properly documented.
  3. New types keyword argument to dbi:run-prepared-sql. This new argument to dbi:run-prepared-sql allows specifying the return type.
  4. New EC2 implementation: an updated interface to the Amazon Elastic Compute Cloud (EC2) has been released in a patch dated November 4, 2014. The API version support is moved to version 2014-09-01. See ec2.htm for further information.
  5. Update required to use Allegro CL 9.0 with macOS 10.10. Allegro CL updates are required to use Allegro CL 9.0 with macOS 10.10. Please see Updating for macOS 10.10 in installation.htm for information. Note that, as described in the linked section, XQuartz must also be reinstalled.
  6. A new for-as-in-sequence subclause for the loop macro. The loop macro now supports a for-as-in-sequence subclause which iterates over a list or a simple, general vector. Existing (standard) subclauses include for-as-in-list and for-as-across (for vector) and this new subclause combines them, as so allows the sequence operated on to be a list or a simple vector at runtime. See cl:loop and the for-as-in-sequence subclause for looping over sequences in implementation.htm. This new subclause was added in a patch in May, 2014.
  7. New universal date parser. New functions string-to-universal-time and universal-time-to-string convert strings denoting times in various standard formats to universal times and universal times to strings in various formats. Converting durations to strings is also supported. This is not part of the date-time module described in date-time.htm but since the functionality is related, the General date to universal time parsers section in that document describes the new facility. These functions were added in a patch released in May, 2014.
  8. jLinker update: a patch released in April, 2014 made a number of changes to the jLinker module. There are now several calling models, including a new calling style where Lisp functions are generated by analyzing Java jar files or classes. The names of the Lisp functions are systematically derived from the Java names and mimic the overloading style used in Java; in most cases, the Lisp name is easily deduced from the Java name so that perusing a translation table is rarely needed. The correct Java method to call is determined at run time by comparing the Lisp argument types to Java signatures. See Calling Style from Lisp to Java in jlinker.htm.
  9. Major update to SSL socket module. (This change is not related to the Heartbleed problem described in the next item.) The interface to SSL sockets has been upgraded. SSL contexts, re-usable objects which contain configuration values for SSL server and client streams, are now supported. Contexts are created with make-ssl-server-context and make-ssl-client-context. make-ssl-server-stream and make-ssl-client-stream now have context keyword arguments which take an SSL context as a value. Also, the default value for the method argument to make-ssl-server-stream and make-ssl-client-stream is :tlsv1+. These modifications were added in a patch released in April, 2014.
  10. Fix for OpenSSL Heartbleed bug available. The OpenSSL Heartbleed bug (see requires new library files and application rebuilds. See the Tech Corner Article at for instructions. Users are strongly recommended to apply this fix.
  11. The list value of *global-gc-behavior* should not be used in an SMP Lisp. The variable *global-gc-behavior* controls when and how often global garbage collections happen. On possible value for this variable is a list of a positive integer (specifying a number of seconds), and a real greater than or equal to 1.0 (and optionally a boolean specifying verbosity). This value is designed to trigger global gc's after a specified amount of idle time. But idle time is ill-defined in an SMP Lisp. The list value for *global-gc-behavior* uses sys:funcall-after-idle-timeout, which, as the next item notes, should not be used in SMP Lisps.
  12. sys:funcall-after-idle-timeout should not be used in an SMP Lisp. In an SMP Lisp, idle time is ill-defined. The function sys:funcall-after-idle-timeout, which calls a function after a specified idle time, should not be used.
  13. Documentation for load-compiled corrected. The function load-compiled, when first implemented, compiled a file but did not write a fasl file. That was changed some time ago so load-compiled is a roughly equivalent to the :cload top-level command (compiling and loading file). The documentation has been corrected.
  14. Enhancement to The first argument to, the server specification, can now specify an alternate transport mechanism, instead of the usual SMTP network protocol. See for details. The patch implementing this cahange was released in early November, 2013.
  15. Some MySQL changes. A new client-flags keyword argument to connect was added to 8.2 in a patch but was not documented in either the 8.2 or 9.0 documentation until now. A patch released in early August, 2013, modified the behavior of the host keyword argument to connect, which can now be a list. insert-db now has an on-dup-keys keyword argument improves handling when the insert tries to insert a row with the same values in key columns as an existing row. Also, some support for stored procedures has been added. See MySQL and stored procedures in mysql.htm.
  16. A patch released in late Jult, 2013 implements a major jLinker upgrade. A major patch release of jlinker (version 7.1) adds several new features. The patch consists of Lisp code in a new fasl file and Java code in a new jar file. New features include connection pooling, better socket handling, and improved error hierarchy. A number of functions have been modified, but all modifications are backward compatible. See jlinker.htm for a complete discussion of the patch. The patch is for version 9.0 only. It does not apply to earlier releases.
  17. New regexp patch fixes some replace-re behavior and enhances match-re. A bug in replace-re caused handling of BOS and EOS markers incorrectly. So (replace-re "abc abc bc" "^abc\\s+" "_") would return "__bc" rather than "_abc bc". Also, (replace-re "abc def " "def$" "_" :end 7) would return "abc _ " rather than "abc def ". This has been fixed and the correct values are now returned. As part of the change, match-re has additional keyword arguments start-unbounded and end-unbounded. The behavior of match-re is unchanged if the new arguments are not specified.
  18. Better control over proxies in Aserve. If you allow proxies in AllegroServe, you may open a security hole. Proxies, which before were general, can now be restruicted to specific machines using the new proxy-control object, if desired. See the Proxy section in the the AllegroServe documentation for details.
  19. The profiler may now be included in runtime images (except those created by Allegro Express).
  20. New jlinker-init keyword argument: :end-function. The value of the end-function keyword argument to jlinker-init should be a function called when a jlinker connection is terminated. The function gets a single argument, the jlinker connection instance. Added by a pacth released May 1, 2013.
  21. All nicknames removed for the excl package. This was done when 9.0 was released but we neglected to document it. The nicknames were excl, franz, and stream. In fact, it is illegal for a package nickname to be the package name (so excl was removed). The other two names (which were added when the symbols in those packages were merged into the excl package) were removed so that they would not appear as qualifiers to excl symbols when excl:*print-nickname* is true. This is a backward incompatible change. Users who depend on stream or franz as nicknames can add them back using rename-package if desired. This item is repeated below in Section 7.2 Non-backward-compatible changes in the base Lisp.
  22. regexp patch fixes some bugs, changes split-re behavior. WARNING: some changes result in changed behavior (nil might be returned instead of (""); some forms no longer signal errors).. A patch released in February, 2013 fixes some regexp bugs and changes the behavior of split-re to match PERL behavior. split-re now has a limit keyword argument; it not longer errors when the regexp argument matches the empty string; and trailing empty fields are removed. See regexp.htm and also the description of split-re, where we have examples of the changes.
  23. New ability to dump virtual images on Windows. See Virtual dumplisp: for very large images and pseudo-forks on Windows
  24. We have revised the regexp.htm and have removed the discussion of the older regexp module (which is still maintained for backward compatibility, and individual functions are still documented in the operators pages)). All new code should use the regexp2 module described in regexp.htm.
  25. text-line does not work on file streams. The common-graphics:text-line function only works on text-edit-panes and multi-line-editable-text widgets. It does not work on file streams. The documentation has been updated to make that clear.

4.0 Fasl files are not-compatible between versions and operating systems

4.1 All pre-9.0 Lisp compiled files must be recompiled (old fasl files will not load)

fasl files (compiled Lisp files) created by releases of Allegro CL prior to 9.0 will not load into Allegro CL 9.0. All such files must be recreated by compiling the associated Lisp source files. An error will be signaled if Lisp attempts to load an older, incompatible fasl file.

4.2 Fasl files may be incompatible in different Lisps on same hardware

Fasl files created on Windows x86 cannot be loaded into Linux or FreeBSD x86 Lisps

The Windows and UNIX operating systems are too different. However, FASL files (for the same Lisp version) can generally be shared between different UNIX operating systems on the same hardware. The general principles are as follows. Note that incompatibility may creep in for reasons outside our control. If fasl files are incompatible, recompile on the target machine.

Fasl files will usually be compatible between platforms when:

It is up to the user to ensure that there are no os-specific dependencies, or that features (i.e. #+/#- ) did not cause essential code to be excluded or extraneous code introduced that would cause a problem on the crossed architecture.

5.0 Release Notes for installation

  1. Version 9.0 uses the 8.2 installation procedure: Installation is described in installation.htm.
  2. The distribution includes 8 bit and 16 bit character images (this information is repeated from earlier Release Notes). Allegro CL has images that support 8 bit characters only, or 16 bit characters only. It is our expectation that most users will use the 16 bit images. Executables supplied with the distribution either have or do not have `8' in the name. Those with 8 in the name (mlisp8 and alisp8, e.g.) support 8 bit characters. Those without a number in the name support 16 bit characters. Image (dxl) files also come in 8 and 16 varieties. Again, 8 in the name means 8 bit character support. Character support for images and executables must match. Trying to start an executable with the wrong type of image fails.
  3. No prebuilt Allegro Composer images in the distribution (this information is repeated from earlier Release Notes). To create an Allegro Composer image, start Allegro CL and load That will produce composer and composer.dxl, or composer8 and composer8.dxl. Allegro Composer is available on Unix only.
  4. No prebuilt Allegro CLIM images in the distribution (this information is repeated from earlier Release Notes). To create a CLIM image, start Allegro CL and load That will produce clim and clim.dxl, or clim8 and clim8.dxl.

6.0 Release notes for specific platforms

Allegro CL 9.0 is known to work with the following minimal operating system versions. Allegro CL 9.0 runs on all operating system versions released (not in beta or pre-release form) January 1, 2012. Allegro CL is tested with new OS versions as they are released (but not pre-release of beta versions). Unless there is a note in a subsection below, Allegro CL can be assumed to work on newer versions, including those released after that date.

Because Ubuntu no longer supports 32-bit libraries, 32-bit Allegro CL requires special action. See Getting 32-bit Allegro CL to run on 64-bit Ubuntu for more information.

64-bit platforms

32-bit platforms

6.1 Required versions of OpenSSL needed for the :ssl module

The :ssl module, when loaded, finds the newest installed version of OpenSSL libraries on your machine and loads them. See Secure Socket Layer (SSL) in socket.htm for information on how OpenSSL libraries are found and loaded.

If you load foreign libraries which themselves use OpenSSL, either in a development image or in a delivery (application) image, those libraries must be compatible with the version of OpenSSL used by the :ssl module. If they are not, the :ssl module cannot be used.

The current supported version of OpenSSL is 1.0.x.

6.2 macOS notes

Allegro CL 9.0 is only supported on macOS version 10.6 or later. It is not supported on versions 10.5 or earlier.

Common Graphics and the IDE are now supported on macOS but are not supported on the SMP version on the Mac. See Section 9.1 Common Graphics and the IDE on the Mac for more information. Both the IDE and CLIM require certain tools (X11, GTK, Open Motif) which may have to be installed separately. See Installation on macOS in installation.htm for details.

The Runtime Analyzer (see runtime-analyzer.htm) does not work properly on the 64-bit macOS port (there is no problem on the 32-bit port).

Building shared libraries on macOS

Building shared libraries on macOS in foreign-functions.htm describes how to create a shared library suitable for loading into Allegro CL. We have determined that the -flat_namespace to the ld used to create the shared library is necessary, as shown in the linked section.

6.2.1 Allegro CL must be updated to work with macOS 10.10

Allegro CL updates are required to use Allegro CL 9.0 with macOS 10.10. Please see Updating for macOS 10.10 in installation.htm for information.

6.2.2 Installing Mavericks OS (macOS 10.9) may break X11

We have had reports that installing the Mavericks OS on Macs (Mavericks is macOS 10.9) causes X11 to be stop working properly. The symptom is blank rectangles in Common Graphics applications (including Gruff). X11 is necessary for the IDE, CLIM, and Allegro Composer. To fix the problem, install the latest version of XQuartz (available from after installing Mavericks (regardless of what version, if any, was installed before installing Mavericks).

6.2.3 Installing Mountain Lion OS (macOS 10.8) may uninstall X11

We have had reports that installing the Mountain Lion OS on Macs (Mountain Lion is macOS 10.8) causes X11 to be uninstalled, and does not itself include X11. X11 is necessary for the IDE, CLIM, and Allegro Composer. If you find X11 uninstalled (so it is no longer in the Utilities sub-folder of the Applications folder, you can reinstall it by downloading and installing XQuartz.

If you have an older version of macOS and need to install/reinstall X11, install it from your installation medium.

6.3 Heap start locations

When building large new images, it is often useful to specify Lisp Heap and C-heap start locations. See the discussion of the lisp-heap-start and c-heap-start keyword arguments in Arguments to build-lisp-image 2: defaults not inherited from the running image in building-images.htm. Here are the initial locations (called `bases') in Allegro CL 9.0 as delivered. Values are Hexadecimal integers.

Operating System Lisp base C base
FreeBSD 0x40000000 0xa0000000
Linux (x86) 0x20000000 0xa0000000
Linux (AMD64) 64-bit 0x1000000000 0x2000000000
macOS 32-bit 0x10000000 0x74000000
macOS 64-bit 0x1000000000 0x2000000000
Windows 32-bit 0x20000000 0x54000000
Windows 64-bit 0x100000000 0x200000000
Solaris 32-bit 0x4000000 0x54000000
Solaris 64-bit 0x1000000000 0x10000000000
Solaris (AMD64) 64-bit 0x1000000000 0x10000000000

7.0 Release Notes for the base Lisp

This main section contains three subsections (which have additional subsections): one on new features (Section 7.1 New features in the base Lisp), one on changes which are not backwards compatible and so may require code changes, (Section 7.2 Non-backward-compatible changes in the base Lisp), and one on miscellaneous changes (Section 7.3 Other changes to and notes about the base Lisp).

7.1 New features in the base Lisp

Full SMP support is added for the Windows, Linux, and Mac platforms (but not on Solaris or FreeBSD). This is the major new feature. Non-SMP distributions are also provided for all platforms. See smp.htm.

7.1.1 Features added to Allegro CL 8.2 after the initial release of Allegro CL 8.2

This section describes features added to Allegro CL 8.2 after its initial release (about which users may be unfamiliar). All are part of the 9.0 release.

Major update to AllegroServe

A new version of AllegroServe, version 1.3.1, has been released. It is available from github ( or as a patch for Allegrop CL 8.2. Of particular importance are automatic compression and inflation of files, chunking support, and new choices for security, including the TLS v1.0 (also called SSL v3.1) protocol for secure communications. See aserve/aserve.html, which is the AllegroServe documentation.

The changes include:

  1. New compression and chunking support on AllegroServe. AllegroServe can now compress responses on the fly if requested. Aserve's client code can request a compressed transfer and can uncompress the result. Further, In the past AllegoServe disabled chunking for an SSL server and told users to use the http/1.0 protocol for clients when SSL was being used. Now those restrictions are gone. The default for the server will be to use chunking in all cases and clients can specify http/1.1 for requests over SSL. See documentation (aserve/aserve.html) for API changes related to these new features.
  2. Security options. net.aserve:start and net.aserve.client:do-http-request have a :ssl-method keyword argument which can be used to specify v2.0, v3.0 or TLS v1.0 (SSL v3.1) communication protocols. Specifying :tslv1 means that you only want to communicate using TLS v1.0 (SSL v3.1), the most modern and secure of the protocols.
  3. Delay sending headers for computed entities. Errors can occur when running the computed entity function. When an error occurs one would like to send back a different response such as '500 - Internal Server Error'. In order to make this possible the http response code and the headers that follow that are not immediately sent back to the server when with-http-body starts. Instead they are held in request-reply-stream and are only sent when the computed entity function sends data to the stream. Thus if you do computation before sending any data you can avoid having any response sent to the client until the computation finishes.
  4. publish-directory can accept a list of destinations. When a request comes in publish-directory will search one or more directories for the requested file.
  5. Other AllegroServe changes. (1) The :keep-alive arguement to do-http-request will now cause do-http-request to return a fifth value: a socket connected to the server. That fifth value will be nil if the server refuses to keep the connection with the client open. Even if the server agrees to keeps the connection alive it will close it after some period of inactivity. (2) do-http-request takes a :connection argument which is how the socket returned by do-http-request should be passed to the next do-http-request call. It is ok if the value of the :connection argument is nil or closed socket. do-http-request will notice that the socket is unusable and will create a new one. See documentation (aserve/aserve.html).

jLinker revision patch removed

A jLinker patch released in April, 2011, has been withdrawn. If you downloaded the patch, doing a further update will revoke it. It was decided that the changes could not be accomodated in deployed applications. The changes will be re-introduced in release 9.0.

We have further revised jlinker.htm and the documentation of jlinker-init in light of removing the patch.

Major changes to the Allegro CL interface to the Amazon Elastic Compute Cloud (EC2), some incompatible

The Amazon Elastic Compute Cloud (EC2), described in ec2.htm has had a major revision, with support now provided for regions. The changes are described at the beginning of ec2.htm. Note that some changes are incompatible: some argument lists have changed, a number of variables have been removed, defaults for some arguments are changed, and so on. There is also much new functionality.

Other changes since the release

7.2 Non-backward-compatible changes in the base Lisp

  1. All nicknames removed for the excl package. This was done when 9.0 was released but we neglected to document it (we added this item is a doc update). The nicknames were excl, franz, and stream. In fact, it is illegal for a package nickname to be the package name (so excl was removed). The other two names (which were added when the symbols in those packages were merged into the excl package) were removed so that they would not appear as qualifiers to excl symbols when excl:*print-nickname* is true. This is a backward incompatible change. Users who depend on stream or franz as nicknames can add them back using rename-package if desired. This item is repeated above in Section 3.0 Information on changes and new stuff since the 9.0 release.
  2. Significant changes, many non-backward-compatible, changes to the Amazon Elastic Compute Cloud (EC2) interface. See ec2.htm for details. The release notes for the changes are at the beginning oif that document.
  3. The asdf module does not autoload. Users need to evaluate (require :asdf) to use it.
  4. delete, delete-if, delete-if-not, and delete-duplicates and in-place deletion. Certain deletion operations on vectors by delete, delete-if, delete-if-not, and delete-duplicates modified the vector in place, and so some programs, aware of this, might use the argument vector rather than the result vector (that is, might assume the result vector is the argument vector modified rather than a new vector). However, in a SMP Lisp (and, in fact, but rarely in a non-SMP multiprocessing Lisp), multiple threads traversing the vector simultaneously while one deletes elements could cause heap corruption and so a new variable, *delete-in-place*, specifies whether deletion in place is allowed. The initial value of this variable is nil in SMP Lisps (meaning in-place deletion is not allowed), so the argument vector is never the same as the result vector in that case. Code which assumed it was the same can now fail. See cl:delete, cl:delete-if, cl:delete-if-not, cl:delete-duplicates: multiprocessing issues in implementation.htm for more information.
  5. *cl-default-special-bindings* replaced by *required-top-level-bindings* and other changes to process initialization and bindings. *cl-default-special-bindings* has been renamed *required-top-level-bindings*. A new variable *required-thread-bindings* provides bindings for all threads. New macros required-thread-binding and required-top-level-binding add to the alists which are the values of those variables. Processes and their dynamic environments (both models) in multiprocessing.htm and Setting global variables in initialization files in startup.htm have been updated to reflect these changes.
  6. The debugger API has some keyword arguments changed to optional arguments, and other API changes. The debugger API, described in debugger-api.htm has new (and incompatible) argument lists for db:oldest-frame and db:output-frame: they arglists used to have both optional and keyword argument and now just have optional arguments. Also, there is a new function db:newest-frame. And most single-letter argument names (like p and e) now have descriptive names (like process and environment) though that change does not affect the interface since the arguments are in all cases required or optional. See debugger-api.htm for details.
  7. with-output-to-buffer has modified argument list. To make it more like with-output-to-string, the buffer argument to with-output-to-buffer is now an optional argument rather than a leyword argument. Further, the behavior when no value is supplied for the buffer argument is different: before it was equivalent to specifying nil and resulted in a bit bucket being used (so the number of characters written was available but not the characters themseleves). Now unsupplied means create an actual buffer which extends when needed and whose contents are available with get-output-stream-buffer. Specifying nil has the same meaning as in earlier releases.
  8. Some command-line arguments now start with -- rather than -. --ee, --qq, --backtrace-on-error, --batch, --kill, --locale, and --compat-crlf. See Command line arguments in startup.htm for a list of command-line arguments. The single - versions still work but are not longer documented and will likely be removed in a later release.

7.2.1 New features in Allegro CL 9.0

  1. New Idy5 compiler message notes that a dynamic-extent declaration is ineffective. See this section of compiler-explanations.htm. The message appears when there is a dynamic-extent declaration but it is ineffective because declarations are not trusted.
  2. def-foreign-call now has :documentation keyword argument. (setf documentation) works works on foreign functions but this new feature allows specifying the documentation without writing a wrapper function. See ff:def-foreign-call.
  3. New gensym variant excl:gen-sym. excl:gen-sym is identical to cl:gensym except that a symbol is accepted as its optional argument, in which case the symbol-name is used. This is useful for programs that are intended for use in either ansi or modern lisps, where it is desired to print any gensyms without requiring escapes.
  4. with-staged-output and synchronized-output-stream-p allow coordination when writing to a stream. synchronized-output-stream-p (which is setf'able) determines whether a stream is marked as suitable for synchronized output. with-staged-output then ensures output is staged. Most built-in output functions are called in the body of with-staged-output.
  5. New functions peek-byte and unread-byte. peek-byte resembles peek-char except it peeks at a single byte rather than a character. unread-byte similarly resembles unread-char except it unreads one byte rather than one characters. See peek-byte and unread-byte in streams.htm for a general discussion of these functions.
  6. New compiler switch enforces optimal branch alignment on 64-bit x86 platform. align-branch-targets-switch, when true, tells the comnpiler to optimally align code branches on 64-bit x86 platform. Ignored on all other platforms.
  7. New tester macro, variable useful for testing in SMP. Allegro CL provide a test harness described in test-harness.htm. While there has always been issues when testing in a multiprocessing environment, in a non-SMP Lisp these were fairly insignificant. They are more serious in an SMP Lisp, so changes have been made to better manage the tester. These include a new macro to use when incrementing results, inc-test-counter; a new variable which controls whether output should be labeled by thread, *test-report-thread*; and locking to avoid intermixed tester output mesages. See Running tests in multiple threads (Lisp processes) in test-harness.htm for more information.
  8. yes-or-no-p and y-or-n-p now have better default format control strings. yes-or-no-p and y-or-n-p previously had empty default control strings. Now the defaults are "(Yes or No)? " and "(Y or N)? ".
  9. Change to package locking. Package locking is described on Package locking and package definition locking in packages.htm. Packages locked against definitions used to accept new definitions only if the name of *package*, or any of its nicknames, was on the locked package's implementation-packages list. Definitions will still be accepted in these cases, but will also be allowed if *package* is eq to the locked package.

7.3 Other changes to and notes about the base Lisp

  1. New queue keyword argument to schedule-finalization, new function call-finalizer. schedule-finalization, which allows defining a function to be called when an object becomes garbage, has a new queue keyword argument. If non-nil, it must be a queue object. When the object is marked as garbage, instead of running the finalization function, the system will place a finalizer object, which is a list of the finalization function and the object, on the queue. It is then the responsibility of the program to apply the function call-finalizer to that list at some later time.
  2. New HMAC functions for MD5 and SHA* encoding support. See the new hmac-init, hmac-string, hmac-update, and hmac-final which handle SHA* digest algorithms. See MD5, SHA1, HMAC, RC4, and other encoding support in miscellaneous.htm for more information.
  3. New general functions for MD* and SHA* encoding support. Various new encoding algorithms are now supported, inlcuding MD2, MD4, MD5, SHA1, SHA256, SHA512, and RMD160. There are new functions digest-init, digest-update, digest-final, digest-string, and digest-file which encode and support all those formats. They are similar to the existing md5-* and sha1-* functions, with the same arguments, except digest-init, digest-file, and digest-string have a name required argument to specify the encoding format being used). See MD*, SHA*, HMAC, and other message digest support, and RC4 cypher functions in miscellaneous.htm for more information.
  4. Expanded #A reader macro, new variable *print-simple-array-specialized*. The standard #A template is expanded from #nAdata to #{n}A{t}data where the n is optional (defaulting to 1) and t can specify the element type it is one of unsigned byte 4, 8, 16, 32 or 64, or signed byte 8, 16, 32, or 64. See The #A reader macro in implementation.htm for details. The printer will use the new template when appropriate when the variable *print-simple-array-specialized* is true.
  5. user-homedir-pathname and username-to-home-directory documentation about behavior on Windows corrected. cl:user-homedir-pathname and excl:username-to-home-directory were incorrectly documented in 8.2. The documentation has been corrected. (Essentially, the current user's home directory is returned in all cases, and that is discovered from the HOMEDRIVE and HOMEPATH environment variables, or, failing that, from the HOME environment variable. #P"C\\" is returned if none of those environment variables have valid values.) The behavior of cl:user-homedir-pathname on Windows is discussed in What user-homedir-pathname does on Windows in implementation.htm.
  6. get-output-stream-buffer now returns a second value. get-output-stream-buffer now returns the number of elements written to the buffer as a second returned value.
  7. excl:uncompile and cl:function-lambda-expression succeed in more cases. Both may succeed when source level debugging information is stored (here succeed means returning a non-nil first value for cl:function-lambda-expression and actually uncompiling the function for uncompile). See uncompile and cl:function-lambda-expression in implementation.htm for more information.
  8. The :local and :set-local top-level commands have a raw option, :r. This option displays locals in raw mode. See :local for a discussion of this mode. :set-local allows values to be set in raw mode.
  9. Previously undocumented :x option to :local top-level command causes numbers to be displayed in hexadecimal. This option actually existed in earlier releases but was not dicumented. See :local.
  10. There is now CRL (certificate revocation list) support in the SSL (secure socket layer) implementation. See make-ssl-client-stream and make-ssl-server-stream.
  11. make-ssl-server-stream now has a prefer-server-cipher-order keyword argument. When choosing a cipher during an SSLv3 or TLSv1 handshake, normally the client's preference is used. However, if the new prefer-cipher-server-order keyword argument to make-ssl-server-stream is non-nil (the default is nil), the server's preference will be used instead.
  12. mapped-file-simple-stream has new release-handle option to open. The mapped-file-simple-stream class can now be opened with its handle released upon openning so the handle is available for other uses. See the release-handle option.
  13. New arguments to def-foreign-call to control garbage-collections while foreign code is running. The new arguments to def-foreign-call are allow-gc and release-heap-implies-allow-gc.
  14. add-signal-handler has new delayed-interrupts keyword argument. If the delayed-interrupts keyword argument to add-signal-handler is true, the handler be run in a with-delayed-interrupts, else it will be run with interrupts enabled.
  15. New function mp:process-queue-interrupt. The new generic function mp:process-queue-interrupt is like mp:process-interrupt but calls the interruptions with with-delayed-interrupts being in effect which guarantees order of arrival processing.
  16. The pid argument to excl.osi:getsid is now optional. See excl.osi:getsid. The default value is 0.
  17. New exit-on-missing-shared-library keyword argument to build-lisp-image. This new argument to build-lisp-image causes the new image to exit with a non-zero exit status after printing an appropriate error message if a shared library cannot be found.
  18. The time macro now reports page faults. The general description of the time macro is in the ANS.
  19. Additional keyword argument to excl.osi:find-in-path. If the executable keyword to find-in-path (ignored on Windows) is non-nil, then only matches of files that have execute bit set in their mode are returned.
  20. New command line argument --debug-startup. --debug-startup prevents errors from being handled automatically by -L, -e, --ee and init file processing. Instead, errors land in the debugger unless --batch is also specified. See Command line arguments in startup.htm for a list of command-line arguments.
  21. New Windows-only command line arguments +left, +top, +width, +height. These specify the position and size of the console window. See Command line arguments in startup.htm for a list of command-line arguments.
  22. New variable sys:*zlib-system-library*. The value of sys:*zlib-system-library* is the name of the gzip library used by the deflate module. See Support for gzip compression and decompression in miscellaneous.htm.
  23. Use of cltl1 package is deprecated. The compiler-let special operator has been moved to the excl package. Use of other functionality in the cltl1 package should be avoided. The cltl-1 module is no longer autoloaded.
  24. New :direction keyword argument to dbi:bind-parameter. This argument allows specification of the direction of the parameter in a call to dbi:bind-parameter.
  25. def-function-spec-handler has new :defunable operation. The value is a boolean indicating whether defun can be used on this function-spec. See def-function-spec-handler.

7.4 Multiprocessing and SMP release notes

Because SMP is the major addition to Allegro CL 9.0 on the Windows, Linux, and Mac platforms. Consequently multiprocessing in Allegro CL has changed, we group all SMP and multiprocessing release notes into this section.

  1. Atomic update routines will work on any symbol. In the initial implementations of SMP, only symbols defined with defvar-nonbindable were suitable as places for atomic update operators like push-atomic. This is not longer true. Any symbol can be used as such a place. defvar-nonbindable is therefore no longer associated with atomic updates but is retained because it may be useful for other purposes. (This item was added after the initial release of the 9.0 documentation.)
  2. with-shared-lock, with-exclusive-lock, and sharable-lock-lock have new recursive-p argument and return different values. The operators with-shared-lock, with-exclusive-lock, and sharable-lock-lock, added with a patch in 8.2, have new return values and have a new argument, recursive-p. See the descriptions for details.
  3. make-sharable-lock has new argument constructor, recursive-p argument can have new values. See the description of make-sharable-lock.
  4. New mp:condition-variable class. A condition-variable provides another way to synchronize the behavior of multiple threads. See Condition Variables in smp.htm.
  5. New macro with-sharable-lock. with-sharable-lock is similar but more powerful than with-shared-lock.
  6. New generic function mp:process-join. mp:process-join suspends the current process until the process thread of another process exits. This is a bit more complicated than it sounds (processes can be associated with more than one thread, so the question is, which is meant), as noted in the documentation.
  7. New generic function lockedp. lockedp tests whether a lock is held.
  8. New generic function process-lockedp. See process-lockedp.
  9. time macro reporting of new space additions. In the statistics reported by the garbage collector, the new-copied number is now the net copied to newspace. When multiple sequential scavenges are required, the number reported represents the amount copied into newspace by the last scavenge, not the total copying done by all the scavenges.

7.5 Base Lisp platform-specific information

There are no entries at this time. Information may be placed here in documentation updates after the initial Allegro CL 9.0 release.

8.0 Release Notes for CLIM

The CLIM manual has not been updated (other than minor corrections) for the 9.0 release. There have been no significant changes to CLIM functionality compared to 8.2, though there have been bug fixes and performance enhancements.

9.0 Release Notes for Common Graphics and the IDE

Common Graphics and the IDE are supported on Windows SMP Lisp but are not supported in SMP Lisps on the Mac and Linux. They are supported in the non-SMP Lisps on Windows, Linux, and the Mac (the same platforms on which they were supported in release 8.2).

The first subsection describes changes to Common Graphics and the IDE that are non backward-compatible. Please review this section and make whatever necessary changes to your code to obtain the desired behavior in release 8.2.

The second subsection describes other changes to Common Graphics and the IDE. These should not require code changes (please tell us if any do, because that may indicate a bug), but note that certain function and argument names have been deprecated in favor of new names, and that new code should reflect these changes, and old code should be revised at some point.

The section Section 9.5 IDE release notes and its subsections provide information about the IDE.

9.1 Common Graphics and the IDE on the Mac

Common Graphics and the IDE and available on the Mac but only on the non-SMP Lisp. You must run X11 (it is in the /Applications directory and comes with recent versions of macOS and is usually installed by default on 10.6, but see Installation on macOS in installation.htm for full details). Usage is like that on Linux. See cgide.htm for details.

These are known problems using CG and the IDE on the Mac:

  1. Parenthesis-matching marks are drawn on pop-up windows. They cannot be drawn directly on a lisp-edit-pane, so instead a pop-up window (which otherwise looks like it is drawn directly on the pane) is displayed. See *show-parenthesis-matches-as-pop-up-window*, which must be set to true, as it is initially on macOS, and also *parenthesis-match-pop-up-milliseconds*.
  2. No annotations in form windows when designing dialogs. The annotations include widget resizing handles and alignment lines.

9.2 Significant changes in Common Graphics

9.3 Non-backward-compatible changes in Common Graphics

  1. draw-rounded-box and fill-rounded-box have smaller corners. Rounded box corners on GTK are smaller than in 8.x, but now match beheavior on Windows. See draw-rounded-box and fill-rounded-box.
  2. Variables dst, ds~t, d~st etc. renamed. The exported constant symbols like dst and ~d~st for paint operation bit flags have been renamed to po-dst and po-~d~st, etc., to avoid errors in apps that use a local variable named dst.

9.4 Other changes in Common Graphics

  1. New grid-widget functions determining which subsection gets keyboard focus. The new generic functions are focus-row-section, focus-column-section, and focus-subsection. See grid-widget for general information on grid widgets.
  2. New class-grid property horizontally-scrollable. The horizontally-scrollable property of a class-grid specifies whether the user can interactively scroll a class-grid horizontally, to bring other grid columns into view.
  3. New properties to control whether a grid-section scrolls when the user drags a grid-subsection to a new position among its siblings. scroll-parent-section-while-dragging controls whener scrolling happens and scroll-parent-section-distance controls the scroll increment. See also grid-widget for general information on that widget.
  4. Several new functions for manipulating outline-items. These new generic functions have been added for progammatically manipulating outline-items on outline widgets: select-on-typing, move-up-one-outline-item, move-down-one-outline-item, hide-outline-item-children, show-outline-item-children, outline-item-removed, outline-item-added, outline-items-reordered, remove-outline-item, add-sibling-outline-item, add-child-outline-item, and shift-outline-item.
  5. New configuration option delay-pop-up-menus-until-mouse-buttons-up. delay-pop-up-menus-until-mouse-buttons-up, when true, delays the appearance of a pop-up menu until all mouse buttons are up. Its initial value is nil on Windows but true on GTK (Linux and Mac). On GTK, we have not found a way to prevent a mouse button release event from selecting an item on a pop-up menu that was invoked while a mouse button is down. That behavior can lead to the user not seeing the menu altogether, or even selecting an arbitrary item if the menu is placed under the mouse cursor but does not appear until the mouse button has already been released. That does not happen when the value of this new option is true.
  6. New function set-console-exterior on Windows only. The function set-console-exterior allows you to set the size and location of the console Window if there is one. This is a Windows-only function.
  7. ask-user-for-new-or-existing-directory and ask-user-for-directory have some new arguments. ask-user-for-directory now has a include-edit-box keyword argument (adds a text-entry widget to the dialog) and a new-dialog-style keyword argument (use the new MS style for the dialog). ask-user-for-new-or-existing-directory has a new special-folders keyword argument (allows specifying special Windows folders like My Documents). See the descriptions of ask-user-for-new-or-existing-directory and ask-user-for-directory for full details.
  8. New macro with-cg-bindings. with-cg-bindings allows establishing the Common Graphics variable bindings in an existing process where it is not feasible to pass *default-cg-bindings* at process creation time.
  9. window-message now returns a meaningful value. window-message returns t if the message was displayed in some status bar (either that of the argument window or an ancestor of the argument window) and returns nil otherwise.
  10. set-paragraph-format limited to 32 tab stops. This is a Windows limitation. The number of tab stops is specified by the tabs keyword argument to set-paragraph-format. Previously specifying a value greater than 32 would cause an error. Now values greater than 32 are treated as if 32 were specified. Specifying nil removes all tab stops.
  11. New outline control properties: ancestor-background-color and highlight-ancestors. these properties control whether an outline widget will draw the background of each ancestor outline-item of the currently selected item in a different color.
  12. select-on-multiple-characters and select-on-multiple-characters-time-limit now are properties of outline widgets, along with new properties select-on-multiple-characters-item-test and select-on-multiple-characters-callback. See select-on-multiple-characters, select-on-multiple-characters-time-limit, select-on-multiple-characters-item-test, select-on-multiple-characters-callback and outline.
  13. New validate-edited-slot-value method allows validation of new slot values in object-editors and class-grids. The new method validate-edited-slot-value can be used with object-editors and class-grids to validate input.
  14. pop-up-string-dialog and ask-user-for-string have new cursor-at-end argument. This specifies whether the cursor should be placed at the end of the string to be modified (allowing for easy extension) or the beginning (easier for replacing). See pop-up-string-dialog and ask-user-for-string.
  15. pop-up-menus-for-many-sorted-choices has new case-insensitive and on-help keyword arguments. The new case-insensitive keyword argument to pop-up-menus-for-many-sorted-choices allows specifying whether or not choices starting with the same letter, but some lowercase and some upper, should be grouped together. The new on-help argument allows you to specify a function which may be used for displaying status bar messages as the user highlights individual menu items.
  16. pop-up-lettered-menu has new stream and on-help keyword arguments. The new stream argument to pop-up-lettered-menu is either the screen or else a window that will serve as the owner of the pop-up menu. The new on-help argument allows you to specify a function which may be used for displaying status bar messages as the user highlights individual menu items.
  17. New printer-class keyword argument to with-output-to-printer. with-output-to-printer now has a printer-class keyword argument which allows you to specify a subclass of cg:printer as the type of stream to instantiate, if desired.
  18. New outline widget property lines-of-padding. The lines-of-padding property of outline widgets specifies how many items should be in view around a selected outline-item

9.5 IDE release notes

The IDE is supported on the Windows SMP Lisp. It is not supported in the Mac or Linux SMP versions of Allegro CL 9.0. It is supported in the non-SMP version of those platforms.

The non-SMP version runs on one hardware processor at a time, and corresponds to earlier versions of Allegro CL.

  1. The :runtime-bundle build-flag is now included in the initial build-flags value. See ide:build-flags.
  2. Class Interface Editor dialog changes. The Class Interface Editor has been enhanced to make the properties that you can specify interactively for a class-grid be more nearly complete]
  3. The Inspect now shows package names of slot values.
  4. New checkbox on Find in Files dialog to specify whether subprojects should searched. The Search Subprojects Later checkbox, when checked while searching a project, causes the entire project hierarchy to be searched. When unchecked, only the top-level project is searched. See the Find In Files dialog.
  5. Revised Include Subdirectories checkbox on Find in Files dialog. The Include Subdirectories checkbox is now labeled Include Subdirectories or Subprojects and controls searching subprojects when searching a project. See the Find In Files dialog.
  6. ide:shift-windows-onto-screen-at-startup now works on the single parent window. ide:shift-windows-onto-screen-at-startup will move the single parent window (which contains all IDE subwindows when ide:use-ide-parent-window is true) into view. Its behavior when ide:use-ide-parent-window is false is unchanged.
  7. New functionality for using Unicode in text files. New configuration options and other operators allow better handling of Unicode text on Windows. See compile-files-as-utf8, external-format-for-saved-files, external-format-for-save, *use-unicode-winapi-for-cg*, automatic-font-changing, dual-fonts-for-languages, ide:ide-auto-font-changing, ide:ide-dual-fonts-for-languages, write-bom-to-utf8-files, and load-utf8-if-no-bom.
  8. New Inspect Dialog option 'Inspect Sorted Copy'. This option appears on the Inspect dialog when inspecting a list or a vector. If chosen, a new sequence copied from the inspected one and sorted by print name is inspected. This may make finding items in long sequences easier.
  9. File | Build Project Exe now File | Build Project Executable. The Build Project Exe item ion the File menu is now File | Build Project Executable. We wish to make clear the command does more than create a single exe file.
  10. New IDE option find-in-files-show-html-files-in-browser. If the IDE configuration option ide:find-in-files-show-html-files-in-browser is true (its initial value) then HTML files (as determined by the file type) will open in a browser rather than an editor buffer.
  11. New IDE option find-in-files-file-list-portion. If the IDE configuration option ide:find-in-files-file-list-portion allows users to specify the proportion between the heights of the two lower widgets in the Find In Files dialog, which list the files that have matches followed by the matching lines in the selected file.
  12. Stepper dialog now has yellow highlighting for code which has limited information. The Stepper Dialog highlight code being stepped through. Green menas source code debugging info is available, orange means you are stopped at a macro form, etc. Now yellow is a possible highlight color and means you can do a Step Into to step through the function that is being called on that step, though no source debug info is known for the function that is being entered and so it will be stepped through at the assembly language level.
  13. New command on Run menu: Show Definition in Stepper Dialog. The menu command Show Definition in Stepper Dialog on the Run menu displays the source code of the selected function or method in the Stepper Dialog and allows you to set breakpoints inside the definition without breakpointing the entrance to and exit from the function.
  14. New project property concatenate-project-fasls. The project property concatenate-project-fasls, when true, causes all project fasl files to be concatenated into a single fasl file. This property can be set with setf or with the Concatenate Project Fasls check box on the Options tab of the Project Manager dialog.
  15. Finer control of opening files in Emacs from the IDE. The function ide:open-files-in-gnu-emacs allows you to specify that the File | Open command should open files in an Emacs buffer rather than an IDE editor buffer. If you make the value of that property :open-only, the File | Save All menu command will not save Emacs buffers. If the value of the property is any other true value, File | Save All will save all unsaved Emacs buffers.
  16. Improved type-ahead in IDE listeners. Typing ahead in an IDE listener while an evaluation is happening will now echo the characters at the end of the text as you type them, rather than only after the evaluation is complete. Any printing that's done to the listener will always be sent to the end of the listener's text rather than to the text cursor position.

9.5.1 Opening projects from releases prior to 9.0

Allegro CL 8.2 projects should open without problem in Allegro CL 9.0.

9.6 Functionality to handle differences between Windows and GTK

For complete information on the differences between Windows and GTK, please see cggtk-relnotes.html.

Common Graphics and the IDE run on Windows and Linux with GTK. Certain differences between the two operating systems and windowing systems mean that some things do not work the same in Windows as in GTK and vice versa. The functionality listed here tries to handle the differences. Some of the variables/operators/etc. are only available on one of the two platforms.

Known bug with menu-items and buttons

GTK Only: all-black menu-items and half-black buttons. There is still a mystery on the GTK platform where all button widgets can turn half black along a diagonal line, and all menu-items on some platforms will be totally black. This seems to happen only when opening a project from the Startup Action dialog, though, so a workaround is to not reopen a project from that dialog and instead to use the Recent menu or File | Open Project just afterward. We have tracked the problem down to the use of transparent-pane windows such as the frame-child of a form window, but beyond that it is a total mystery.

Event handler processes

Because Linux currently does not use native threads and Windows does, on Windows, all windows handle events in their own thread associated with the window while on Linux/GTK, there is one event-handling thread. default-application-window-subkey, *use-single-cg-event-handling-process*, and *single-cg-event-handling-process* allow distinguishing behavior when necessary. cg-process-wait should be used on GTK instead of process-wait in event handlers. See also process-pending-events-if-event-handler.


The with-message-window window is now a frameless-topmost-p window on the GTK platforms to avoid problems that it had otherwise. This means that deselecting the owner window will close the message window, and so it may be a good idea to display the message in an additional place such as a status bar.

9.7 Release notes for the winapi module

The winapi module contains certain functions, in the windows package, that perform OS-related tasks. See The Windows API and a Windows API program with windows but without CG in cgide.htm for more information.

  1. Unicase names for several functions removed. This is a non-backward-compatible change. For example, CreateWin and related functions existed with uppercase names in ANSI Lisp and lowercase names in nonANSI Lisp is earlier releases but now exists only with a mixed case name. See The Windows API and a Windows API program with windows but without CG in cgide.htm for more information.

10.0 Release notes for AllegroServe

No notes at this time

11.0 Release notes for The Emacs/Lisp interface

The command fi:lisp-find-definition no longer sets a mark.

12.0 Availability of CLX for Allegro CL

CLX (Common Lisp X) provides an interface between Common Lisp and the X window system. All versions of Allegro CL include a compiled version of CLX with the distribution. The fasl file is code/clx.fasl, loaded by evaluating (require :clx). The Allegro CL products CLIM and Allegro Composer use CLX. Users wanting low-level access to an X server in Lisp may also want to use CLX. CLX is not supported by Franz Inc.

The sources to CLX are supplied with the regular Allegro CL distributions in the contrib/clx/ directory. Note that during installation, you are asked whether you wish to install the contrib/ directory and the default is not to install it. The contrib/ directory is not included in the Trial distribution, but Trial users can download the CLX sources from the Franz Inc. website as described next.

The sources to CLX are also available on the Franz Inc. web site (, at the location

13.0 Release notes for Orblink

No significant changes.

Appendix A: ANSI Conformance in Allegro CL

We discuss ANSI conformance in Conformance with the ANSI specification in implementation.htm. Elsewhere in implementation.htm we discuss specifics of our implementation of certain Common Lisp functionality.

Copyright (c) 1998-2019, Franz Inc. Oakland, CA., USA. All rights reserved.
This page has had significant revisions compared to the 8.2 page.
Created 2019.8.20.

Allegro CL version 9.0
Moderate update since 9.0 release.
8.2 version