ToC DocOverview CGDoc RelNotes FAQ Index PermutedIndex
Allegro CL version 11.0

Release Notes for version 11.0


1.0 Introduction

This document describes new features in verion 11.0 and changes from version 10.1. See Release Notes for links to the release notes of other versions.

Allegro CL 11.0 contains all changes added by patch or updates to Allegro CL 10.1 and also new features in the new release.

The documentation format and sources have been significantly changed. as described below.


1.1 Platform information

Allegro CL 11.0 is supported on the following platforms with the indicated minimal OS version. Note that there are two types of Allegro CL: SMP (symmetric mutiprocessing, see smp.html) and non-SMP. All platforms are assumed to support both unless otherwise indicted.

64-bit platforms

32-bit platforms


1.2 Heap start locations

                                                     ACL heap        aclmalloc
    64-bit Apple macOS 12.0 (Apple Silicon)       #x300000000      #x800000000
SMP 64-bit Apple macOS 12.0 (Apple Silicon)       #x300000000      #x800000000
    64-bit Apple macOS 12.0 (x86-64)            #x10000000000    #x80000000000
SMP 64-bit Apple macOS 12.0 (x86-64)            #x10000000000    #x80000000000
    64-bit Linux (x86-64), glibc 2.17           #x10000000000    #x80000000000
SMP 64-bit Linux (x86-64), glibc 2.17           #x10000000000    #x80000000000
    64-bit Linux (arm64/armv8), glibc 2.17       #x1000000000     #x6000000000
    64-bit Linux (arm64/armv8.1), glibc 2.26     #x1000000000     #x6000000000
SMP 64-bit Linux (arm64/armv8.1), glibc 2.26     #x1000000000     #x6000000000
SMP 64-bit Linux (arm64/armv8), glibc 2.17       #x1000000000     #x6000000000
    32-bit Microsoft Windows                       #x20000000       #x54000000
    64-bit Microsoft Windows                      #x200000000     #x8000000000
SMP 64-bit Microsoft Windows                      #x200000000     #x8000000000
SMP 32-bit Microsoft Windows                       #x20000000       #x54000000
SMP 64-bit FreeBSD (x86-64) 13                  #x10000000000    #x80000000000

2.0 Changes to the documentation

The documentation for release 11.0 has some significant changes, particularly in its arrangement of information. Essay files (like foreign-functions.html are not much changed but descriptions of individual objects (operators, variables, classes, top-level commands, etc.), which used to be in individual files organized in directories by types and packages, are now combined into files named by package and type. So operators named by symbols in the excl package used to be in the subdirectory operators/excl/ and are now bundled into the single file, in the same directory as the file you are reading, named excl-ops.html.

Those files start with a list of objects documented. Links from other documents as well as the index and the permuted index go directly to the documentation of the object of interest. Note that, as in version 10.1 and earlier, some objects are documented in essays files.

Also, in versions 10.1 and earlier, HTML documentation files had the extension .htm. Now most have the extension .html (the exception being the ansicl files).

Moving forward, only the current 11.0 documentation will be regularly updated as patches and updates change how the product works, even though some of these may be applied to earlier releases.

If you find problems with the new documentation, please report it to support@franz.com.


3.0 Changes to Allegro CL

There are the usual mix of significant changes and small fixes which make up a major release.

We have one subsection on non-backward compatible changes, then subsections on minor changes and fixes, and then one subsection for each major change.


3.1 Non-backward compatible changes

3.1.1 Removed functionalities

  1. The GTK interface on UNIX platforms has been removed. This means, among other things, that the Integrated Development Environment (the IDE, see cgide.html) only runs in CG/JS mode in a web browser on every supported platform except Windows, where it runs in a browser or as a Windows app.

  2. SSL socket methods :sslv2 and :sslv3 have been removed. See make-ssl-server-context and make-ssl-client-context for details.

  3. CLIM support has been discontinued. 11.0 will include a binary build of it, as a convenience to our users. The source code for CLIM is available on github, for those who need it.

  4. Support for many 32-bit platforms has been removed. 32-bit Lisps on Linux, Freebsd, and MacOS are no longer supported.

  5. Support for Allegro Composer has ended. Allegro Composer, 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.html) instead.

