Interface and bindings to the Allegro 5 game programming library

Check out how the bindings' source code is organized and compare it to the API reference.




  1. `al*` becomes `al:*`
  2. `(al:rest secs)` is `(al:rest-time secs)` because of symbol interference with #'cl:rest.
  3. Enums/constants are shortened, check constants.lisp if you need help finding them.
  4. Type names have changed too, check types.lisp if you need help finding them.
  5. To access slots from a C struct, you can use CFFI:MEM-REF create a plist
  (defcstruct display-mode
    (width :int)
    (height :int)
    (format :int)
    (refresh-rate :int))

  (with-foreign-object (test '(:struct display-mode))
    (let ((plist (mem-ref test '(:struct display-mode))))
      (print plist)
      (print (getf plist 'width))))
  1. I've got a neat lispy interface here
  2. Everything else is pretty much 1-to-1
  3. Examples exist if you get lost

*Feel free to raise an issue to request a feature or for me to work on something*


Complete but missing haptic, touch input, shader, and the video streaming addon.

I won't work on the following sections because Common Lisp has more suitable implementations. (Might eventually do it for completeness though) Feel free to explain otherwise and I'll listen.
  • Filesystem
  • Memory
  • Threads
  • UTF-8


Why can't my program find the DLL in Windows?

There are path problems in Windows because the DLL files (which contain all the functions the CFFI calls upon) doesn't have a default location unlike in Unix environments. When the library loads in Windows, it will look for the DLL in the current folder of the FILE.LISP that evaluates (ql:quickload "cl-liballegro") This means you must have a copy of the DLL file in the directory of FILE.LISP, not in the cl-liballegro directory unless the FILE.LISP is in there. SLIME however, likes to change the default search folder to the one Emacs is in when it starts.


;; Open command prompt in the folder that contains both the DLL and game.lisp`
> sbcl
> (load "game.lisp") ; File contains (ql:quickload "cl-liballegro")

With Emacs + SLIME

game.lisp contains (ql:quickload :cl-liballegro)

;; Looks for the DLL at /path/to/Desktop/allegro.dll
C-x C-f /path/to/Desktop/file9.lisp
M-x slime
C-x C-f /path/to/Desktop/game/game.lisp
C-c C-l
;; Looks for the DLL at /path/to/Desktop/game/allegro.dll
C-x C-f /path/to/Desktop/file9.lisp
C-x C-f /path/to/Desktop/game/game.lisp
M-x slime
C-c C-l
;; Looks for the DLL at /whatever/default/emacs/directory/allegro.dll
M-x slime
C-x C-f /path/to/Desktop/game/game.lisp
C-c C-l