Calispel is a Common Lisp library for thread-safe message-passing channels, in the style of the occam programming language.
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
ALTin 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.
jpl-queues is a Common Lisp library implementing a few different kinds of queues.
These kinds of queues are provided:
- Bounded and unbounded FIFO queues.
- Lossy bounded FIFO queues that drop elements when full.
- Unbounded random-order queues that use less memory than unbounded FIFO queues.
Additionally, a synchronization wrapper is provided to make any queue conforming to the jpl-queues API thread-safe for lightweight multithreading applications. (See Calispel for a more sophisticated CL multithreaded message-passing library with timeouts and alternation among several blockable channels.)
SimpSamp is a Common Lisp library for simple random sampling without selection. In English, that means it will return a requested number of random elements from a set, without duplicating any of the elements.
For instance, if you have a list of 1,000,000 elements and want 1,000 unique random elements from the list, SimpSamp will do the trick.
SimpSamp implements two algorithms: selection sampling and reservoir sampling, both described in The Art of Computer Programming.