3.1.2 Incompatible changes

  1. New type-safe defstruct-slot-readers. Slot readers for structs defined with defstruct without the :type defstruct option are now type-safe by default (i.e. they call out attempts to access structs that are not the right type. If user code was not expecting this strictness such code could break without some mitigations. See defstruct for more information.

  2. More restrictive default types for ff:def-foreign-call arguments. Default argument specs for ff:def-foreign-call are now more restrictive, especially for :int foreign types and unspecified types, to more closely match C type sizes. See Note 1: Argument specifications for more information.

  3. More definitive behaviors for character signedness in ff:defforeign-call arguments. When :char or :unsigned-char are used as foreign types in ff:def-foreign-call forms, the conversions to either character or (unsigned-byte) is now precisely defined. See Note 10: Character signedness for more information.

  4. def-foreign-type now creates real types. When def-foreign-type is invoked it now creates an actual Lisp type that is discriminable. See the Compatibility note for more info.

  5. Tighter unreachable code warnings The 11.0 release introduces more situations where the compiler-unreachable-code-warning is signalled. Because of this, with-unreachable-code-allowed is provided to suppress warnings in some situations where warnings might not be expected or desired.

  6. Code vectors immediately stored in oldspace on some platforms. Users who do not concern themselves with memory management because their applications are not memory-intensive need not concern themselves with this change. Because many systems now separate executable code from other data, it is not possible on those systems to place code vectors in newspace which is now rw-. Instead, they must be stored in variant oldspaces called Code Vector Oldspaces (CVOs) which are normally r-x (but made rw- when a code vector is written). The result is that managing global gc's is somewhat more complicated as global gc's may be triggered by CVOs filling up as well as by regular oldspaces filling up. See the new :jitcode and :mprotect features (in Features present or missing from features in Allegro CL), and the new gc parameter :free-bytes-old-code and the new gc switch :clean-temp-code-vectors, both described in Switches and parameters. Garbage collection in general is dscussed in gc.html.

  7. Argument list to with-coverage changed. The old argument list for with-coverage macro was (&rest funcs) &body body. The new argument list is (&key (limit 0) verbose functions) &body body. Code which specified any function arguments must now specify them in a list which is the value of the functions keyword argument. See the description for information on the new limit and verbose arguments.


3.2 New Features and Fixes

Some of these changes (improvements and fixes) were included in release 10.1 with a patch issued after the initial 10.1 release. Each of these items are marked as being available in 10.1 with a patch.

3.2.1 New features

  1. New, native port to Apple Silicon. The table above, of supported operating systems, includes a new platform: Apple Silicon. At the time of the 11.0 release, there are variants of this platform called "M1" and "M2", but we expect more in the coming years. We believe all these variants will be compatible with the 11.0 release.

  2. We have a second 64-bit ARM port that is targeted at Amazon Linux and a new glibc version. Amazon Linux runs mainly in the cloud on AWS, but you can download and run it yourself, with appropriate hardware. The version of the ARM hardware that Amazon supports is newer than our previous ARM target. This new target is ARMv8.1 (and later).

  3. Apple software releases are notarized. You can read about notarization, but the basic idea is an assurance that our software has been checked for malware and it is now much easier to run after installation. Both the AMD/x86-64/Intel and Apple Silicon versions are notarized.

  4. Allegro CL Express on macOS now uses the CG/JS version of Common Graphics and the IDE. Express users thus need not worry about XQuartz or GTK. Installation of the Express version onto MacOS is described in the excl-vars.html file. [Available in 10.1 with a patch]

  5. Support for Large Language Models: see llm-api.html.

  6. New extensible lock-free hash-table implementation. Hash-tables have been reimplemented to be lock-free (even in SMP lisps), user-extensible, and more efficient. See the new :implementation option to make-hash-table and def-hash-table-implementation.

  7. Prebuilt fast-but-unsafe clrhash implementation. Along with the reimplementation of hash-tables described above as being extensible, a specific prebuilt implementation called :unsafe-clrhash is provided, for use when a hash-table will never be used by more than one thread and a fast clrhash is required.

  8. Significant changes to the runtime analyzer. There are significant changes to the runtime analyzer. See Changes to the runtime analyzer for more information. [Available in 10.1 with a patch]

  9. New protection against trashing system constants. Storing a non nil value into nil's car or cdr or its symbol-value, or storing a non t value into t's symbol-value are bad for a running Lisp and can cause the Lisp to die or spin. The interpreter always performs this protection. However, protecting the Lisp against such bad stores in code compiled with high speed and low safety is very hard, without slowing down all stores. Starting in 11.0 the Lisp protects itself after the fact by periodically checking the values in nil and t and fixing these up if they are wrong. Also, error is called when the value has been trashed, allowing the user to isolate the approximate time of the bad store. See check-system-constants for more information.

  10. New situations for atomic update operations on slot-value calls. Prior to 11.0, Atomic updates were allowed on slot-value, but not if there are any specializations which use slot-value-using-class methods. Starting with the 11.0 release, specializations can now be made on the new slot-atomic-update-using-class generic function.

  11. New :libname keyword argument to ff:def-foreign-call. This argument to ff:def-foreign-call can specify the library where a foreign routine is defined, thus avoiding confusion when another library with the same or similar entry point is loaded.

  12. MariaDB databases work with Allegro CL MySQL functionality. See mysql.html. Basically, a MariaDB database can be used with any function that accepts a MySQL database as an argument. [Available in 10.1 with a patch]

  13. Support of package-local nicknames. A patch released in August, 2019, adds support for package-local nicknames. These are nicknames for packages defined as part of another package definition. These names may shadow other package names or nicknames. Package-local nicknames are described in Package-local Nicknames in packages.html. This change is for version 10.1 and later only. [Available in 10.1 with a patch]

  14. The buffer argument to make-buffer-input-stream and with-input-from-buffer can be an aligned pointer. An aligned pointer is a fixnum which is interpreted as a machine integer, as described in Aligned Pointers and the :aligned type in ftype.html. 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. [Available in 10.1 with a patch]

  15. New fixed index feature for class slots. 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. See Optimizing slot-value calls with fixed indices in implementation.html for more information. There are embellisher metaclasses (see next release note) which assist in optimizing slot accesses described in the referenced section and the embellisher metaclass section Metaclasses for embellishing class definitions in implementation.html. [Available in 10.1 with a patch]

  16. New embellisher metaclass allows adding code to the class definition. 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 defines the defclass-embellisher-class 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. See also Metaclasses for embellishing class definitions in implementation.html. [Available in 10.1 with a patch]

  17. 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. See the run-shell-command documentation for more information. [Available in 10.1 with a patch]

  18. New function wait-for-io-available. 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. [Available in 10.1 with a patch]

  19. 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.html for details of the quiet argument. [Available in 10.1 with a patch]

  20. AllegroServe documentation moved to github. The AllegroServe documentation is now in github rather than being part of the regular Allegro CL documentation set. [Available in 10.1 with a patch]

  21. New macro with-at-most-one-form. 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. [Available in 10.1 with a patch]

  22. New process pool facility allows reusing processes multiple times. The new process pool facility, described in the Process pools section in the multiprocessing.html document, 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. [Available in 10.1 with a patch]

  23. 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. See Strict external formats which do not allow improper characters in iacl.html for more information. New functionality associated with the :utf-8s external format is described there. [Available in 10.1 with a patch]

  24. Fix to use_pll_file. use-pll-file has been fixed to work properly in 11.0. Prior versions did not properly update the return addresses of functions which had been fwrapped.

3.2.2 Performance enhancements

  1. sort reimplemented to perform better on specialized arrays. sort has long used the very fast merge sort algorithm when sorting simple vectors but used the quick sort algorithm on specialized vectors (like those with element type fixnum or single-float). While quick sort is generally fast, certain value arrangements (such as already sorted but in reverse order or all values the same) could be very slow. sort has now been modified to use merge sort when sorting a vector in all cases. A merge sort requires a temporary scratch vector the same size as the vector being sorted. A new keyword argument to sort, strategy, allows specifying whether this scratch vector will be allocated on the stack, in the Lisp heap, or will be a vector supplied by the caller to sort. A new variable, *simple-vector-sort-strategy*, provides the default value for this argument. See cl:sort implementation in implementation.html for more information. [Available in 10.1 with a patch]

  2. The resource mechanism is more efficient on SMP lisps. Note that excl::defresource is not exported or documented, but is used internally by quite a few mechanisms. Allocation of a resource object was failing when there was a collision between two threads trying to allocate the same resource. It was acting as if the resource pool was exhausted, even if there were enough objects in the pool to satisfy both requests. When this happened there would be unnecessary allocation, and in some extreme cases, a noticeable increase in scavenging overhead. This bug has been fixed.

  3. Performance improvement for many boolean operations. They now use conditional moves instead of branching on many architectures.

3.2.3 Compiler enhancements

  1. New compile-file strategy A new compile-file strategy is implemented by the 11.0 release where fasl files are written to indirectly and by section, to ensure that the old fasl file is not disturbed until the last possible moment, and also to reduce the memory pressure from large heap loads during the compilation.

  2. Position information enhancements. Enhancements have been made to position information, both during compiling and during execution of code. See position information. Also, operators are available for enhancing the likelihood of correct position information; see with-saved-file-positions and restore-file-positions.

  3. Source context enhancements. Version 10.1 had a concept of a source context, which provided various information about the location and circumstance of a condition when it was created (especially during compilation) but with the 11.0 release a source context can stand on its own and can be invoked within any macro using source-context, which allows filename, position information, the form being processed, and compiler-backtrace if applicable to be accessed programmatically.

  4. compiler backtraces are more available and readable. Compiler backtraces are now part of the source-context when any conditions are created during compilation, and they now can carry position information when optimization levels include high debug.

  5. New macro with-current-source-form. A new macro with-current-source-form allows position information to be injected into source by a macro which would otherwise be opaque to the compiler. See also the example.

  6. New compiler switch: comp:compile-macroexpansions-for-safety-switch. comp:compile-macroexpansions-for-safety-switch is examined at macroexpand time when the compiler is in the image, and working on compiler macros as well as regular macros, this switch affects how defstruct accessors are expanded. If the switch returns true, an accessor that checks for the correct struct type is generated.

  7. New compiler switch: comp:reorder-folded-constants-switch. comp:reorder-folded-constants-switch if true allows agressive reordering of expressions so that constants can be merged at various levels of computation. This may result in interpreted code and compiled code getting different numerical results (see the examples on the description page). Results from version 10.1 (where this switch did not exist) may also differ from current results when this switch is true, which it is when speed is 3 and safety is 0 or 1

  8. add-typep-transformer has a new re-expand 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. This feature is for 10.1 and later only. [Available in 10.1 with a patch]

3.2.4 Debugging enhancements

  1. Fwrapping and tracing now work on foreign-callable functions. See defun-foreign-callable, fwrappers-and-advice.html and The tracer.

  2. New ability to conditionalize assert forms. With the new assert enable facility, described in Conditionalizing assert calls in miscellaneous.html, you can now enable or disable calls to assert at runtime. Thus code does not have to be recompiled to disable calls to assert and assert forms can be enabled in applications if a problem is detected. The :generic-checks assert-enable is enabled by default and checks calls to defstruct accessors when compiled.

  3. New printer control variables control printing of long strings. Printing of very long strings (containing hundreds or thousands of characters) when it is not the actual contents that are of interest can make it difficult to see the desired content and can also cause problems if buffers or screens overflow. Several new printer control variables have been added to deal with this issue. *print-long-string-length* is analogous to *print-length*. The additional variables tpl:*print-long-string-length*, tpl:*zoom-print-long-string-length* *step-print-long-string-length*, and *trace-print-long-string-length*, provide control in other contexts. See Printing long strings top-level.html and also Allegro CL print variables can follow the CL print variable value in implementation.html for more information.

  4. New :intermdiate :zoom backtrace mode. In addition to :brief, :moderate, and :verbose modes, backtraces produced by :zoom can be displayed in :intermediate mode, which is similar to :moderate with the addition of pc offset information (which is also displayed by :verbose mode). See :brief, :moderate, :intermediate, and :verbose modes of :zoom in debugging.html.

  5. New debug-control field for processes. Process now have a debug-control field. It is displayed as the second column in the information displayed by the :processes top-level command. When true it causes dead locals to be preserved (rather than garbage collected) on the stack so that debugging is made easier. See the :debug-control top-level command for more information.

  6. New functions for finding gc paths and new objects. A gc path is the path from the Allegro CL root object to a specific live object. New operators allow finding gc paths and tracking newly-created objects. See the section Functions for finding gc paths and new objects in gc.html for more information. [Available in 10.1 with a patch]

  7. memtrace facility modified, now works identically in a file and at the top-level. A new macro memtrace-do has also been added. See Memlog: A Facility for Minimally Intrusive Monitoring of Complex Application Behavior in smp.html for more information. [Available in 10.1 with a patch]

3.2.5 Socket enhancements

  1. Allegro CL now supports TLS 1.3. Relevant socket functions now have a ciphersuites keyword argument. See TLS 1.3 support and ciphersuites in socket.html for more information. [Available in 10.1 with a patch]

  2. Allegro CL supports SSL 1.1, 3.0, and 3.1. You may now load these versions of SSL into Allegro CL. See Secure Socket Layer (SSL) in socket.html for more information. [Available in 10.1 with a patch]

  3. New socket options which correspond to TCP_KEEP* constants. The tcp-keepalive-idle-time, tcp-keepalive-probe-interval, and tcp-keepalive-max-probes keywords set options corresponding to the C constants TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT on operating systems where they are supported. These options are set by set-socket-options (they cannot be set with make-socket). Not all of these options are supported on all operating systems. See set-socket-options for more information. [Available in 10.1 with a patch]

  4. dns-query will now lookup SRV records. socket:dns-query now accepts an :srv type for getting the SRV records of a domain. See SRV queries in dns.html. [Available in 10.1 with a patch]

  5. 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 11.0, it contains :sni only. Also, acl-socket:make-ssl-client-stream accepts a server-name keyword argument. [Available in 10.1 with a patch]

  6. New Support for Websockets. A new module which implements the websocket protocol specified in RFC 6455. It is described in the section Websocket API. [Available in 10.1 with a patch]

  7. 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. [Available in 10.1 with a patch]

  8. 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.html. [Available in 10.1 with a patch]

3.2.6 Bug fixes

  1. The product-newer-than-image method has been corrected. The method had a typo which caused it to effectively perform opposite the intention for it.

  2. More control provided over waiting when calling open-websocket. A deadlock could occur when net.aserve:open-websocket is called with a non-nil value of the wait argument, if the websocket does not in fact get established in a reasonable time. The waiting interface has been changed, including the addition of these new keyword arguments to open-websocket: connect-timeout, retry, and error-p. The behavior of the wait argument has also been modified. New associated conditions and variables have been added. [Available in 10.1 with a patch]

  3. Fix for Lisp death when with-output-to-buffer sees a null buffer argument. When with-output-to-buffer is given a null buffer argument for the purpose of only obtaining a file-position (to determine the length of the output), bad things could happen because the stream writing mechanism tended to overwrite nil. This could lead to either a fixup of nil and an error stating as much, or a violent death or hang of the Lisp after more critical infrastructure around nil was overwritten. Writing of characters has always been no problem, but the algorithms for writing octets were not properly accounting for a buffer specified as nil. That bug has now been fixed. [Available in 10.1 with a patch]

3.2.7 Documentation enhancements

  1. Variable *aclssl-verbose* now documented. The variable *aclssl-verbose* has been around since the SSL behavior changed, but was inadvertently not documented. If specified true before evaluating (require :ssl), then information on what is happening will be printed. See Secure Socket Layer (SSL) in socket.html for more information. [Available in 10.1 with a patch]

  2. Many supported message digest functions previously undocumented. The section MD*, SHA*, HMAC, and other message digest support, and RC4 cypher functions in the miscellaneous.html 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. [Available in 10.1 with a patch]

3.2.8 Other enhancements

  1. New warning condition portable-fasl-file-version-warning. portable-fasl-file-version-warning will be signaled when there is an attempt to load a fasl file compiled in an older Lisp version or possibly in a Lisp with different characteristics but which does not contain any version-specific or characteristic-specific code. The load will succeed although the warning will be signaled.

  2. *stderr* now exported from excl package. The variable *stderr* is initialized to a stream which corresponds to the C "FILE *" variable "stderr".

  3. Some sharable-lock functions now have a whostate argument. with-sharable-lock and sharable-lock-lock now have a whostate argument.

  4. 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. [Available in 10.1 with a patch]

  5. 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). All functionality is named by exported symbols in the mplog package. See The multiprocessing logging (mplog) facility in miscellaneous.html. [Available in 10.1 with a patch]

  6. 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. [Available in 10.1 with a patch]

  7. 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. All are listed in the section Day and date calculation functions in miscellaneous.html. [Available in 10.1 with a patch]

  8. 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. [Available in 10.1 with a patch]

  9. 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.html. [Available in 10.1 with a patch]


