Version 3.1.0 (LLVM15-20, 22) Pending
July 10, 2026 · View on GitHub
Optimized
- Comparisons (
eq,<, etc.) are optimized out based on type information.
Version 3.0.1 (LLVM15-20, 22) 2026-06-24
Fixed
- Fixes the archive tarball which was broken for 3.0.0. Thanks @fosskers for noticing.
- Archive mechanism now properly uses the pinned commits rather than git branches.
- Bad warning call in Khazern #1803.
Version 3.0.0 (LLVM15-20, 22) 2026-06-18
Added
- Support for LLVM20 and LLVM22. LLVM21 is excluded due to API incompatibility.
- Weak-value and weak-key-and-value hash tables, as well as an interface for weak-key-or-value tables, although at present they are actually strong tables in practice.
ext:macroexpand-allmacroexpands a form and its subforms.- Arguments to bytecode functions are made available to debuggers.
ext:deoptimizecan temporarily replace almost all native-compiled functions with a simpler bytecode version with better debuggability.ext:reoptimizerestores the native version.- A style warning is signaled if the compiler assumes a symbol names a function and then sees it defined as a macro.
- New interfaces for reading and evaluating code with tracked source locations:
ext:with-source-tracking,ext:stream-source-location,ext:read-source,ext:augment-source,ext:eval-source,ext:compile-source.
Changed
- Use Khazern extended for CL:LOOP
- :output-type parameter to compile-file is replaced by :native. :native t will build a fasl with both bytecode and native versions of code. If :native is not provided, it defaults to
cmp:*compile-file-native*. compilecan similarly be set to compile natively or to leave functions as bytecode with thecmp:*compile-native*variable.- Build modes are changed: :faso, :bytecode-faso, :fasoll, :fasobc, :fasl build modes are removed. Only :bytecode and the new :native can be used. :default-native is a new build flag that can be used to control whether the built Clasp will native-compile files and functions by default (i.e. it controls the default values of
cmp:*compile-file-native*andcmp:*compile-native*. - The build procedure is completely rewritten, building Clasp's Lisp code using another Lisp implementation instead of boostrapping from the C++ Clasp.
Fixed
- Weak pointers and weak hash tables survive snapshot save/load.
ext:quitcan be used from any thread, not just the initial thread.- Quasiquoted vectors are read correctly (#1666).
- The bytecode compiler detects malformed bindings.
- Literal arrays with fill pointers are not dumped with excess elements.
setfofapplyno longer has multiple evaluation problems.- Improve error messages for package name conflicts. Fixes #1722.
- FASL loading is more resilient in the face of heavy file use and interruptions. Thanks @dg1sbg.
- Writing non-base-chars into base strings by various means (e.g.
replace) now signals an error instead of treating the low byte of the codepoint as a base char. ext:macroexpand-allno longer allows macros to expand into tagbody tags.
Removed
-z/--snapshot-symbols-savecommand line option, occasionally used for snapshot debugging. You can callcore:mangled-symbol-namesif the effect is still needed.- FASO and other compile-file output types, other than FASL.
compile-filenow always produces a FASL.
Optimized
- FASL loading batches reads more, improving load times. Thanks @dg1sbg.
- Array copying operations like
subseqandreplacecons less.
Version 2.7.0 (LLVM15-19) 2025-01-21
Added
- Package lock support, based on SBCL's. Currently ignores local bindings. Thanks @bumblingbats.
- Add support for 80-bit and 128-bit LONG-FLOAT. Extended precision LONG-FLOAT is available on amd64 and non-Apple arm64 platforms. It is automatically detected and enabled.
- LLVM19 support.
- Interrupts have now been organized into a coherent interface. Clasp will signal conditions of type MP:INTERRUPT at opportune times, and these conditions can be handled like any others.
- Extensions to Clasp and CANDO can now be built against an installed Clasp implementation and dynamically loaded. For an example see clasp-hello-world.
Changed
- Floating point exceptions FE_INVALID, FE_OVERFLOW and FE_DIVBYZERO now signal the corresponding lisp errors by default.
Fixed
- Pathnames and filesystem operations support Unicode (#1595).
- Package names support Unicode (#1596).
- Clasp threads can now be more reliably interrupted while they are blocking (e.g. waiting to grab a mutex, or for input).
Version 2.6.0 (LLVM15-18) 2024-06-03
Added
- LLVM18 support.
Changed
- Exit with error code when unknown option is present on command line.
- EVAL now uses bytecode, improving evaluation speed.
- Bytecode is now simpler for functions with &rest parameters, as well as functions that close over arguments.
Fixed
- Avoid inserting fill newlines after newline format directive in logical block format directive.
- Don't buffer overrun when encoding UCS-4 streams.
- The bytecode system can properly handle functions with more than 255 keyword parameters.
- Bytecode FASLs can contain multidimensional arrays specialized to sub-byte integer types.
- Avoid a double free when translating
const char*arguments in the C++ bridge. macroexpanddoes not ignore shadowing function bindings (#1556).- BTB compiler can handle closure variables deleted by optimization.
(setf elt)calls(setf sequence:elt)properly on extended sequences.- BTB compiler handles non-constant load-time-values.
- When
set-macro-characteris given a non-function, it signals an error without breaking the readtable.
Optimized
- Single dispatch generic functions don't perform redundant argument count checks.
Version 2.5.0 (LLVM15-17) 2024-01-01
Added
- New module named "gray-streams" which makes it possible to initialize the Gray stream protocol without calls to internal functions.
- New build mode
:bytecode-fasowhich builds the kernel as native code (FASO) while the bytecode compiler is active. - Generic
gray:stream-file-lengthwhich implementscl:file-lengthfor Gray streams. - Generic versions of
cl:pathnameandcl:truename, both of which are available after the Gray stream modules is required. - Generic
(setf gray:stream-element-type),gray:stream-external-format, and(setf gray:stream-external-format)for basic support of bivalent streams. - Generic
gray:stream-file-string-lengthwhich implementscl:file-string-lengthfor Gray streams. - The bytecode compiler warns about unused variables.
Changed
cl:formatandpprintnow respect the value returned bygray:stream-line-length.cl:closenow uses the:abortargument to decide what to do with the resulting file. If:abortis non-NIL and the file was created as a result of:if-does-not-exist :createthen the file is deleted. If:abortis non-NIL, there was an existing file and:if-existsis either:supersedeor:rename-and-deletethen the original file is restored.
Removed
- Obsolete
:object,:ll,:bc, and:faslbuild modes.
Fixed
cl:read-lineso it correctly returns lines that end with EOF.cl:read-byteso it respects theeof-error-pandeof-valuearguments for Gray streams.
Version 2.4.0 (LLVM15-17) 2023-10-01
Added
- Bytecode stores source location info for debugging.
- Bytecode stores variable info, so that variables can be viewed in the debugger.
- The bytecode compiler tracks source positions for error reporting.
- Circle detection for load forms in bytecode FASL.
- Bytecode functions can be compiled directly into native code with
cl:compile(experimental). - Cross-reference (xref) capability: Search for callers of a given
function with
ext:who-calls, and etc. Only works for bytecode right now. - Support for Linux AARCH64.
- LLVM17 support. LLVM15 and LLVM16 are still supported.
Changed
- Improved printing of backquote and unquote.
Fixed
- Avoid segmentation faults from incorrectly calling MP:PROCESS-JOIN in EXT:RUN-PROGRAM.
Version 2.3.0 (LLVM15-16) 2023-06-04
Added
- Bytecode compiled images via build mode
:bytecode. - FASL magic number sniffing for CL:LOAD. This enables FASL files to be loaded even if the filename extension is incorrect.
- Preliminary Apple Silicon support. Must be compiled with bytecode
either by specifying
--build-mode=bytecodewhen invoking koga or by adding:build-mode :bytecodeto the config.sexp file. - LLVM16 support. LLVM15 is still supported.
Changed
- Updated to Eclector v0.9.0
Fixed
- Use Eclector state protocol to enable readtable changes during compiling. Fixes #1398.
Version 2.2.0 (LLVM15) 2023-03-01
Added
ext:describe-compiler-policyto get information about the current behavior of the compiler.gray:stream-line-lengthGray stream extension method.- Support for building Clasp using CCL and ECL versus the default implementation of SBCL.
- Export of
ext:num-logical-processorsto return CPU count.
Changed
- Updated to LLVM 15 and CLANG 15.
Fixes
- Ensure that
print-unreadable-objectcan accept output stream designators. - Set stream column to zero after printing the prompt in a REPL. Fixes #1348.
- Return correct values for
listenwhen applied to file streams. This is done by checking for available bytes using read when poll/select indicate the next read will not block. Otherwise use non-blocking read. Fixes #1404. - Prevent format parameters from appearing after colon or at sign modifiers.
- Avoid putting NIL into simple LOOP when compiling format directives.
Optimizations
- Arithmetic comparisons between floats and fixnums no longer cons.
Version 2.1.0 (LLVM14) 2023-01-01
Added
- Add
ext:list-all-logical-hostsandext:logical-host-pfunctions to query the current logical host status. - Operators for profiling CLOS code:
clos:with-profiling
Changed
- Removed stage and image format command line options (
-tand-T) and replaced with options to specify image or snapshot file (--imageor--snapshot) and--baseoption for loading base image when extensions are present. print-unreadable-objectnow prints qualified symbols for the:type toption and usespprint-logical-blockwhen pretty printing.
Fixes
ext:run-programworks with string streams.print-objectis now invoked for all calls towrite.slot-unboundis called for unbound condition slots (#1390).- Multiple inheritance of class-allocated slots is resolved breadth-first (#1392).
Version 2.0.0 (LLVM14) 2022-10-26
This release is dedicated to Dr. Karsten Poeck, who died after a short illness in July of 2022. Karsten made many significant contributions to Clasp, including reviving and solidifying our test frameworks. We are saddened by his sudden passing, and will miss the insightful conversations with him.
Added
- Lisp based koga metabuilder that outputs Ninja build files.
- basic Debian packaging files.
core:*extension-systems*,core:*initialize-hooks*andcore:*terminate-hooksdynamic variables have been added to support new extension loading method.core:*extension-systems*is a list of keywords that name extension systems to load after Clasp starts and before--loadand--evalcommand line options are processed. The remaining two variables are lists of functions that are called to do initialization before a REPL is started and termination after the REPL exits.--script <file>command line option which equivalent to passing--norc,--noinformand--non-interactive. Any shebang in<file>will also be skipped.- Asynchronous external process control with
ext:run-program. - Function
ext:temporary-directorythat returns the directory used for temporary files. - Function
ext:printing-char-pthat returns non-NIL for graphic characters that are not blank glyphs. This is an extension of the ANSI specification that defines "printing" characters as graphic characters aside from the space character.
Changed
core:lisp-implementation-idandcore:clasp-git-full-commitonly return non-NILvalues if Clasp was built in a git working tree.graphic-char-p,alpha-char-p,alphanumericp,upper-case-p,lower-case-p,both-case-p,char-upcaseandchar-downcasenow no longer depend on C++ locale functions and are now generated directly from the Unicode character tables.- Loading of extensions such as Cando no longer uses startup scripts via LOAD. Instead the systems associated with each extension are loaded via QL:QUICKLOAD or as a fallback ASDF:LOAD-SYSTEM.
- Behavior of
--rccommand line option has changed. Relative paths passed via this option are no longer assumed to be located in the user's home directory. - The logical hosts used by Clasp to locate source code and other
components of Clasp has been changed. Only the reserved logical host
SYS is now used. The default mappings for a system installed to
/usr/areSYS:LIB;**;*.*.*↦/usr/lib/clasp/**/*.*SYS:GENERATED;**;*.*.*↦/usr/share/clasp/generated/**/*.*SYS:EXECUTABLE;**;*.*.*↦/usr/bin/**/*.*SYS:QUICKLISP;**;*.*.*↦~/quicklisp/**/*.*SYS:**;*.*.*↦/usr/share/clasp/**/*.*
- ASDF systems that are loaded as part the cclasp image are now marked as immutable thereby preventing ASDF from overwriting them. These systems include the systems acclimation, alexandria, clasp-cleavir, cleavir-ast-to-bir, cleavir-ast, cleavir-ast-transformations, cleavir-attributes, cleavir-bir, cleavir-bir-transformations, cleavir-compilation-policy, cleavir-conditions, cleavir-cst-to-ast, cleavir-ctype, cleavir-environment, cleavir-io,cleavir-meter, cleavir-primop, cleavir-set, cleavir-stealth-mixins, closer-mop, concrete-syntax-tree, concrete-syntax-tree-base, concrete-syntax-tree-destructuring, concrete-syntax-tree-lambda-list, eclector, and eclector-concrete-syntax-tree.
- Source code file references for Lisp and C/C++ files compiled as part of the Clasp binary or images are now stored using logical pathnames.
- Unicode character database updated to 2022-08-03.
Removed
core:*extensions-startup-loads*andcore:*extensions-startup-evals*dynamic variables have been removed since they are no longer used.- The
--resources-dircommand line option has been removed. Equivalent behavior is achieved with theCLASP_HOMEenvironment variable.
Enhancements
make-instanceand CLOS slot access functions can be used with structure objects.- The stepper, accessible through
step, now has basic functionality. gctools:save-lisp-and-dienow accepts a key:executablewhich can be used to create an executable binary with the snapshot embedded in the binary.garbage-collect,finalize, andsave-lisp-and-dieare now exported from theextinterface package.
Optimizations
- Arguments to and return values from local functions (e.g. from FLET) are passed unboxed in some common cases.
- Nonlocal exits are much faster in most cases, the exception being when the exit goes through uncooperative C++ code.
- Types inferred for many standard functions are tighter.
- Calls to some local functions with &rest parameters are more efficient.
- LENGTH is now a "vaslistable" function; &rest parameters that are only used for vaslistable functions can be compiled to avoid consing.
- Multiple value calls and APPLY calls to known functions can sometimes be optimized.
- Some MAKE-ARRAY calls are compiled more efficiently.
- Unused calls to many more (side-effect-free) standard functions are deleted.
- Accesses to 1D simple arrays of known element type are a bit faster.
- A virtual machine has been defined and implemented, greatly increasing the speed of evaluation of code that doesn't usually need to be optimized (for example, compile-time evaluations).
- The building process has been streamlined by replacing several of the bootstrapping components with the virtual machine.
- Discriminating functions now execute faster.
- The compiler now performs inlining much faster.
Fixes
- Replace hard coded paths to
nmin snapshot code with NM_BINARY macro value set by configure. - Clasp can now be built directly from source. Resolves issue #175.
- Snapshots now parse command line options such as
--noinform,--noprint,--quit, and--disable-debugger. - Source locations for warnings from errors during constant folding now print correctly.
- Unused calls that must remain in safe code are no longer deleted.
- Prevent negative zero remainder in core__next_ftruncate. Fixes #1368.
Version 1.0.0 (LLVM13) 2022-03-26
Added
- ed hooks functionality for
edfunction. Accessible via*ed-functions*dynamic variable. - Implemented
save-lisp-and-die. This saves the state of a running environment for loading and fast startup later. Our most complex environment Cando starts up in ~4 seconds, which is 10x faster than the old startup that loaded libraries. - Atomics interface for lock-free concurrent programming, in the
mp:package. - Garbage collection hooks including finalizers.
clasp-debuginterface so that IDEs like SLIME can retrieve backtraces and more to present during debugging.
Enhancements
- New compiled library format called FASP - it uses concatenated object files.
- Specialized arrays for sub-byte integer types (int2, int4, etc.)
- Source tracking: Code locations are associated with source locations via DWARF, to aid in debugging and project navigation.
- Fully integrated the customizable reader ECLECTOR
Fixes
- Fixed many errors identified by the ansi-test-suite ANSI
Version 0.5.0
- Full integration of the Cleavir/SICL compiler by Robert Strandh
- A nascent type inference system within Cleavir by Alex Wood
- LLVM whole program, Link-Time-Optimization
- Multi threading compatible with Bordeaux threads
- Unicode, 32bit wide characters
- Specialized arrays for many primitive types (int8, int16, int32, int64, double, float)
- CFFI (C Foreign Function Interface)
- New build system based on waf (https://github.com/waf-project/waf)
- Code and file cleanup
- Better Emacs and Slime support including jumping to source (C++ and CL), tab-completion and lambda-list display
- Many, many improvements and bug fixes
Version 0.4.0
- Clasp has a completely new compiler! The Cleavir Common Lisp compiler developed by Robert Strandh as part of his SICL project. Cleavir is an advanced compiler that generates fast code and is an excellent compiler for testing advanced optimization algorithms. Cleavir carries out escape analysis to properly assign variables to the stack/heap and it does aggressive inlining. The best code that Cleavir generates has clocked within a factor of four of the speed of C. For more details see SICL
- Fixnum, character and single-float types are now immediate values
and fixnums are tagged using
#b000in the bottom three bits to allow fast integer arithmetic. - General object pointers are tagged, cons cells have a separate tag to accelerate are tagged.
- Building Clasp has been accelerated and now takes about 2.5 hours on a reasonably powerful Linux system and 3.5 hours on OS X.
- Clbind library allows programmers to expose external C++ libraries to Clasp Common Lisp.
- The build system has been improved and externals-clasp has been eliminated as a requirement.
- Clasp version 0.4.0 is a Boehm only version of Clasp. The Memory Pool System garbage collector is being tuned for Clasp and is planned to be in the 0.5.0 release.
Version 0.11
- Added ASDF support. This is still alpha. Compile the ASDF module
using
(core:compile-asdf). After that you can load the module using(load "sys:kernel;asdf;build;asdf.bundle"). It takes between 15-30 seconds to load (this is why I'm integrating Cleavir). - Added
:CLASPto*features*and removed:ECLfrom*features*. Clasp will continue to mimic the underlying ECL functionality so that Common Lisp code that supports ECL can be made to support Clasp by converting#+eclto#+(or ecl clasp)and#-eclto#-(or ecl clasp) - Added code to generate object files directly from Clasp. The LLVM bitcode compiler "llc" no longer needs to be in the PATH for Clasp to generate object files from Common Lisp source. The "ld" linker does need to be accessible.