Lisp

1. Common Lisp   cl common lisp

properties ID: af0ed8bb-4b45-42f9-b8be-82b8ea7935a3
CREATED: <2025-02-16 Sun 20:04>
AKA: CL
edges

Common Lisp
common-lisp-libraries
CL ANSI Standard Draft
CLHS Starting Points
quotes
CDR - Common Lisp Document Repository
<- SBCL
<- ECL


The most powerful dialect of the most expressive language.

'Common' Lisp (CL) refers to any implementation of the ANSI CL Standard which fully describes the language.

CL began appearing in the Lisp world around 1984 and the spec itself was finalized in 1994. For the most part, the spec is a good enough baseline for a complete, high-level general-purpose language - which says a lot for a 30+ yr old description of a language without a reference implementation (that I know of).

Today () the best implementation of ANSI CL available is SBCL.

1.1. Basic Syntax

properties ID: df41336d-5185-4047-9644-e25925529f08
CREATED: <2025-02-25 Tue 16:05>
  • Pragmatic Parsing in Common Lisp - ACM Lisp Pointers 4, 2 (Apr/Jun 1991), 3-15.
  • CLiki: Case sensitivity

    The common misconception is that Common Lisp is case insensitive. This is not true - symbols in Common Lisp are case sensitive.

    By default, the Common Lisp reader is case-converting: all unescaped characters in a symbol name get upper-cased. This gives the practical effect of making it seem as though symbol case doesn't matter. This is desirable behavior for interfacing with other case-insensitive languages (such as Fortran), but a pain to interface with case-sensitive ones (such as C).

    Luckily the behavior of the reader can be customized via readtable-case.

    The one that might seem to be most useful for having case-sensitive symbols at first glance is :preserve, however remember that all code read in with the default setting (:upcase) is in upper-case, as are all the standard Common Lisp symbols (this is defined by the standard), so this means you will need to spell out all CL and external symbols IN ALL UPPERCASE. To make this less annoying, the :invert readtable-case is the most practical: all-lowercase symbol names become uppercase, all-uppercase become lowercase, and mixed-case stays mixed-case (the important part for case sensitivity). The Lisp printer outputs symbol names correctly this way by default. The only problem now becomes inconsistent spelling of a symbol in all lowercase or all uppercase in old code that expects case conversion. But otherwise you can get case sensitivity for your software by setting readtable-case to :invert today.

1.1.1. S-Expressions

properties ID: 4e502dc1-c22d-444e-b4c0-864876f0cdf5
CREATED: <2025-03-13 Thu 19:47>
edges

wiki


1.1.2. common-lisp unicode support

properties ID: db68087d-cc4c-462d-b4e0-bbda756dc37c
CREATED: <2025-03-03 Mon 14:53>
logbook
  • State "NOTE" from