3.3 Changes to the runtime analyzer

There were significant changes to the implementation of and the interface to the runtime analyzer made in 10.1 (and now available in 11.0). Specifically, at the highest level, the new interface:

Use of some operators and arguments have been deprecated:

The current-profile keyword argument to various functions has been replaced with the new profile keyword argument. The value of profile must be a profile object (as returned by prof:find-named-profile) or the name of a named profile (such as created with prof:save-named-profile). The default value of profile is the current profile, if there is one. Specifying :profile :current also indicates the current profile. The profile stored by the deprecated macro prof:save-current-profile is not suitable as the value of profile.

The functions which accepted a current-profile keyword argument and which now accept a profile keyword argument are:

The current-profile keyword argument is still accept though using it signals a warning.

New named profile data structures and functions that manipulate them

Previously you saved the results of a profile run with the prof:save-current-profile macro, which made the profile information the value of a specified variable. In the revised implementation, profile data structures can be named and then retrieved and referred to by that name. Three function support the use of named profiles:

Either a named profile name or a named profile data structure are suitable as values of the profile argument to various runtime analyzer functions.


4.0 Changes to Common Graphics and the IDE

There are many improvements to Common Graphics and the IDE for 11.0, where only a small number of those were available as patches for 10.1.

The biggest set of changes by far is a port of CG and the IDE to HTML5 and JavaScript, which allows user interfaces to display in web browsers. This "CG/JS" port was available for 10.1 as a special set of patches, but is now integrated in 11.0. Its features are described below in Details of the CG/JS version of CG and the IDE, and the entry point for CG/JS in ACL 11 is at Common Graphics on HTML5/JavaScript (CG/JS).

