Toys & Games

2021 A recording of an avatar navigating a map.

IN PROGRESS An roguelike-like about understanding yourself and your environment through observation and creative spellcasting.

Written in Common Lisp

→ Dev Log ←
2021 A Mouse draws the outline of shapes in a blank black
 space. When the outline intersects itself, the shape fills with color
 and colored circles and begins to wiggle about, bouncing into walls
 and other shapes.  If your sensory experience of light does not work
 in the same way that mine does, then I'm most curious to hear from
 you about your experience of wiggle world. I'd also be interested to
 hear from you about what kind of web based toys would more
 effectively provoke play in you.

Wiggle World is just a toy about shape and motion. I thought of it one day while watching ducks and turtles at a local pond.

When ducks emerged from the water, their butts wiggled back and forth, seemingly independent of the rest of their bodies. If you've ever seen a duck shake off some damp, you'll know what I mean.

When turtles sank down into the water, their features faded as their depths increased. Eventually, I could see only vague blobs with stumpy limbs drifting in and out through patches of light.

Shapes and light and motion are what I saw that day at the pond. I thought it might be fun to draw some shapes and blobs onto a screen where one could watch them drift and shift and wiggle. So that's what Wiggle World does.

You can play with it here.

2019 The figure of a man walks about on a busy street, stopping poeple and asking them
       for change.

Was a game I made for the 2019 Autumn Lisp Game Jam. It is about a person out on a street on a cold winter day, stopping people who pass by and asking them for money or help. The protagonist wishes to buy some coffee and some food at the nearby convenience store.

Tools & Software Libraries


A Common Lisp implementation of the Zhang-Shasha algorithm for calculating tree edit distance.

It uses s-expressions to represent trees.

I needed a way to compare differences in parse trees for one of my language oriented games.

It is licensed with the General Public License Version 3.

2021 An example using tote from the command line.

Encrypted file synchronization.

I made this because I wanted a nice way to keep some files in sync between different personal laptops that

  1. Wasn't sensitive to the filesystem formatting on various disks
  2. Gave me a choice about what to synchronize and how in case of synchronization conflict
  3. Created encrypted repositories, in case I lose my USB drive

A Common Lisp library for defining functions with embedded tests. The tests are run whenever functions are recompiled. Great for interactive development!

2021 Depiction of editing a site with flexo

Flexo is my Common Lisp system for developing static sites. It is very much in its early stages.

It has been written to take advantage of SLIME for highly interactive static-site development. The site you are reading now was created with Flexo.

2020 A recording of a brief session using zettelgunk.

Zettelgunk is a notes sytem for Emacs.

It is my own contribution to the trendy category of zettelkasten systems.

Zettelgunk supports:

  1. Weekly reviews of notes
  2. Linking notes together
  3. Browsing nots that link to a particular note
  4. Tagging notes
  5. Browsing by note name
  6. Browsing by tag name

Just a fun, if somewhat ad-hoc, project.

2020 A recording of a brief session using the spoof REPL.

Spoof is an interpreter for a toy dialect of Lisp. It is written in Haxe and was initially conceived of as a scripting langauge for OpenFL projects.

Although Spoof is unfinished, the interpreter supports:

  1. DEFUN with &rest and &key arguments
  2. Keyword symbols
  3. Quasiquoting
  4. DEFMACRO style macros
  5. support for calling out to Haxe code.
2020 A demonstration using the library to generate lists of primes

Generators The Way I Want Them Generated is a Common Lisp System I undertook to create purely out of curiosity. Specifically, I wanted to see how I might generate permutations of possibly very large vectors, one at a time. I had no practical ambition in mind. As such, GTWIWTG is not very fast - it is, however quite good at generating sequences of billions of members without killing your machine's memory. Now... whether or not you'll ever reach the billionth member of your huge sequence is another story. GTWIWTG is, again, a bit slow.

After sampling a few cleverer approaches to generators in the Common Lisp ecosystem, I decided to write my own, less clever, system. While the prior art in this domain is generally very well done, I found most of it difficult to debug. As a result, GTWIWTG became a well documented, straightforward, and perhaps even naive approach to lazy sequence generation.

I have also written a tutorial. .


The quest of parzival is to make it fun and easy to design and parse simple embedded languages for Common Lisp applications.

Parzival uses the parser-combinator approach to parsing, and is heavily influenced by this paper.

I undertook to write parzival in order to re-introduce myself to Common Lisp after a long caesura in my Lisping activity.

There is a Tutorial.

2019 a tilesheet

Imbricate is a command-line tool used to create spritesheets for games.
It turns nested folders of PNG files into a single image containing all the others.

Additionally, imbricate produces a metadata file that describes which tiles are located at which positions in the sheet.

2019 A red square arcs across a white space in a downward right
 motion and fades away as it does. It then snaps back elastically to
 the left hand side of the space and regains its red hue before
 floating slowly back to its starting position.

Animise is a Common Lisp system that implements a Lispy language for describing tweens for animation with various easing functions. It was intended for use in simple animations for game and UI development, but could possibly serve other purposes. Whenever you might need a time-varying numerical value in your Common Lisp program, it can be tweened and eased with Animise.