B-Tree implemented in Common Lisp. Stores key/value pairs onto disk based data structure. Current implementation has been tested with SBCL.


License: MIT

cl-btree has relatively high code coverage with unit tests but it is still considered unstable because of low usage rate.


There is two types of B-trees implemented. Default type uses 32-bit unsigned integers as keys and values. The other type uses string as keys and values. The string B-tree can store anything readable as keys and values. The size of key strings or values is not fixed. String B-tree uses simply prin1 to write and read to read keys and values from cl-swap-file block stream.

Here is a sample session for using string B-tree:

(let ((btree (b-tree:open "/tmp/b-tree-test.db" :type :string :block-size 64 :if-exists :append))) (b-tree:insert btree 'my-key "This is a test value.") (b-tree:search btree 'my-key) (b-tree:close btree))

cl-btree uses cl-swap-file for storing disk blocks on to file.


Download it from

cl-btree no longer depends on cl-unit-test.

Quick assessment (2021-04-11)

  1. Depends on cl-swap-file and cl-binary-file—but they're called cl-swap-file-0.6 and cl-binary-file-0.4, so ASDF fails there.
  2. cl-binary-file depends on trivial-garbage but doesn't actually use it, so the attempt to make a weak hash table isn't portable.
  3. cl-binary-file implements a kind of bivalent stream (via trivial-gray-streams) but it doesn't work right under CCL.
  4. Each system includes the lisp-unit module, so there are a bunch of warnings about duplicate definitions.
On the plus side, the code is fairly readable, so any problems can likely be fixed, if anyone is inclined.

Tags: StructuredStorage, Data Structure