There are three general CG/IDE release notes sections:

  1. New changes to Common Graphics
  2. Changes to Common Graphics released as patches to 10.1
  3. Changes to the IDE

That last section includes new changes and those released as 10.1 patches.


4.1 New changes to Common Graphics

  1. The grid-widget has extensive enhancements to make it easier to use for typical simple grids, especially when designing a grid interactively on a form window. See the new simplified grid-widget tutorial. The enhancements include: (1) new properties on grid-widgets for (a) reaching sub-sub-objects more quickly in the inspector, (b) defining default property values for groups of child objects, and (c) more easily specifying property values that are exceptions for individual rows and columns; (2) default read/write behavior that stores cell values within the grid-widget itself by default, removing the need to set up a way for the grid-widget to access data from elsewhere in the application; (3) the new function cell-value that allows passing the row and column by name or index, rather than needing to find the grid-row and grid-column objects to pass to read-cell-value and write-cell-value; (4) a new header-cell child for each row and column, which can specify that cell's label and/or individual drawing style without writing methods for the header row or column and its intersecting columns and rows; and (5) properties for alternating row background color (banding). Also, the grid-widget's flaky use-real-combo-box option is no longer supported and now has no effect.

  2. Drag-and-drop functionality is easier to use when creating dialogs interactively as form windows. This includes new widget properties like drop-sources and drag-on-alt-click, plus event-handlers like on-paste and on-drop for indivudual widgets, which typically removes the need to define widget subclasses and write methods on them. Drag-and-drop is integrated better with copy-and-paste, with more options to the pastable property for where pasted values will be inserted in an item-list, and a new select-on-paste property for which list values will end up selected. The new drag-on-alt-click property enables a built-in gesture for initiating drags.

  3. There are several improvements to the chart-widget. The new function effective-value-axis-range returns the value range that the widget calculated from the current data. The mouse wheel can now be used to scroll a chart-widget. Wrapper methods can be added to the new generic function exclude-or-include-chart-object for side effects when the user clicks on an object in the legend to toggle whether that object is currently included in the chart or plot. There are fixes for errors that could occur with certain combinations of options, and when clicking on a chart-widget if you have turned on the click-to-toggle-inclusion option and the chart has only a single object in its list of chart-objects.

  4. There are several improvements to the outline widget. A variety of speed optimizations were made. If the new outline property highlight-item-under-mouse is true, then moving the mouse cursor over the widget will highlight each outline-item when the mouse cursor is over it. The new modifiable generic functions outline-item-highlighted-foreground-color and outline-item-highlighted-background-color determine the color in which to draw the text in the outline-item that is currently under the mouse cursor. The new functions drop-outline and undrop-outline can be called to show and hide the dropping pane of a dropping-outline programmatically.

  5. When the new variable *opaque-rubber-banding* is true, the standard dragging functions like get-line and get-shape-box will use a newer drawing style that's nicer than the traditional XORing.

  6. The new function show-tooltip-explicitly shows a tooltip at an arbitrary time and place. (The general tooltip facility is otherwise geared specifically to widgets and hotspots.)

  7. The new function utilities-directory returns the pathname of a directory where it is suitable to save utility files for the current user, such as option files. The related new function utility-path returns a complete file pathname. And the new function home-directory returns the user's home directory on Linux ad Mac or their personal Documents directory on Windows. The new variable *utilities-directory* can be set or bound to override those defaults. And the new project property utility-file-directory can specify the utilities directory to be used by a project.

  8. The function ask-user-for-new-or-existing-directory can now be used as a custom file selection dialog by passing the new select-file keyword argument as :single or :multiple. (This dialog is always used in CG/JS mode.)

  9. The function pop-up-lettered-menu has new horizontal-justification and vertical-justification parameters.

  10. The border property of a window may now be :none-allowing-title to use no border but still allow the window to have a title-bar.

  11. The function bring-window-to-front accepts a new :recurse keyword argument to bring all ancestors of the specified window in front of their siblings. This ensures that the window will be visible.

  12. The function ask-user-for-date accepts a new :calendar-mode keyword argument for the type of date range that the calendar will initially display, such as :month to display one full month of individual dates. (Previously you needed to call (setf calendar-mode) later.)

  13. The new CG function list-widget-focus-index returns the index of the item in an item-list or list-view widget that currently has the keyboard focus. This is not necessarily the same item as the selected value. The setf of this function can be called to move the focus to a different item without also changing the selected value.

  14. The functions ask-user-for-string, pop-up-string-dialog, and pop-up-strings-dialog have a new dialog-width parameter for setting the pixel width of the dialog (while the height is still always fit to the contents automatically). They also have a new multi-line parameter for using a multi-line-editable-text widget rather than the default (single-line) editable-text widget.

  15. The functions stream-char-width and line-height have a new return-real keyword parameter for returning the value as a real number rather than an integer. This may be useful mostly in CG/JS mode where the values are often non-integers, especially when adding together the values for a sequence of characters or text lines.

  16. The function string-search has a new start parameter for where to begin searching.

  17. The previously undocumented function split-string-to-width separates a string into lines of text that will fit within a specified pixel width. The new variable *text-wrapping-delimiters* is a list of the characters at which that function will divide a string into multiple text lines by default when the new variable *wrap-text-in-cg* is true.

  18. Fixed: The function split-string-to-width returned incorrect indexes when there were leading spaces.

  19. The previously unexported and undocumented function font-face-fixed-width-p has now been exported and documented.

  20. The previously undocumented function scroll-text-cursor-into-view scrolls a text-edit-pane vertically if needed so that the text cursor is in view.

  21. The previously undocumented function insert-character allows programmatically inserting a character into a text-edit-pane, just as if the user had typed that character.

  22. The previously undocumented function close-menu-and-submenus closes the specified menu and all of its descendent cascading submenus. The new function close-window-and-menus closes a window and also calls close-menu-and-submenus.

  23. On Windows, horizontal scroll bars on item-list widgets have been implemented. (They already worked elsewhere.)

  24. On Windows, the new funcions virtual-screen-right and virtual-screen-bottom return the rightmmost and bottommost coordinates of all monitors in the system.

  25. On Windows, passing the new value :file-list to clipboard-object will return the list of file paths that the user copied in the Windows File Explorer.

  26. Fixed: Help strings for widgets were not appearing in the status bar in the IDE when moving the mouse over widgets.

  27. Fixed: When calling set-focus-cell on the first subsection of a grid-section when that section had not yet had the focus, application-added methods of set-focus-cell did not get called for side effects.

  28. Fixed: A save-file from a text-edit-pane did not preserve the end-of-line convention that was already in the file when it wasn't the usual one for the operating system.

  29. Fixed: On the Mac, a Shift+Tab keystroke did not tab in the reverse order through the widgets on a dialog, or through the cells of a grid-widget.

  30. Fixed: On the Mac, a Control-click in a multi-item-list was getting handled as a right click, which disallowed toggling multiple values.

  31. Fixed: On Windows, gradient shading was still done when *alpha-blending* was true but *color-gradient-filling* was nil.

  32. Fixed: On 64-bit Windows, opening a printer stream could break in certain cases.

  33. Fixed: On Windows, the function save-pixmap failed in a case-insensitive (ANSI) lisp unless the file type was uppercase in the specified file name.

  34. Fixed: On Windows, a break happened when there are two html-widgets on the same dialog.

  35. On Windows, the new functions set-text-zoom and get-text-zoom hook into the Microsoft functionality for zooming the text in a text-edit-pane.

  36. Fixed: It had never worked to move the text cursor to the end of a text-edit-pane with the expression (file-position my-text-edit-pane :end).

  37. Fixed: There were problems with defining pixmaps at load time rather than at run time, such as when a defvar form calls make-instance on the pixmap class, or when there are picture widgets on a form window for designing a dialog interactively.

  38. The new function control-or-command-key may be useful for specifying menu command event-synonym keyboard shortcuts, by returning meta-key (for the Command key) on the Mac or control-key elsewhere.

  39. The newly-exported macro defvar-cg works just like defvar, except that every CG process that's created will automatically get its own binding for the symbol.