(defmacro λ (&rest symbols-and-expr)
  `(lambda ,(butlast symbols-and-expr)
     ,@(last symbols-and-expr)))

(mapcar (λ x (* x x)) '(1 2 3 4))

;; other tremendously useful characters:
'|αβγδεζηθικλμνξοπρστυϕχψω|
'|ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥϕΧΨΩ|
'|ℝℕℤℚ∥√∡∞∝ℵ∅∫|
'|¬∀∃∨∧⊥∈⊂∪∩⇐⇔⇒↦|

1.2. CLOS

properties ID: 8bc4ff14-f001-4515-ac1f-fd59ef8ef506
CREATED: <2025-02-07 Fri 20:59>
edges

Fundamentals of CLOS
Object Reorientation: Generic Functions
CLHS Chapter 7
<- EIEIO


1.2.1. Method Combination

properties ID: 4e7b8135-3d53-4739-9a72-563971a5b876
CREATED: <2025-01-17 Fri 19:19>
edges

28.1.7.2. Standard Method Combination
28.1.7.3. Declarative Method Combination
28.1.7.4. Built-in Method Combination Types
CLHS Macro DEFINE-METHOD-COMBINATION


  • simple built-in method combination types

The names of the built-in method combination types are +, and, append, list, max, min, nconc, or, progn, and standard.

(define-method-combination xor :identity-with-one-argument t)

1.2.2. MOP

properties ID: f9d8eead-51ab-4589-a5c2-2569ea1b7abd
CREATED: <2025-08-20 Wed 21:46>
AKA: Meta-Object Protocol
edges

MOP: Concepts


1.3. Types

properties ID: 3f613b5a-6aae-4852-a4d8-c322c271e6eb
CREATED: <2025-06-06 Fri 18:42>
'(arithmetic-error function simple-condition array generic-function
  simple-error atom hash-table simple-string base-char integer
  simple-type-error base-string keyword simple-vector bignum list
  simple-warning bit logical-pathname single-float bit-vector long-float
  standard-char broadcast-stream method standard-class built-in-class
  method-combination standard-generic-function cell-error nil
  standard-method character null standard-object class number
  storage-condition compiled-function package stream complex
  package-error stream-error concatenated-stream parse-error string
  condition pathname string-stream cons print-not-readable
  structure-class control-error program-error structure-object
  division-by-zero random-state style-warning double-float ratio symbol
  echo-stream rational synonym-stream end-of-file reader-error t error
  readtable two-way-stream extended-char real type-error file-error
  restart unbound-slot file-stream sequence unbound-variable fixnum
  serious-condition undefined-function float short-float unsigned-byte
  floating-point-inexact signed-byte vector
  floating-point-invalid-operation simple-array warning
  floating-point-overflow simple-base-string floating-point-underflow
  simple-bit-vector)
ARITHMETIC-ERROR
FUNCTION
SIMPLE-CONDITION
ARRAY
GENERIC-FUNCTION
SIMPLE-ERROR
ATOM
HASH-TABLE
SIMPLE-STRING
BASE-CHAR
INTEGER
SIMPLE-TYPE-ERROR
BASE-STRING
KEYWORD
SIMPLE-VECTOR
BIGNUM
LIST
SIMPLE-WARNING
BIT
LOGICAL-PATHNAME
SINGLE-FLOAT
BIT-VECTOR
LONG-FLOAT
STANDARD-CHAR
BROADCAST-STREAM
METHOD
STANDARD-CLASS
BUILT-IN-CLASS
METHOD-COMBINATION
STANDARD-GENERIC-FUNCTION
CELL-ERROR
NIL
STANDARD-METHOD
CHARACTER
NULL
STANDARD-OBJECT
CLASS
NUMBER
STORAGE-CONDITION
COMPILED-FUNCTION
PACKAGE
STREAM
COMPLEX
PACKAGE-ERROR
STREAM-ERROR
CONCATENATED-STREAM
PARSE-ERROR
STRING
CONDITION
PATHNAME
STRING-STREAM
CONS
PRINT-NOT-READABLE
STRUCTURE-CLASS
CONTROL-ERROR
PROGRAM-ERROR
STRUCTURE-OBJECT
DIVISION-BY-ZERO
RANDOM-STATE
STYLE-WARNING
DOUBLE-FLOAT
RATIO
SYMBOL
ECHO-STREAM
RATIONAL
SYNONYM-STREAM
END-OF-FILE
READER-ERROR
T
ERROR
READTABLE
TWO-WAY-STREAM
EXTENDED-CHAR
REAL
TYPE-ERROR
FILE-ERROR
RESTART
UNBOUND-SLOT
FILE-STREAM
SEQUENCE
UNBOUND-VARIABLE
FIXNUM
SERIOUS-CONDITION
UNDEFINED-FUNCTION
FLOAT
SHORT-FLOAT
UNSIGNED-BYTE
FLOATING-POINT-INEXACT
SIGNED-BYTE
VECTOR
FLOATING-POINT-INVALID-OPERATION
SIMPLE-ARRAY
WARNING
FLOATING-POINT-OVERFLOW
SIMPLE-BASE-STRING
FLOATING-POINT-UNDERFLOW
SIMPLE-BIT-VECTOR

1.3.1. Pathnames

properties ID: 6935daca-1ad0-45b0-97e5-f59745f06ad9
CREATED: <2026-05-04 Mon 20:30>
edges

sbcl#pathnames
CLHS: System Class PATHNAME


;;; FIXME: the below shouldn't really be here, but in documentation
;;; (chapter 19 makes a lot of requirements for documenting
;;; implementation-dependent decisions), but anyway it's probably not
;;; what we currently do.
;;;
;;; Unix namestrings have the following format:
;;;
;;; namestring := [ directory ] [ file [ type [ version ]]]
;;; directory := [ "/" ] { file "/" }*
;;; file := [^/]*
;;; type := "." [^/.]*
;;; version := "." ([0-9]+ | "*")
;;;
;;; Note: this grammar is ambiguous. The string foo.bar.5 can be
;;; parsed as either just the file specified or as specifying the
;;; file, type, and version. Therefore, we use the following rules
;;; when confronted with an ambiguous file.type.version string:
;;;
;;; - If the first character is a dot, it's part of the file. It is not
;;; considered a dot in the following rules.
;;;
;;; - Otherwise, the last dot separates the file and the type.
;;;
;;; Wildcard characters:
;;;
;;; If the directory, file, type components contain any of the
;;; following characters, it is considered part of a wildcard pattern
;;; and has the following meaning.
;;;
;;; ? - matches any one character
;;; * - matches any zero or more characters.
;;; [abc] - matches any of a, b, or c.
;;; {str1,str2,...,strn} - matches any of str1, str2, ..., or strn.
;;;   (FIXME: no it doesn't)
;;;
;;; Any of these special characters can be preceded by an escape
;;; character to cause it to be treated as a regular character.
  1. Logical Pathnames
    properties ID: bbdc87f1-cece-474f-905e-d02401e82510
    CREATED: <2026-05-04 Mon 20:30>
    edges

    Zach Beane Common Lisp – Logical pathnames and eager parsing
    CLHS: System Class LOGICAL-PATHNAME


    A pathname that uses a namestring syntax that is implementation-independent, and that has component values that are implementation-independent. Logical pathnames do not refer directly to filenames.

    ;;; Logical pathnames have the following format:
    ;;;
    ;;; logical-namestring ::=
    ;;;      [host ":"] [";"] {directory ";"}* [name] ["." type ["." version]]
    ;;;
    ;;; host ::= word
    ;;; directory ::= word | wildcard-word | **
    ;;; name ::= word | wildcard-word
    ;;; type ::= word | wildcard-word
    ;;; version ::= pos-int | newest | NEWEST | *
    ;;; word ::= {uppercase-letter | digit | -}+
    ;;; wildcard-word ::= [word] '* {word '*}* [word]
    ;;; pos-int ::= integer > 0
    ;;;
    ;;; Physical pathnames include all these slots and a device slot.
    

1.3.2. Simple Types

properties ID: 62417b14-efff-448d-92c0-5b0e99a180ee
CREATED: <2025-06-06 Fri 18:42>
'(simple-array
  simple-base-string
  simple-bit-vector
  simple-string
  simple-type-error
  simple-vector

  simple-condition
  simple-error
  simple-warning)
SIMPLE-ARRAY
SIMPLE-BASE-STRING
SIMPLE-BIT-VECTOR
SIMPLE-STRING
SIMPLE-TYPE-ERROR
SIMPLE-VECTOR
SIMPLE-CONDITION
SIMPLE-ERROR
SIMPLE-WARNING

1.4. Conditions

properties ID: 1535ca58-7141-4886-a1c0-90e4f29fc2c9
CREATED: <2025-06-05 Thu 22:00>
edges

CLHS: Chapter 9
Common Lisp: condition system
Conditions (ANSI Common Lisp)
Common Lisp: A Tutorial on Conditions and Restarts
Conditions and Restarts in Common Lisp – Talking with a Lisp
29. Conditions
CLHS: Chapter 9


  • - the CL condition still baffles me - it is deeply expressive but I find it difficult to use. This might just be because there's nothing nearly as capable in other langs I've used.
  • serious-condition implies the need for user input, signaled with error instead of signal or warn.
  • CLHS style recommendations CLHS: Section 9.1.3.1
    • uppercase first letter, use complete sentences and correct punctuation.
    • don't prefix the message with things like 'Error: ' or even a newline. That's the job of the condition reporter
    • it is permissible to embed newlines in messages (just not before or after)
    • Avoid use of the #\Tab character
    • Don't mention the containing function. That's the job of the debugger

1.5. Reader

properties ID: d185b690-d2f8-46b9-a32d-2a95f0ee6d82
CREATED: <2025-08-22 Fri 16:53>
  • quick tip for reader macros - don't forget importance of the . syntactic sugar

    '(foo . #.(list 1 2 3))
    
    FOO 1 2 3
    (let ((a (list 1 2 3)))
      (equalp
       `(0 . ,a)
       ;; OR
       `(0 ,@a)))
    
    T
    

1.6. Printer

properties ID: 0cdc5eb0-a12a-4276-8382-0b81f661a2a8
CREATED: <2025-08-17 Sun 20:12>
edges

CLHS: Chapter 22


1.6.1. Pretty Printer

properties ID: 681706ba-d885-46bf-93ba-c8e051c79aeb
CREATED: <2025-08-17 Sun 20:13>
edges

CLHS: Section 22.2
XP: A Common Lisp Pretty Printing System (1989)


Permits programs to redefine the way in which code is displayed and allow pretty printing to be applied to complex data structures.

The 'prettiness' of any particular output is somewhat subjective but in general the pretty printer allows individual programs to achieve an arbitrary degree of aesthetic control.

The pretty printer is driven entirely by dispatch based on the value of *PRINT-PPRINT-DISPATCH* which is modified using SET-PPRINT-DISPATCH.

  • Dynamic Control of the Arrangement of Output

    The actions of the pretty printer when a piece of output is too large to fit in the space available can be precisely controlled. Three concepts underlie the way these operations work—logical blocks, conditional newlines, and sections.

    Whenever possible, the pretty printer displays the entire contents of a section on a single line. However, if the section is too long to fit in the space available, line breaks are inserted at conditional newline positions within the section.

  • tip: make sure to use the variables in code - for example the *PRINT-PRETTY* var can be used to indicate color output is allowed in PRINT-OBJECT methods.

A primary goal of pretty printing is to keep the output between a pair of margins. The column where the output begins is taken as the left margin. If the current column cannot be determined at the time output begins, the left margin is assumed to be zero. The right margin is controlled by print-right-margin.

1.7. Debugging

properties ID: 4d5f7613-0441-4f69-b559-24f12ae39e15
CREATED: <2026-03-30 Mon 20:02>
edges

CLHS: Section 25.1.2


1.8. Format Directives

properties ID: 852b2c7f-238e-480d-ad63-3b5b53c58929
CREATED: <2025-02-14 Fri 20:20>
edges

Pretty Print Table Data in Common Lisp
A Few FORMAT Recipes


(let ((list-fmt "~@{~a ~^~}"))
  (format nil list-fmt) ;; ""
  (format nil list-fmt 1 2 3))
1 2 3 
  • Note that the extension mechanism (~/foo/) is clunky - the character / isn't allowed in the function designator.
  • The core includes an annotation system (WIP )
    • annotations are similar to format directives, just with a different prefix character - usually % (emacs style).
    • annotations are expanded as early as possible into a FORMAT control-string

1.9. Functions

properties ID: ebbc665a-10c3-46a3-8052-4f46bc9ac2b1
CREATED: <2025-02-25 Tue 16:08>
edges

5.2. Functions


1.9.1. Lambda Expressions

properties ID: 7555f8c6-5dd5-4607-ae1f-32643bf03ba9
CREATED: <2025-02-25 Tue 16:09>
edges

5.2.2. Lambda-Expressions


This is not SBCL specific, but according to the ANSI Common Lisp standard.

Convert a Lambda Expression as List to a Function

These are your options:

CL-USER 168 > (funcall (coerce '(lambda (x) (* x x)) 'function) 4) 16

CL-USER 169 > (funcall (compile nil '(lambda (x) (* x x))) 4) 16

CL-USER 170 > (funcall (eval '(lambda (x) (* x x))) 4) ; because LAMBDA is a macro, too 16 CL-USER 171 > (funcall (eval '(function (lambda (x) (* x x)))) 4) 16

Note though that the lambda expression is referencing the null lexical environment. Thus it has no access to any lexical variables from the surrounding code.

Lambda expressions are not function objects

Why is a lambda expression not a function?

Because it is just a list, not code. To make a lambda expression into code, you have to turn it into a function object.

Some other (often older) Lisps allow you to use lambda expressions as code, but not Common Lisp. This is defined by the standard.

You can't do (funcall '(lambda (x) (+ x x)) 3). You have to convert the lambda expression into a function object first.

FUNCTION is a special operator -> syntax+semantics

(funcall (function (struct-slot1 struct1)) 3)

This is a syntax error, already. FUNCTION is a special operator and expects a function name or a lambda expression. (struct-slot1 struct1) is neither. (struct-slot1 struct1) is code which retrieves a value from a structure. But it is not a function name, which would be a symbol or a list (setf <some-symbol>). It is also not a lambda expression, which would be something like (lambda (…) . ..).

1.9.2. Thunk

properties ID: d69c0095-59e3-4005-8360-f928c3ace460
CREATED: <2025-02-28 Fri 17:43>
  • from tagbody in Lisp discord

the inventors of the thunk recalling that the term "was coined after they realized (in the wee hours after hours of discussion) that the type of an argument in Algol-60 could be figured out in advance with a little compile-time thought […] In other words, it had 'already been thought of'; thus it was christened a thunk, which is 'the past tense of "think" at two in the morning'.

1.10. Loop

properties ID: 439a02f1-afcf-4ba3-bdf4-0304d152ba6f
CREATED: <2025-02-16 Sun 19:40>
edges

-> SB-LOOP
LOOP for Black Belts


Most of the so-called iteration control clauses start with the loop keyword for, or its synonym as,2 followed by the name of a variable. What follows after the variable name depends on the type of for clause.

The subclauses of a for clause can iterate over the following:

,* Ranges of numbers, up or down, by specified intervals ,* The individual items of a list ,* The cons cells that make up a list ,* The elements of a vector, including subtypes such as strings and bit vectors ,* The pairs of a hash table ,* The symbols in a package ,* The results of repeatedly evaluating a given form

A single loop can have multiple for clauses with each clause naming its own variable. When a loop has multiple for clauses, the loop terminates as soon as any for clause reaches its end condition. For instance, the following loop:

(loop for item in list for i from 1 to 10 do (something))

will iterate at most ten times but may stop sooner if list contains fewer than ten items.

The Parts of a LOOP

You can do the following in a LOOP:

,* Step variables numerically and over various data structures ,* Collect, count, sum, minimize, and maximize values seen while looping ,* Execute arbitrary Lisp expressions ,* Decide when to terminate the loop ,* Conditionally do any of these

Additionally, LOOP provides syntax for the following:

,* Creating local variables for use within the loop ,* Specifying arbitrary Lisp expressions to run before and after the loop proper

The basic structure of a LOOP is a set of clauses, each of which begins with a loop keyword.1 How each clause is parsed by the LOOP macro depends on the keyword. Some of the main keywords, which you saw in Chapter 7, are for, collecting, summing, counting, do, and finally.

Iterating over a hash table or package is slightly more complicated because hash tables and packages have different sets of values you might want to iterate over–the keys or values in a hash table and the different kinds of symbols in a package. Both kinds of iteration follow the same pattern. The basic pattern looks like this:

(loop for var being the things in hash-or-package …)

For hash tables, the possible values for things are hash-keys and hash-values, which cause var to be bound to successive values of either the keys or the values of the hash table. The hash-or-package form is evaluated once to produce a value, which must be a hash table.

To iterate over a package, things can be symbols, present-symbols, and external-symbols, which cause var to be bound to each of the symbols accessible in a package, each of the symbols present in a package (in other words, interned or imported into that package), or each of the symbols that have been exported from the package. The hash-or-package form is evaluated to produce the name of a package, which is looked up as if by FIND-PACKAGE or a package object. Synonyms are also available for parts of the for clause. In place of the, you can use each; you can use of instead of in; and you can write the things in the singular (for example, hash-key or symbol).

Finally, since you'll often want both the keys and the values when iterating over a hash table, the hash table clauses support a using subclause at the end of the hash table clause.

(loop for k being the hash-keys in h using (hash-value v) …) (loop for v being the hash-values in h using (hash-key k) …)

Both of these loops will bind k to each key in the hash table and v to the corresponding value. Note that the first element of the using subclause must be in the singular form.4

If none of the other for clauses supports exactly the form of variable stepping you need, you can take complete control over stepping with an equals-then clause. This clause is similar to the binding clauses in a DO loop but cast in a more Algolish syntax. The template is as follows:

(loop for var = initial-value-form [ then step-form ] …)

As usual, var is the name of the variable to be stepped. Its initial value is obtained by evaluating initial-value-form once before the first iteration. In each subsequent iteration, step-form is evaluated, and its value becomes the new value of var. With no then part to the clause, the initial-value-form is reevaluated on each iteration to provide the new value. Note that this is different from a DO binding clause with no step form.

The step-form can refer to other loop variables, including variables created by other for clauses later in the loop. For instance:

(loop repeat 5 for x = 0 then y for y = 1 then (+ x y) collect y) ==> (1 2 4 8 16)

However, note that each for clause is evaluated separately in the order it appears. So in the previous loop, on the second iteration x is set to the value of y before y changes (in other words, 1). But y is then set to the sum of its old value (still 1) and the new value of x. If the order of the for clauses is reversed, the results change.

(loop repeat 5 for y = 1 then (+ x y) for x = 0 then y collect y) ==> (1 1 2 4 8)

Often, however, you'll want the step forms for multiple variables to be evaluated before any of the variables is given its new value (similar to how DO steps its variables). In that case, you can join multiple for clauses by replacing all but the first for with and. You saw this formulation already in the LOOP version of the Fibonacci computation in Chapter 7. Here's another variant, based on the two previous examples:

(loop repeat 5 for x = 0 then y and y = 1 then (+ x y) collect y) ==> (1 1 2 3 5)

  • The possible verbs are collect, append, nconc, count, sum, maximize, and minimize. Also available as synonyms are the present participle forms: collecting, appending, nconcing, counting, summing, maximizing, and minimizing.
  • As an extra bit of syntactic sugar, within the first loop clause, after the test form, you can use the variable it to refer to the value returned by the test form. For instance, the following loop collects the non-NIL values found in some-hash when looking up the keys in some-list: (loop for key in some-list when (gethash key some-hash) collect it)

1.11. Concurrency

properties ID: d9062d16-09f0-4c48-99ac-2e26407fc75b
CREATED: <2025-03-06 Thu 14:01>
edges

-> Asynchrony
<< lparallel
Threads, concurrency, parallelism


1.12. Macros

properties ID: 1ccb1faa-6e41-4b4f-877f-4382bc250e53
CREATED: <2025-02-16 Sun 19:40>
edges

Let Over Lambda


1.12.1. Compiler Macros

properties ID: 961d0c81-11f0-49e2-8ccb-9c31f6b6528d
CREATED: <2025-02-28 Fri 18:27>
edges

CLHS: Section 3.2.2.1


1.13. Applications

properties ID: 475491e1-eacd-4759-be06-1c027e91f565
CREATED: <2025-01-17 Fri 19:19>

1.13.1. screenshotbot-oss

properties ID: 54d32d4a-93fe-4f4d-9207-f291dbb1edc6
CREATED: <2025-01-17 Fri 19:20>
edges

screenshotbot/screenshotbot-oss


A Screenshot Testing service to tie with your existing Android, iOS and Web screenshot tests.

1.13.2. Nyxt

properties ID: c57d3869-02d6-4e5d-bb09-804d18c07124
CREATED: <2025-08-30 Sat 21:37>
edges

Nyxt browser: The hacker's browser


1.13.3. Lem

properties ID: 10097b58-8a54-4ce2-84e9-ff15d4d0f5bf
CREATED: <2025-08-30 Sat 21:37>
edges

Lem


1.13.4. StumpWM

properties ID: abcd966f-fd1b-4679-b956-fc4891647668
CREATED: <2025-08-30 Sat 21:38>
edges

Stump Window Manager


1.13.5. Genera

properties ID: b34c6e3f-6559-4d7e-a554-b7b83ccc4d8c
CREATED: <2025-11-09 Sun 01:13>
edges

>> Symbolics


1.14. Libraries

properties ID: 82d4dffa-070c-4ead-b317-9f9b6820e2c1
CREATED: <2025-02-22 Sat 15:15>

1.14.1. CL-PPCRE

properties ID: f666c1b5-2900-44a2-85ba-2afb029d32ab
CREATED: <2025-11-01 Sat 02:44>
edges

– [BROKEN LINK: github:edicl/cl-ppcre]
doc


CL-PPCRE is a portable regular expression library for Common Lisp which has the following features:

  • It is compatible with Perl (especially when used in conjunction with cl-interpol, to allow compatible parsing of regexp strings).
  • It is pretty fast.
  • It is portable between ANSI-compliant Common Lisp implementations.
  • It is thread-safe.
  • In addition to specifying regular expressions as strings like in Perl you can also use S-expressions.
  • It comes with a BSD-style license so you can basically do with it whatever you want.

1.14.2. one-more-re-nightmare

properties ID: cc72c2c8-8a05-432e-8e7a-844eb6c9ac15
CREATED: <2025-10-03 Fri 12:26>
edges

The one-more-re-nightmare compiler
– [BROKEN LINK: github:telekons/one-more-re-nightmare?]


1.14.3. CLIM   gui

properties ID: d68d93f2-dbeb-410c-8fee-af71d3a4b0a0
CREATED: <2025-03-13 Thu 17:56>
edges

CLIM 2 Specification - Common Lisp Interface Manager CLIM II Specification


  1. McCLIM
    properties ID: b93f8626-0816-4de6-b6bd-9c796be468e8
    CREATED: <2025-03-13 Thu 17:57>
    edges

    McCLIM - A powerful GUI toolkit for Common Lisp
    Guided Tour (2006)
    src
    McCLIM User's Manual


    McCLIM is a FOSS implementation of the Common Lisp Interface Manager specification.

    • Frame Redefinition

      By default when the application frame class is redefined with the macro clim:define-application-frame panes and layouts of the existing instances are not changed. To update the frame programmer must call the function reinitialize-instance. The function may be called on a running frame ouside of its event loop.

      McCLIM extends the macro clim:define-application-frame to update existing frames automatically when the new option :reinitialize-frames is not nil. Instances are updated by defining a method update-instance-for-redefined-class :after and making all instances obsolete. Then a slot of each adopted frame is read to trigger the update without delay.

      • When the option is nil (a default) then nothing happens.
      • When the option is t then all instances are updated by calling on them the function reinitialize-instance (running frames are updated immedietely and the reset whenever the implementation chose to call the function update-instance-for-redefined-class).
      • When the option is a plist then additionally this plist is prepended to initargs applied to the function reinitialize-instance.

1.14.4. CLX   gui

properties ID: 54ea6883-851d-4829-8f71-889aa7f58c45
CREATED: <2025-02-22 Sat 15:15>
edges

sharplispers/clx


clx/extensions

1.14.5. Shirakumo

properties ID: 503387d8-fa9c-4269-99bc-1d29415ab290
CREATED: <2025-03-02 Sun 20:09>
edges

Shirakumo · GitHub


Shinmera runs an indie-game studio based on CL and has contributed well over 10% of the Quicklisp ecosystem. Impressive effort and worthy of a dedicated info node here.

  1. Radiance   web
    properties ID: 1beb282b-8c4d-4561-a293-07439d0367ae
    CREATED: <2025-03-02 Sun 20:11>
    edges

    Shirakumo/radiance: A Common Lisp web application environment


  2. Alloy   gui
    properties ID: 8af234c8-1455-4dc8-a2df-e6d5b5777606
    CREATED: <2025-03-02 Sun 20:12>
    edges

    Shirakumo/alloy: A new user interface protocol and toolkit implementation


  3. Framebuffers
    properties ID: e70d50df-d897-4a5f-a669-fa5dc3f94b23
    CREATED: <2025-03-02 Sun 20:13>
    edges

    Shirakumo/framebuffers: A library for portable framebuffer access


1.14.6. Fukamachi

properties ID: 0fa56fd5-0b93-4b2f-be00-8197275bb5ef
CREATED: <2025-03-14 Fri 18:22>
edges

fukamachi (Eitaro Fukamachi) · GitHub


Tokyo-based Lisp hacker and web developer with some excellent CL packages.

  1. quri
    properties ID: df045d95-a55e-4e87-a450-cf683e0ebd19
    CREATED: <2025-03-14 Fri 19:04>
    edges

    GitHub - fukamachi/quri: Yet another URI library for Common Lisp


  2. clack   web
    properties ID: c9515816-fc3a-4976-a5ed-138cbec83aa9
    CREATED: <2025-03-14 Fri 19:04>
    edges

    GitHub - fukamachi/clack: Web server abstraction layer for Common Lisp


    • lack the core of clack

      Lack is a Common Lisp library which allows web applications to be constructed of modular components. It was originally a part of Clack, however it's going to be rewritten as an individual project since Clack v2 with performance and simplicity in mind.

      The scope is defining Lack applications and wrapping it up with Lack middlewares. On the other hand, Clack is an abstraction layer for HTTP and HTTP servers and provides unified API.

  3. woo   web
    properties ID: 98b691b5-a617-438e-80ec-fb31588bcc3e
    CREATED: <2025-03-14 Fri 19:04>
    edges

    GitHub - fukamachi/woo: A fast non-blocking HTTP server on top of libev


  4. sxql   sql
    properties ID: ac5922a8-06c6-4608-8305-ec42ceea4ee9
    CREATED: <2025-03-14 Fri 19:04>
    edges

    GitHub - fukamachi/sxql: An SQL generator for Common Lisp.


1.14.7. Coalton

properties ID: 20ea4fcc-e435-4738-93f3-a29572f0919b
CREATED: <2025-03-14 Fri 18:23>
edges

src
The Coalton Language


Coalton is an efficient, statically typed functional programming language that supercharges Common Lisp.

1.14.8. Gambol   prolog

properties ID: a911344d-aed1-4603-a46f-e8edf53756f5
CREATED: <2025-03-04 Tue 18:09>
edges

CLiki: Gambol
-> Prolog


See also A Common Prolog

  • in any case we basically always want to drop into a Read-Query-Print loop
  • in Common Prolog this function is called RQP

1.14.9. lparallel

properties ID: c560dc07-8c9c-42bc-9ce1-634630d26981
CREATED: <2025-03-06 Thu 14:02>
edges

Lisp in Parallel : lparallel | (ql:quickload :lparallel)
>> Concurrency


  • provides thread-pools in the form of kernels
  • our implementation in the core is very similar but we use the 'thread-pool' terminology. We also provide a general purpose KERNEL slot for many types of objects including thread-pools and workers. For workers the kernel is called to start the worker loop and in thread-pools it is called with a single keyword argument to change the state of the thread-pool.

1.14.10. parenscript   js

properties ID: c42732ce-9ef1-408b-a9dd-2424d05de398
CREATED: <2025-06-04 Wed 14:07>
edges

Parenscript
-> Javascript


  • Compiling Parenscript | jsloop

    Parenscript is a subset of Common Lisp that compiles to JavaScript. The emphasis is on the fact that it strives to produce minimal JavaScript like 1:1 as much as possible. Unlike ClojureScript which produces a lot of dependent code because of the use of Google Closure library for everything.

1.14.11. jscl   js

properties ID: 3addee17-b990-4a6d-9767-071969ed9d0e
CREATED: <2025-03-02 Sun 20:51>
edges

jscl-project/jscl: A Lisp-to-JavaScript compiler bootstrapped from Common Lisp
-> Javascript


A CL to JS compiler

  • supplies a light js runtime with a web worker
  • lisp code compiled directly to js stream
  • supports CL/JS ffi

1.14.12. Symbolics

properties ID: b8d8538c-7be9-4271-bf8e-897e9ba5b6ad
CREATED: <2025-11-09 Sun 01:14>
edges

<< Genera


  • TODO find web source to link to
  • /var/lib/symbolics/sys.sct
    • demo/organ.lisp
    • io/iterators.lisp
    • io/rtc.lisp (fsm)
  • wisdom from clim/demo/thinkadot.lisp:

    ;;; in all node-state stuff, t = left, nil = right
    (defstruct td-node
      (direction t)
      left-successor
      right-successor
      x
      y
      (color-phase nil)
      (entry-p nil))
    

1.14.13. CL-GSERVER

properties ID: 0aa28dd2-d424-4021-a775-095439dffd7a
CREATED: <2026-03-06 Fri 21:29>
AKA: Sento
edges

– [BROKEN LINK: github:mdbergmann/cl-gserver]


An actor framework

1.14.14. C-mera

properties ID: 26cd6032-0e6e-4f9b-ae9f-2b88aa95dafc
CREATED: <2025-09-30 Tue 18:08>
edges

– [BROKEN LINK: github:kiselgra/c-mera]


C-Mera is a particularly powerful Lisp system - it's a source2source transpiler built entirely on Lisp Macros.

It can be a bit difficult to navigate the source, and in our case mimick it in our own implementation - our fork is in SYN/GEN, and utilizes AST nodes from OBJ/AST - it is not limited to just C languages and so the design may be quite different in some places.

The first oddity in C-Mera's source comes in the system definition c-mera.asd. All packages and symbol exports are set here with several variables defined for lists of symbols.

CL-SYMBOLS
all external symbols in the COMMON-LISP package
DEFAULT-EXPORTS
default package exports
C-MERA-BACKEND
global ast + slot symbols

In the case of C we have the following symbols bound:

C-BACKEND
ast + slot symbols
C-SYMBOLS
list used for package definition with shadowed symbols and for the cm/lisp scope switch
C-SYNTAX
symbols not shadowed but exported
C-EXPORTS
the full list of exports - includes C-SYMBOLS, C-SYNTAX, DEFAULT-EXPORTS, and CL-SYMBOLS
C-SWAP
(append C-SYMBOLS C-SYNTAX)

Next the actual packages are defined with the help of a DEFPACKAGE* macro. There are four variations - the core package (C-MERA), the backend package (CM-C), the user package (CMU-C), and swap packages (CMS-C). The core package never changes and is used by the backend packages, but NOT by the user packages. In both cases the C variants of the backend and user packages are imported into subsequent packages defined and swap packages are defined as empty.

ALL PACKAGES then get their own systems defined with dependencies assigned like so: C-MERA - CM-C - CMU-C - CMS-C

(asdf:defsystem c-mera
  :name "c-mera"
  :version "1.1.0"
  :serial t
  :components ((:file "src/c-mera/version")
           (:file "src/c-mera/cmd")
           (:file "src/c-mera/nodes")
           (:file "src/c-mera/utils")
           (:file "src/c-mera/traverser")
           (:file "src/c-mera/pretty")
           (:file "src/c-mera/c-mera"))
  :depends-on ("net.didierverna.clon.core"))

;; ...

(asdf:defsystem cm-c
  :name "c-mera c"
  :version "1.1.0"
  :serial t
  :components ((:file "src/c-mera/c-mera")
           (:file "src/c/utils")
           (:file "src/c/nodes")
               (:file "src/c/traverser")
               (:file "src/c/pretty")
           (:file "src/c/syntax")
           (:file "src/c/reader")
           (:file "src/c/cm-c"))
  :depends-on ("c-mera"))

;; ...

(asdf:defsystem cmu-c
  :name "c-mera user c"
  :version "1.1.0"
  :components ((:file "src/c/cmu-c"))
  :depends-on ("c-mera"
           "cm-c"))

;; ...

(asdf:defsystem cms-c
  :name "c-mera swap c"
  :version "1.1.0"
  :depends-on ("cmu-c"))

1.14.15. Swank

properties ID: a69e0d55-e25f-4332-8fdc-aad2843ba649
CREATED: <2026-05-08 Fri 19:52>
edges

-> SLIME


The server and protocol components of SLIME. Included in the same repo.

See also swank-client which provides a client-side-only protocol implementation.

Swank is TCP-based and unencrypted by default.

1.14.16. IOLib

properties ID: 894ce499-1ce7-4051-a921-661995fe42b2
CREATED: <2026-03-08 Sun 19:10>
edges

– [BROKEN LINK: github:sionescu/iolib]


IOLib is a portable I/O library for ANSI Common Lisp. It includes socket interfaces for network programming with IPV4/IPV6 TCP and UDP, an I/O multiplexer that includes nonblocking I/O, a DNS resolver library, and a pathname library.

  • depends on libfixposix

1.15. Systems

properties ID: a6911466-c135-488c-a67e-689f22592a44
CREATED: <2025-03-03 Mon 18:54>

Systems are not part of the ANSI CL spec. They are classes defined by the ASDF package.

A system is a collection of Lisp files that together constitute an application or a library, and that should therefore be managed as a whole. A system definition describes which source files make up the system, what the dependencies among them are, and the order they should be compiled and loaded in.

Defining Systems

  • There are some other adhoc solutions out there but nothing that caught steam. If you want to work with the rest of the CL ecosystem you basically need to use ASDF.

1.15.1. ASDF

properties ID: fb68413a-acd8-4107-bfb5-48ce32be8842
CREATED: <2025-03-03 Mon 18:54>
edges

info


  • makes use of (call-with-x thunk) -> (with-x ,@body) often
  • with-upgradability wrappers all over the place for backwards-compatibility
  1. Sessions
    properties ID: 2a62e513-65a6-49f0-9965-d25710186bc3
    CREATED: <2025-06-10 Tue 21:27>
    asdf:session
    An ASDF session with a cache to memoize some computations

    The ASDF session cache is used to memoize some computations. It is instrumental in achieving:

    • Consistency in the view of the world relied on by ASDF within a given session. Inconsistencies in file stamps, system definitions, etc., could cause infinite loops (a.k.a. stack overflows) and other erratic behavior.
    • Speed and reliability of ASDF, with fewer side-effects from access to the filesystem, and no expensive recomputations of transitive dependencies for input-files or output-files.
    • Testability of ASDF with the ability to fake timestamps without actually touching files.

1.16. Packages

properties ID: 92dd3f0e-4789-4016-a623-48af3c45cd05
CREATED: <2025-02-26 Wed 20:52>
edges

CLHS: Macro DEFPACKAGE
-> Package Managers


  • CLHS: Function SHADOW
  • :intern
    The symbols named by the argument symbol-names are found or created in the package being defined. The :intern option interacts with the :use option, since inherited symbols can be used rather than new ones created.

It is recommended that the entire package definition is put in a single place, and that all the package definitions of a program are in a single file. This file can be loaded before loading or compiling anything else that depends on those packages. Such a file can be read in the COMMON-LISP-USER package, avoiding any initial state issues.

  • SBCL supports some additions to defpackage (:lock and :implement) - uiop and our own defpkg supports even more (:recycle, etc)
  • SBCL Package Locks
  • :implement

    Each package has a list of associated implementation packages. A locked package, and the symbols whose home package it is, can be modified without violating package locks only when *package* is bound to one of the implementation packages of the locked package.

    Unless explicitly altered by defpackage, sb-ext:add-implementation-package, or sb-ext:remove-implementation-package each package is its own (only) implementation package.

  • Package-local nicknames

1.17. Tools

properties ID: 7f63f416-efcb-4926-8370-b626c4349c45
CREATED: <2025-05-10 Sat 23:01>

1.17.1. lisp-critic

properties ID: d0796fff-4a90-42a5-8213-93e2cb5c9465
CREATED: <2025-05-10 Sat 23:03>
edges

src
CS325 Code Testing Tools


The Lisp Critic scans your code for instances of bad Lisp programming practice.

? (critique
          (defun count-a (lst)
            (setq n 0)
            (dolist (x lst)
              (if (equal x 'a)
                (setq n (+ n 1))))
            n))
    ----------------------------------------------------------------------
    Don't use SETQ inside DOLIST to accumulate values for N.
    Use DO. Make N a DO variable and don't use SETQ etc at all.
    ----------------------------------------------------------------------
    You have an IF with no else branch. If the return value of the IF
    matters, you should explicitly say what the else returns, e.g., NIL.
    If the return value doesn't matter, use WHEN or UNLESS.
    ----------------------------------------------------------------------
    INCF would be simpler to add 1 to N than SETQ
    ----------------------------------------------------------------------
    GLOBALS!! Don't use global variables, i.e., N
    ----------------------------------------------------------------------
    Unless something special is going on, use EQL, not EQUAL.
    ----------------------------------------------------------------------
    Don't use (+ N 1), use (1+ N) for its value or (INCF N) to change N,
    whichever is appropriate here.
    ----------------------------------------------------------------------

1.18. Blogs

properties ID: f677579e-a644-444f-90e6-442909f94ef8
CREATED: <2026-06-15 Mon 21:47>

1.18.1. Structural Insight

properties ID: a1002554-61eb-4f72-ac62-f497ffe6c15e
CREATED: <2026-06-15 Mon 21:47>
edges

Structural insight


  1. Fexpr
    properties ID: 9c02fb15-967b-4294-a8ac-1327f1ec0de1
    CREATED: <2026-06-15 Mon 21:49>
    edges

    Structural insight: Fexpr


1.19. History

properties ID: fb444369-a3e2-4451-8afc-e29571e706de
CREATED: <2025-03-07 Fri 23:29>

1.19.1. T

properties ID: 3951ac2e-dc3d-4c25-b0ab-7b1daac53b47
CREATED: <2025-03-07 Fri 23:32>
edges

History of T


  • interesting to note the dualities in 'truthiness' across different runtimes. 'YES' 'NO', 'TRUE' 'FALSE', 1 0, 'OK' 'ERR'

1.19.2. CAR and CDR

properties ID: 377a92dd-8e6e-4183-bd8a-70c47902d4d8
CREATED: <2025-03-07 Fri 23:33>
edges

History of CAR and CDR


1.19.3. LAP   asm

properties ID: f8f4d3ea-663a-4a8e-a9a8-f0d7813c710f
CREATED: <2025-03-07 Fri 23:29>
edges

spec


The LISP 2 Assembly Program

1.19.4. Foreign Function Interface

properties ID: 203517c3-8324-471e-b932-56ead04d8e1a
CREATED: <2026-06-05 Fri 19:40>
AKA: FFI
edges

wiki


Originally a term from the Common Lisp spec 😮

1.20. Books

properties ID: 04d98054-94f2-47d1-8af4-751c10827ee8
CREATED: <2025-03-04 Tue 15:57>

1.20.1. PAIP

properties ID: 91c00d39-6541-4b29-8d6b-a5b8c770cab0
CREATED: <2025-03-04 Tue 15:57>
edges

>> Expert System


Paradigms of Artificial Intelligence Programming by Peter Norvig

1.20.2. PCL

properties ID: 53d96196-24d4-4737-93d0-a282f2cf5c0b
CREATED: <2025-03-04 Tue 18:05>
edges

Practical Common Lisp
CLiki: Practical Common Lisp


Practical Common Lisp - Peter Seibel

1.20.3. LoL

properties ID: 11b9f51e-4d47-41ba-814f-aa6738a65881
CREATED: <2025-03-04 Tue 15:57>
edges

Let Over Lambda
thephoeron/let-over-lambda


Let Over Lambda by Doug Hoyte

1.20.4. Land of Lisp

properties ID: 2b73b4e2-495a-4af0-9777-294196ad7f4d
CREATED: <2025-03-07 Fri 09:56>
edges

landoflisp


1.21. Package Managers

properties ID: d41019fd-ca88-4608-af00-9e7a84dcd49f
CREATED: <2025-02-26 Wed 20:53>
edges

<- Packages


  • Quicklisp is the defacto standard
  • ASDF compatibility is assumed
  • Package and System namespace separation is a problem

1.21.1. Qlot

properties ID: e310d8ec-2a13-4a8e-aa15-db29738656b9
CREATED: <2025-08-17 Sun 21:05>
edges

GitHub - fukamachi/qlot: A project-local library installer for Common Lisp


1.21.2. Vend

properties ID: 6027aa9f-e3f6-4cf8-8c20-caef166a5126
CREATED: <2025-08-17 Sun 21:07>
edges

GitHub - fosskers/vend: Manage your Common Lisp project dependencies.


1.21.3. OCICL

properties ID: 1f1a5a5d-de86-461f-a209-9d81298d9a7c
CREATED: <2025-10-13 Mon 17:30>
edges

– [BROKEN LINK: github:ocicl/ocicl]


An OCI-based ASDF system distribution and management tool for Common Lisp

1.21.4. Quicklisp

properties ID: 0b568dbe-fc89-4ce6-be86-fd18d1d2d5c0
CREATED: <2025-02-26 Wed 20:53>
edges

Quicklisp beta
quicklisp (Zach Beane) · GitHub


Quicklisp is a library manager for Common Lisp. It works with your existing Common Lisp implementation to download, install, and load any of over 1,500 libraries with a few simple commands.

  1. Ultralisp
    properties ID: 6cfca9d2-8d3d-4725-a08f-349e08fd44e3
    CREATED: <2025-02-26 Wed 20:54>
    edges

    Ultralisp - Fast Common Lisp Repository


    An alternative distribution for Quicklisp - tracks git branches.

2. Scheme   scm

properties ID: cce00db3-1428-4380-aa5d-8d2ec767b873
CREATED: <2025-02-16 Sun 20:03>
edges

The Scheme Programming Language
Scheme Requests for Implementation


Andersen, Leif, Stephen Chang, and Matthias Felleisen. 2017. “Super 8 languages for making movies (functional pearl).” Proc. acm program. lang. 1 (ICFP). https://doi.org/10.1145/3110274.

2.1. Racket

properties ID: 74140b0d-af83-4516-ac70-b62bfa3de68d
CREATED: <2025-02-16 Sun 20:03>
edges

Racket
The Racket Reference


  • Andersen, Chang, and Felleisen (2017) from the PLT guys at NEU - Racket

2.1.1. Contracts

properties ID: c1fdfebb-0dec-420d-abf9-aec7a2de5633
CREATED: <2025-03-06 Thu 13:52>
edges

Contracts
-> Contract Programming


2.1.2. Concurrency

properties ID: 79ecc4f2-f223-4045-a31a-565192efaf49
CREATED: <2025-03-06 Thu 13:52>
edges

11 Concurrency and Parallelism
-> Asynchrony
<< lparallel


2.2. Guile

properties ID: 66e2ab9a-51e3-4360-b7ad-0b38eb0dd6e5
CREATED: <2025-03-03 Mon 20:03>
edges

info
GNU's programming and extension language GNU Guile


2.3. scsh

properties ID: c37d4dc5-0b09-4908-ab0a-e36f51f7d624
CREATED: <2025-08-17 Sun 21:22>
edges

scheme/scsh


A Unix shell embedded in scheme

3. Lisp Machine Lisp

properties ID: e21c02a5-5039-42c2-8416-aa5d45e70cb6
CREATED: <2025-02-26 Wed 20:49>
edges

Lisp Machine Lisp - Wikipedia
-> Lisp Machine


Maclisp->Zetalisp

4. Elisp   emacs elisp el

properties ID: 6c69c42b-3d0a-48bf-a5ad-43b350477387
CREATED: <2025-03-01 Sat 16:35>
AKA: Emacs Lisp
edges

Elisp info
An Introduction to Programming in Emacs Lisp - GNU Project - Free Software Foundation (FSF)
>> Emacs


4.1. use-package

properties ID: 42ffc518-9c9c-4c59-9145-233aa58c6362
CREATED: <2026-05-21 Thu 22:22>
edges

info


Declarative package configuration for Emacs.

4.2. Threads

properties ID: 5510378f-d1a7-4642-8a24-ada2d7f7e54d
CREATED: <2025-03-03 Mon 13:43>
edges

ref


4.3. Widgets

properties ID: 95427021-7e0c-4657-9b70-a7ed874fe35a
CREATED: <2025-03-03 Mon 20:01>
edges

info


(require 'widget)

(eval-when-compile
  (require 'wid-edit))

(defvar widget-example-repeat)

(defun widget-example ()
  "Create the widgets from the Widget manual."
  (interactive)
  (switch-to-buffer "*Widget Example*")
  (kill-all-local-variables)
  (make-local-variable 'widget-example-repeat)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "Here is some documentation.\n\n")
  (widget-create 'editable-field
         :size 13
         :format "Name: %v " ; Text after the field!
         "My Name")
  (widget-create 'menu-choice
         :tag "Choose"
         :value "This"
         :help-echo "Choose me, please!"
         :notify (lambda (widget &rest ignore)
               (message "%s is a good choice!"
                    (widget-value widget)))
         '(item :tag "This option" :value "This")
         '(choice-item "That option")
         '(editable-field :menu-tag "No option" "Thus option"))
  (widget-create 'editable-field
         :format "Address: %v"
         "Some Place\nIn some City\nSome country.")
  (widget-insert "\nSee also ")
  (widget-create 'link
         :notify (lambda (&rest ignore)
               (widget-value-set widget-example-repeat
                         '("En" "To" "Tre"))
               (widget-setup))
         "other work")
  (widget-insert
   " for more information.\n\nNumbers: count to three below\n")
  (setq widget-example-repeat
    (widget-create 'editable-list
               :entry-format "%i %d %v"
               :notify
               (lambda (widget &rest ignore)
             (let ((old (widget-get widget
                        ':example-length))
                   (new (length (widget-value widget))))
               (unless (eq old new)
                 (widget-put widget ':example-length new)
                 (message "You can count to %d." new))))
               :value '("One" "Eh, two?" "Five!")
               '(editable-field :value "three")))
  (widget-insert "\n\nSelect multiple:\n\n")
  (widget-create 'checkbox t)
  (widget-insert " This\n")
  (widget-create 'checkbox nil)
  (widget-insert " That\n")
  (widget-create 'checkbox
         :notify (lambda (&rest ignore) (message "Tickle"))
         t)
  (widget-insert " Thus\n\nSelect one:\n\n")
  (widget-create 'radio-button-choice
         :value "One"
         :notify (lambda (widget &rest ignore)
               (message "You selected %s"
                    (widget-value widget)))
         '(item "One") '(item "Another One.")
         '(item "A Final One."))
  (widget-insert "\n")
  (widget-create 'push-button
         :notify (lambda (&rest ignore)
               (if (= (length
                   (widget-value widget-example-repeat))
                  3)
                   (message "Congratulation!")
                 (error "Three was the count!")))
         "Apply Form")
  (widget-insert " ")
  (widget-create 'push-button
         :notify (lambda (&rest ignore)
               (widget-example))
         "Reset Form")
  (widget-insert "\n")
  (use-local-map widget-keymap)
  (widget-setup))
widget-example

4.4. EIEIO

properties ID: da96454b-fc70-4a5c-bd7a-e66d148eb1d9
CREATED: <2025-03-03 Mon 14:02>
edges

ref
-> CLOS


4.5. Display

properties ID: dd393948-c526-4216-bf9b-5869a7121933
CREATED: <2025-03-03 Mon 14:05>
edges

ref


4.5.1. Ewoc   gui

properties ID: 114b1269-7400-45a7-ac41-17032015ffaa
CREATED: <2025-03-03 Mon 14:05>
edges

ref


4.5.2. Native Widgets

properties ID: 401e2cbd-2769-4c73-979e-ca98f4f6208c
CREATED: <2025-03-03 Mon 14:07>
edges

ref


4.5.3. SVG Images

properties ID: c3aeb32d-5353-40e3-9817-c086f6beb58b
CREATED: <2025-03-03 Mon 14:08>
edges

ref


4.5.4. Icons

properties ID: eb112a07-aef7-4369-81f3-a50282bad8cc
CREATED: <2026-05-23 Sat 18:47>
edges

Icons (GNU Emacs Lisp Reference Manual)


4.5.5. Buttons

properties ID: 9aed2656-f389-4a2b-8425-f6eeb546e901
CREATED: <2026-05-23 Sat 18:47>
edges

Buttons (GNU Emacs Lisp Reference Manual)


4.6. Faces

properties ID: 291cd491-b88c-4d52-b500-e7cc3095b3f1
CREATED: <2025-07-22 Tue 22:31>
edges

info


Emacs can display text in several different styles, called faces. Each face can specify various face attributes, such as the font, height, weight, slant, foreground and background color, and underlining or overlining. Most major modes assign faces to the text automatically, via Font Lock mode.

(describe-function 'list-faces-display)
list-faces-display is an interactive native-comp-function in
‘faces.el’.

It is bound to C-<down-mouse-2> <df>.
It can also be invoked from the menu: Edit → Text Properties.

(list-faces-display &optional REGEXP)

Inferred type: (function (&optional t) boolean)

List all faces, using the same sample text in each.
The sample text is a string that comes from the variable
‘list-faces-sample-text’.

If REGEXP is non-nil, list only those faces with names matching
this regular expression.  When called interactively with a prefix
argument, prompt for a regular expression using ‘read-regexp’.

  Probably introduced at or before Emacs version 19.17.

A “face” is a collection of graphical attributes for displaying text: font, foreground color, background color, optional underlining, etc. Faces control how Emacs displays text in buffers, as well as other parts of the frame such as the mode line.

4.7. Modes

properties ID: 8e912802-3969-4352-9a13-25f434bb1402
CREATED: <2025-11-01 Sat 02:24>

4.7.1. Outline

properties ID: e69bdfe7-3e00-4c67-a5ec-8cd86e117db8
CREATED: <2025-11-01 Sat 02:24>

4.7.2. Allout

properties ID: 40e5417f-6830-4cb7-8353-4b5a7a08010c
CREATED: <2025-11-01 Sat 02:24>

A minor mode similar to Outline mode but with more features and different syntax.

Headings are denoted by the underscore character _ in a comment line followed by a heading character - the simplest of which are the alternating pair . and ,.

In allout-mode headings space is significant - it is used to determine the nesting level of each heading. Add a space to shift inward, delete a space (relative to the previous heading) to shift outward.

This is how an outline can look (but sans indentation) with stylish prefixes:

  • Top level

.* A topic . + One level 3 subtopic . . One level 4 subtopic . . A second 4 subtopic . + Another level 3 subtopic . #1 A numbered level 4 subtopic . #2 Another . ! Another level 4 subtopic with a different distinctive bullet . #4 And another numbered level 4 subtopic

This would be an outline with stylish prefixes inhibited (but the numbered and other distinctive bullets retained):

  • Top level

.* A topic . * One level 3 subtopic . * One level 4 subtopic . * A second 4 subtopic . * Another level 3 subtopic . #1 A numbered level 4 subtopic . #2 Another . ! Another level 4 subtopic with a different distinctive bullet . #4 And another numbered level 4 subtopic

Stylish and constant prefixes (as well as old-style prefixes) are always respected by the topic maneuvering functions, regardless of this variable setting.

`comment-start' strings that do not end in spaces are tripled in the header-prefix, and an `_' underscore is tacked on the end, to distinguish them from regular comment strings. `comment-start' strings that do end in spaces are not tripled, but an underscore is substituted for the space.

Allout outline mode is a minor mode that provides extensive outline oriented formatting and manipulation. It enables structural editing of outlines, as well as navigation and exposure. It also is specifically aimed at accommodating syntax-sensitive text like programming languages. (For example, see the allout code itself, which is organized as an allout outline.)

In addition to typical outline navigation and exposure, allout includes:

  • topic-oriented authoring, including keystroke-based topic creation, repositioning, promotion/demotion, cut, and paste
  • incremental search with dynamic exposure and reconcealment of hidden text
  • adjustable format, so programming code can be developed in outline-structure
  • easy topic encryption and decryption, symmetric or key-pair
  • "Hot-spot" operation, for single-keystroke maneuvering and exposure control
  • integral outline layout, for automatic initial exposure when visiting a file
  • independent extensibility, using comprehensive exposure and authoring hooks

and many other features.

Distinctive bullets are not cycled when topics are shifted or otherwise automatically rebulleted, so their marking is persistent until deliberately changed. Their significance is purely by convention, however. Some conventions suggest themselves:

`(' - open paren – an aside or incidental point `?' - question mark – uncertain or outright question `!' - exclamation point/bang – emphatic `[' - open square bracket – meta-note, about item instead of item's subject `\"' - double quote – a quotation or other citation `=' - equal sign – an assignment, some kind of definition `^' - carat – relates to something above

Some are more elusive, but their rationale may be recognizable:

`+' - plus – pending consideration, completion `_' - underscore – done, completed `&' - ampersand – addendum, furthermore

\(Some other non-plain bullets have special meaning to the software. By default:

`~' marks encryptable topics – see `allout-topic-encryption-bullet' `#' marks auto-numbered bullets – see `allout-numbered-bullet'.)

See `allout-plain-bullets-string' for the standard, alternating bullets.

4.7.3. Org   org

properties ID: cea03181-b97b-494d-b362-28056416469d
CREATED: <2025-02-13 Thu 22:39>
edges

Org mode for GNU Emacs
info


  1. Org Babel
    properties ID: 9cfcee92-d862-400f-a80f-7bb538b27b45
    CREATED: <2025-03-07 Fri 10:01>
    edges

    info
    The Library of Babel


  2. Org Export
    properties ID: d26e1dac-f9cc-47a0-9a61-f32463247ec9
    CREATED: <2025-03-06 Thu 14:44>
    edges

    Org Export Reference Documentation
    info


    1. HTML
      properties ID: 9cb4a1c7-4798-4ac9-8958-9e3d86673d95
      CREATED: <2025-03-06 Thu 14:46>
      edges

      info


  3. Refile and Copy
    properties ID: f46c1c20-c958-4068-bf0c-bf6f4f77546f
    CREATED: <2025-03-04 Tue 18:00>
    edges

    info
    My org-refile workflow - Yiming Chen


  4. org-info.js
    properties ID: 09edda89-63e0-4496-84eb-764fb9b0b7c3
    CREATED: <2025-03-06 Thu 14:49>
    edges

    info
    EMACS ORG-INFO.JS
    -> Javascript


  5. Syntax   syn
    properties ID: e1ef06a0-2c19-44fe-9afc-c216671c9ca4
    CREATED: <2025-10-13 Mon 19:46>
    edges

    Org Syntax


    Elements can be stratified into “headings”, “sections”, “greater elements”, and “lesser elements”, from broadest scope to narrowest. Along with objects, these sub-classes define categories of syntactic environments. Only headings, sections, property drawers, and planning lines are context-free1, 2, every other syntactic component only exists within specific environments. This is a core concept of the syntax.

    Expanding on the stratification of elements, lesser elements are elements that cannot contain any other elements. As such, a paragraph is considered a lesser element. Greater elements can themselves contain greater elements or lesser elements. Sections contain both greater and lesser elements, and headings can contain a section and other headings.

    • Blank lines are considered a part of a preceding element.

    To simplify references to common collections of objects, we define two useful sets. The minimal set of objects refers to plain text, text markup, entities, LaTeX fragments, superscripts and subscripts. The standard set of objects refers to the entire set of objects, excluding citation references and table cells.

  6. Org Element API
    properties ID: bdf4ac96-f9a6-47ea-a27a-89a8d2b20ba7
    CREATED: <2025-03-04 Tue 20:09>
    edges

    Org Element API


  7. Org Protocol
    properties ID: d0590d0b-4be3-447b-a549-1c927be0c745
    CREATED: <2025-03-09 Sun 18:57>
    javascript:location.href = 'org-protocol://capture?' +
      new URLSearchParams({
        template: "i",
        url: location.href,
        title: document.title,
        body: window.getSelection()})
    
    org-protocol-protocol-alist
    

4.8. Autotype

properties ID: d0af9d29-bbcd-405c-8c48-e3e933d71b25
CREATED: <2026-05-28 Thu 21:16>
edges

info


  • Emacs Auto-Insert Text in New Files
  • autoinsert
  • hippie expand usually replaces dabbrev-expand
    • hippie-expand-try-function-list
  • executable-insert / executable-set-magic
  • abbrevs
  • dabbrevs
    • dynamic abbrevs - write a few chars and expand something you wrote earlier
  • tempo
  • skeleton

    (describe-function 'skeleton-insert)
    
    skeleton-insert is an autoloaded native-comp-function in
    ‘skeleton.el’.
    
    (skeleton-insert SKELETON &optional REGIONS STR)
    
    Insert the complex statement skeleton SKELETON describes very concisely.
    
    With optional second argument REGIONS, wrap first interesting point
    (‘_’) in skeleton around next REGIONS words, if REGIONS is positive.
    If REGIONS is negative, wrap REGIONS preceding interregions into first
    REGIONS interesting positions (successive ‘_’s) in skeleton.
    
    An interregion is the stretch of text between two contiguous marked
    points.  If you marked A B C [] (where [] is the cursor) in
    alphabetical order, the 3 interregions are simply the last 3 regions.
    But if you marked B A [] C, the interregions are B-A, A-[], []-C.
    
    The optional third argument STR, if specified, is the value for the
    variable ‘str’ within the skeleton.  When this is non-nil, the
    interactor gets ignored, and this should be a valid skeleton element.
    
    When done with skeleton, but before going back to ‘_’-point, add
    a newline (unless ‘skeleton-end-newline’ is nil or ‘_’-point is at end
    of line), and run the hook ‘skeleton-end-hook’.
    
    SKELETON is made up as (INTERACTOR ELEMENT ...).  INTERACTOR may be nil if
    not needed, a prompt-string or an expression for complex read functions.
    
    If ELEMENT is a string or a character it gets inserted (see also
    ‘skeleton-transformation-function’).  Other possibilities are:
    
            \n	go to next line and indent according to mode, unless
                    this is the first/last element of a skeleton and point
                    is at bol/eol
            _	interesting point, interregion here
            -	interesting point, no interregion interaction, overrides
                    interesting point set by _
            >	indent line (or interregion if > _) according to major mode
            @	add position to ‘skeleton-positions’
            &	do next ELEMENT if previous moved point
            |	do next ELEMENT if previous didn’t move point
            -NUM	delete NUM preceding characters (see ‘skeleton-untabify’)
            resume:	skipped, continue here if quit is signaled
            nil	skipped
    
    After termination, point will be positioned at the last occurrence of -
    or at the first occurrence of _ or at the end of the inserted text.
    
    Note that \n as the last element of the skeleton only inserts a
    newline if not at eol.  If you want to unconditionally insert a newline
    at the end of the skeleton, use "\n" instead.  Likewise with \n
    as the first element when at bol.
    
    Further elements can be defined via ‘skeleton-further-elements’.
    ELEMENT may itself be a SKELETON with an INTERACTOR.  The user is prompted
    repeatedly for different inputs.  The SKELETON is processed as often as
    the user enters a non-empty string.  C-g terminates skeleton insertion, but
    continues after ‘resume:’ and positions at ‘_’ if any.  If INTERACTOR in
    such a subskeleton is a prompt-string which contains a ".. %s .." it is
    formatted with ‘skeleton-subprompt’.  Such an INTERACTOR may also be a list
    of strings with the subskeleton being repeated once for each string.
    
    Quoted Lisp expressions are evaluated for their side-effects.
    Other Lisp expressions are evaluated and the value treated as above.
    Note that expressions may not return t since this implies an
    endless loop.  Modes can define other symbols by locally setting them
    to any valid skeleton element.  The following local variables are
    available:
    
            str	first time: read a string according to INTERACTOR
                    then: insert previously read string once more
            help	help-form during interaction with the user or nil
            input	initial input (string or cons with index) while reading str
            v1, v2	local variables for memorizing anything you want
    
      Probably introduced at or before Emacs version 22.1.
    
    
    (define-skeleton local-variables-section
     "Insert a local variables section.  Use current comment syntax if any."
     (completing-read "Mode: " obarray
           (lambda (symbol)
             (if (commandp symbol)
             (string-match "-mode$" (symbol-name symbol))))
           t)
     '(save-excursion
        (if (re-search-forward page-delimiter nil t)
      (error "Not on last page")))
     comment-start "Local Variables:" comment-end \n
     comment-start "mode: " str
     & -5 | '(kill-line 0) & -1 | comment-end \n
     ( (completing-read (format "Variable, %s: " skeleton-subprompt)
             obarray
             (lambda (symbol)
               (or (eq symbol 'eval)
               (custom-variable-p symbol)))
             t)
       comment-start str ": "
       (read-from-minibuffer "Expression: " nil read-expression-map nil
              'read-expression-history) | _
       comment-end \n)
     resume:
     comment-start "End:" comment-end \n)
    

4.9. Overlays

properties ID: 358a0e2b-b5e0-47ad-9c70-7bb72b1c548f
CREATED: <2025-03-03 Mon 14:08>
edges

ref


5. Clojure   clj

properties ID: 45c83abe-cff5-4d00-9f01-f61c55525ca9
CREATED: <2025-03-03 Mon 19:36>
edges

Clojure
>> JVM


6. Arc

properties ID: 2094bd8c-4a95-4430-a126-9a56255380f4
CREATED: <2025-05-21 Wed 19:02>
edges

Arc: Table of Contents


7. MLisp

properties ID: b7c0c96b-2555-4436-9231-42670db24838
CREATED: <2025-06-04 Wed 16:07>
edges

wiki


7.1. M-expression

properties ID: c32b20a7-11fc-4ab6-ae55-cc121b423a66
CREATED: <2025-06-04 Wed 16:15>
edges

wiki


  • History of Lisp

    The project of defining M-expressions precisely and compiling them or at least translating them into S-expressions was neither finalized nor explicitly abandoned. It just receded into the indefinite future, and a new generation of programmers appeared who preferred internal notation to any FORTRAN-like or ALGOL-like notation that could be devised.

8. CGOL

properties ID: f49136cd-0a8e-412b-9fc0-75afb70502e2
CREATED: <2025-06-04 Wed 16:19>
edges

wiki


mm in cgol:

for i in 1 to n do
  for k in 1 to n do
    (ac := 0;
     for j in 1 to n do
        ac := ac + a(i,j)*b(j,k);
     c(i,k) := ac)

9. Cursed Lisp   cc

properties ID: 22821eaa-7457-4dfd-b150-cd5835ae05d4
CREATED: <2025-11-01 Sat 02:30>

The designated name for the specific flavor of Common Lisp used and developed by The Compiler Company.

Our language is cursed because it is non-portable - as in the language provided is not built with the typical Lisper's idea of portability. We do not limit ourselves to the CL ANSI specification, and never support implementations beyond our own selection of SBCL builds.

When using the term Cursed Lisp in place of Common Lisp we are most likely trying to highlight specific capabilities of the Cursed Lisp environment which should not be considered in a 'pure ANSI CL' context.

Similarly, when referring to a language with the prefix Cursed like Cursed C or Cursed Rust, we are referring to our internal syntax specifications of these languages which have a special relationship with Cursed Lisp and contain 'symbolic bridges' between each other.