Calispel is a Common Lisp library for thread-safe message-passing channels, in the style of the occam programming language, also known as communicating sequential processes (CSP). See https://en.wikipedia.org/wiki/Communicating_sequential_processes.
Calispel channels let one thread communicate with another, facilitating unidirectional communication of any Lisp object. Channels may be unbuffered, where a sender waits for a receiver (or vice versa) before either operation can continue, or channels may be buffered with flexible policy options.
Because sending and receiving on a channel may block, either operation can time out after a specified amount of time.
A syntax for alternation is provided (like ALT
in occam, or Unix select()
): given a sequence of operations, any or all of which may block, alternation selects the first operation that doesn't block and executes associated code. Alternation can also time out, executing an "otherwise" clause if no operation becomes available within a set amount of time.
Calispel is a message-passing library, and as such leaves the role of threading abstractions and utilities left to be filled by complementary libraries such as Bordeaux-Threads and Eager Future.
A hook, in the present context, is a certain kind of extension point in a program that allows interleaving the execution of arbitrary code with the execution of a the program without introducing any coupling between the two. Hooks are used extensively in the extensible editor Emacs.
In the Common LISP Object System (CLOS), a similar kind of extensibility is possible using the flexible multi-method dispatch mechanism. It may even seem that the concept of hooks does not provide any benefits over the possibilities of CLOS. However, there are some differences:
There can be only one method for each combination of specializers and qualifiers. As a result this kind of extension point cannot be used by multiple extensions independently.
Removing code previously attached via a
:before
,:after
or:around
method can be cumbersome.There could be other or even multiple extension points besides
:before
and:after
in a single method.Attaching codes to individual objects using eql specializers can be cumbersome.
Introspection of code attached a particular extension point is cumbersome since this requires enumerating and inspecting the methods of a generic function.
This library tries to complement some of these weaknesses of method-based extension-points via the concept of hooks.
This is a keymap facility for Common Lisp inspired by Emacsy (keymap.scm) which is inspired by Emacs.
Support prefix keys to other keymaps. For instance, if you prefix my-mode-map with C-c, then all bindings for my-mode will be accessible after pressing C-c.
List all bindings matching a given prefix. (Also known as which-key in Emacs.)
List the bindings associated to a command.
Support multiple inheritance.
Support keycode.
Validate keyspec at compile time.
define-key can set multiple bindings in a single call.
Support multiple scheme to make it easy to switch between, say, Emacs-style and VI-style bindings. This orthogonality to keymaps composes better than having multiple keymaps: changing scheme applies to the entire program, which is easier than looping through all keymaps to change them.
Translate keyspecs as a fallback. For instance if shift-a is not bound, check A.
Behaviour can be customized with global parameters such as *print-shortcut*.
The compose function can merge multiple keymaps together.
Support multiple arguments when that makes sense (e.g. multiple keymaps for lookup-key).
Key remapping à-la Emacs.
Typed keymaps, i.e. keymaps where bound values can only be of a given type. This is convenient to catch typos, for instance when binding 'FOO instead of #'FOO.
Common Lisp comes with quite some functions to compare objects for equality, yet none is applicable in every situation and in general this is hard, as equality of objects depends on the semantics of operations on them. As consequence, users find themselves regularly in a situation where they have to roll their own specialized equality test.
This module provides one of many possible equivalence relations between standard Common Lisp objects. However, it can be extended for new objects through a simple CLOS protocol. The rules when two objects are considered equivalent distinguish between mutating and frozen objects. A frozen object is promised not to be mutated in the future in a way that operations on it can notice the difference.
We have chosen to compare mutating objects only for identity (pointer equality), to avoid various problems. Equivalence for frozen objects on the other hand is established by recursing on the objects' constituent parts and checking their equivalence. Hence, two objects are equivalent under the OBJECT=
relation, if they are either identical, or if they are frozen and structurally equivalent, i.e. their constituents are point-wise equivalent.
Since many objects are potentially mutable, but are not necessarily mutated from a certain point in their life time on, it is possible to promise to the equivalence relation that they remain frozen for the rest of their life time, thus enabling coarser equivalence than the often too fine-grained pointer equality.
Package that let's sdl2 host cepl
Implementation of a base16 builder for lisp
This is a unit-testing framework for Common Lisp.
cl-gendoc
is a simple component-based documentation generator.
This package provides a statistical computing environment for Common Lisp.
hdf5-cffi
is a CFFI wrapper for the HDF5 library.
CL-SYNTAX provides Reader Syntax Coventions for Common Lisp and SLIME.
This is a Common Lisp library that implements the 9p network filesystem protocol.
This package provides Common Lisp FFI bindings for xkbcommon (libxkbcommon) using cffi-grovel.
cepl.fond is a simple library for working with cl-fond with CEPL.
This package provides an implementation of a base 16 builder for Common Lisp.
This package provides Common Lisp CFFI bindings to the Raylib game development library.
fast-http
is a HTTP request/response protocol parser for Common Lisp.
This package provides CFFI bindings for Common Lisp to the Cairo C library.
This package provides functions for base32 encoding and decoding as defined in RFC4648.
This is a repackage of the original DejaVu Fonts with some convenience functions.
CL-Ledger is a Common Lisp port of the Ledger double-entry accounting system.
This package contains the specification of all functions and variables from GLSL as data.