4.2 Changes to Common Graphics released as patches to 10.1

  1. Fixed: There were resizing problems when window attachments like right-attachment are combined with split-bars in both directions, including when maximizing and unmaximizing the window. (Patched for 10.1.)

  2. Fixed: There were problems with starting text entry in a grid-widget when the edit-start-trigger is :get-focus. And there's a new grid-widget property start-text-editing-on-grid-widget-focus. (Patched for 10.1.)

  3. If multiple windows have errors in their custom redisplay-window methods, confusion could result if the error for the first window is being handled and then a repaint message for the second window is handled. (Patched for 10.1.)

  4. Fixed: On Windows, the print job dialog did not get initialized with the requested options on the first invocation of the dialog in a lisp session. (Patched for 10.1.)

  5. Fixed: On 64-bit Windows 10, opening a printer stream by name errored. (Patched for 10.1.)

  6. Fixed: On Windows, when using the AltGr shift key (the righthand Alt key) on international keyboards to enter alternate characters into text-editing widgets that are on dialogs, the characters were doubled. (Patched for 10.1.)

  7. Fixed: On 64-bit windows, hovering over a command in a menu would sometimes not call menu-item-highlighted, which typically means that the menu-item's help-string would not get displayed in a tooltip or status-bar. (Patched for 10.1.)

  8. Fixed: On Windows, IDE status-bar text was clipped when not using the IDE parent window. (Patched for 10.1.)

  9. Fixed: On Windows, loading a pixmap from an icon file ignored the index that was specified. (Patched for 10.1.)


4.3 Changes to the IDE

  1. The GTK version of the IDE is no longer supported on Linux and the Mac. Only the CG/JS browser-based version is supported for the IDE and for applications using Common Graphics. On Windows, both the CG/JS version and the Windows desktop versions are supported.

  2. The Project Manager has a new CG/JS tab for options related to running in the new web browser mode. The Run as Web Browser Server check-box at the upper left controls which mode the project will run in, and which mode the generated application will run in by default. This now defaults to web browser mode, even when the IDE is running in desktop mode.

  3. Some IDE menu command keyboard shortcuts have changed to avoid conflicting with keystrokes that web browsers always grab for their own commands. These changes also affect desktop mode in order to use the same keystrokes in both modes. If a familiar keystroke no longer works, then check the pull-down menu for the current keystroke.

  4. The new IDE configuration option print-generate-application-call controls whether generating a standalone application will print the call to generate-application or build-lisp-image to the listener, for debugging purposes. Prior to ACL 11.0 the call was always printed, but the default value of this new option is nil.

  5. Lots of cosmetic refinements have been made to IDE dialogs.

  6. Hovering over the error message widget in an IDE backtrace pane now shows the full error message in a tooltip if the message doesn't fit in that short pane without scrolling it. The restarts dialog is also now somewhat taller to show more of the error message without scrolling.

  7. The new function write-backtrace-to-file is an alternate value for the default-error-handler-for-delivery option of a project, for debugging a generated application that crashes or hangs.

  8. Fixed: Tracing individual methods in the Definitions dialog did not work when the source code location is not known.

  9. The trace dialog will say "(still inside ...)" beside a call that has not yet returned. And each call will mention the number of milliseconds between (1) the most recent entrance to or exit from a traced function and (2) the entrance to that function. This is in addition to showing the number of milliseconds in that call, as in 10.1. And the Stack widget will now collect 200 stack frames by default instead of 50.

  10. The IDE's Inspector has been improved for hash tables, including listing individual keys and values and allowing modifying values.

  11. Help | Quick Symbol Info now works more consistently in modal dialogs.

  12. A new run-in-web-browser keyword argument to ide:start-ide allows running the IDE in either web browser mode or desktop mode, after using (require :ide) to load CG and the IDE code into a base lisp. And when running in web browser mode, a new start-local-client keyword argument allows either telling a local web browser to connect automatically, or else running in server mode to allow connecting interactively (including from another machine).

  13. The new function exit-ide allows exiting the IDE without exiting the base lisp. The IDE could then be restarted by calling start-ide as usual.

  14. The new IDE option handle-home-key-shortcuts-in-ide-outlines allows toggling the handle-home-key-shortcuts property of all IDE outline widgets at once. The default value is nil, even though that's the opposite of the previous behavior, because it conflicts with the general ability to jump to an item by typing the first one or more of its characters, which is now uniformly in effect in all item-list, list-view, and outline widgets in the IDE.

  15. When the new IDE option save-whether-to-show-subproject-modules is true, a saved project will remember which subprojects were currently showing their modules in the Modules tab of the Project Manager, and restore that state when the project is opened again.

  16. The new IDE option include-dead-locals-in-backtraces returns (or sets with setf) whether backtraces will show the values of local variables that are dead.

  17. In the Editor, the new keystroke Control+7 shows the current text line number and column number in the status bar.

  18. The new command Help | Assorted CG and IDE Topics displays the file doc/cgide.htm.

  19. Fixed: The Definitions dialog would not show the source file in certain cases such as (1) a class that's defined by a custom macro where the class name is not the first argument to the definer, (2) methods that have EQL specializers for non-keyword symbols, and (3) methods in a source file that contains no in-package form. And when the location within the file is not known, it will still search for the function name by itself when the standard defining forms are not found.

  20. Fixed: Trying to save a file in the Editor with a non-lisp file type would still append a .cl file type, saving foo.txt as foo.txt.cl.

  21. Fixed: Saving a file in the IDE's Editor (or calling save-file in a CG app) did not specify an external format, and on Windows defaulted to saving with the :latin1 external format rather than :utf-8 as intended. Files did get loaded with :utf-8, though, leading to a mismatch on Windows for non-ASCII characters.

  22. Fixed: In certain cases the default fixed-width font (fixed-font) could get saved with a tiny size in the IDE's options file.

  23. Fixed: Infinite recursion could happen when modifying the chart-objects property of a chart-widget in the inspector.

  24. Fixed: An infinite loop occurred while generating the distribution for a project if the name of the project is the same as the name of one of the source code files in the project.

  25. Fixed: The outline widget option select-on-typing was not defined as a property, and so did not appear with other widget properties in the inspector.

  26. Fixed: The IDE on Windows could freeze when system colors change. (Patched for 10.1.)

  27. Fixed: "Quick Symbol Info on Space" was not working in the Editor when using Emacs key bindings. (Patched for 10.1.)


4.4 Details of the CG/JS version of CG and the IDE

The CG/JS documentation has now been integrated into the rest of the Allegro documentation, with its entry point at Common Graphics on HTML5/JavaScript (CG/JS). For moving existing CG applications to 11.0, especially see the section Changes You Might Need to Make in Your CG Application. The earlier single file that covered all CG and IDE changes for 11.0 is also still available for the moment here and here.

Common Graphics (CG) has been ported to HTML5/JavaScript, for running CG applications and the IDE in web browsers. A short name for this new platform is CG/JS mode. And support for CG on GTK has been dropped. This means that CG apps and the IDE on the Mac and Linux will now run only in web browsers, while on Windows they will run either in web browsers or as Windows desktop apps as before.

Though the default behavior is to run the IDE in a browser running on the same machine as Allegro CL, it is possible to display in a browser running on a different machine, as described here in cg-cgjs.html. Be sure to read the SECURITY NOTE in the linked section.


This section is for Windows users only, because on the Mac and Linux the IDE now only runs in a web browser.

When you open a project in the IDE, in order to continue running that project or its generated app in Windows desktop mode by default as in 10.1, you will need to go to the new CG/JS tab of the Project Manager and turn off the Run as Web Browser Server check box at the upper left. This is needed even when running the IDE in desktop mode. That new option runs projects in web browsers by default.

Running a project in desktop mode in the IDE requires running the IDE itself in desktop mode. All other combinations of the two modes are possible, meaning the following: You can run a project in either mode when the IDE is running in desktop mode. And the standalone app for a project can be generated to run by default in either desktop mode or web browser mode when the IDE is running in either mode. (The same executable for a standalone app or the IDE can be run in either mode.)


4.4.2 Some Advantages of CG/JS Mode

On Mac and Linux, apps look nicer in a web browser than they did on GTK (version 2), where there was no antialiasing or gradient shading and the fonts do not scale well to some sizes. GTK does not need to be installed on Mac and Linux, and the XQuartz X11 server is not needed on the Mac. Apps have a consistent look and feel in web browsers across Mac, Linux, and Windows. The user can zoom any entire CG application in and out with the browser's usual keystrokes for that, without any code changes in the CG app. The browser's standard audio and video-playing controls can be used as CG widgets. And the html-widget works on all platforms for embedding web pages or HTML files in a widget of your application.

A special CG/JS advantage is the client/server model, where the application can be running as a server on one machine, and then a user can connect to it remotely from another machine, using only their favorite web browser and without installing any software on their own machine. This access can even be across the Internet if the server machine allows that. A single running app can also allow multiple simultaneous clients if it is written to handle that.


4.4.3 New Functions for CG/JS

Here's a tree of the new functions for CG/JS, as they appear in the Allegro Tree of Knowledge dialog in the 11.0 IDE. Links to these functions can be found at Common Graphics on HTML5/JavaScript (CG/JS) .

  Common Graphics on HTML5/JavaScript (CG/JS)
    Whether CG is Currently Running in CG/JS Mode (In a Web Browser)
      js-mode
    Which Web Browser Is Being Used, and On What Operating System
      web-browser-name
      web-browser-os
      displaying-on-mac
    Special Drawing Approaches in CG/JS
      small-canvas-mode
      draws-the-entire-scrolling-page
    CG/JS Event Filters
      mouse-move-filter
      scroll-filter
      wheel-filter
    CG/JS Options
      cgjs-client-option
      cgjs-server-option
      *cgjs-client-options*
      *cgjs-server-options*
    CG/JS Server Options for a Project
      cgjs-options
      ide:run-as-web-browser-server
      ide:start-local-client
      ide:exit-server-on-client-exit
      ide:confirm-exit
      ide:disallow-running-in-non-default-mode
      ide:limit-connections-to-same-machine
      ide:show-cgjs-server-window
      ide:cgjs-logging
      ide:title-for-browser-tab
      ide:browser-keychords
      ide:browser-server-port
      ide:max-clients
      ide:style-options
      ide:javascript-files-to-import
      ide:include-modules-for-starting-local-client
      ide:include-modules-for-cgjs-logging
    Handling Events Specially in CG/JS
      Handling Application Exit In CG/JS
        confirm-web-browser-exit
        ide:query-web-browser-exit
        tell-web-browser-app-is-exiting
        web-browser-has-disconnected
      Special Text-Edit-Pane Event-Handling in CG/JS
        send-undo-keystrokes-to-server
        text-edit-pane-send-enter-to-server
        *paste-with-undo-limit*
      default-process-for-events
      send-dummy-message-to-window
      web-browser-clipboard-action
      *modal-dialogs-disable-owner-js*
      idle-until-the-next-event
      request-a-dummy-reply-from-web-browser
      *use-alternate-websocket-nudge*
    Handling the CG/JS Server and Multiple Clients
      start-cgjs-server
      start-cgjs-client
      *browser-server-port*
      defvar-cg
    Importing Custom JavaScript Code
      import-javascript-file
      call-js
    CG/JS Media Players
      media-player   (a non-instantiable superclass)
      media-player-pane
      Special Functions for All CG/JS Media Players
        media-player-command
        media-player-property
        display-controls
      The CG/JS Audio Player
        audio-player   (an instantiable class)
        audio-player-pane
      The CG/JS Video Player
        video-player   (an instantiable class)
        video-player-pane
    Other CG/JS-Specific Functions and Variables
      display-pixmap-in-browser-tab
      *secure-mode*

Copyright (c) 2023, Franz Inc. Lafayette, CA., USA. All rights reserved.

ToC DocOverview CGDoc RelNotes FAQ Index PermutedIndex
Allegro CL version 11.0