A selection of the math routines most commonly needed for realtime graphics in lisp

Upstream URL



Chris Bagley <techsnuffle@gmail.com>


BSD 2 Clause


This system provides a selection of the math routines most commonly needed for making realtime graphics in lisp.

Feature Shortlist

The library provides:

  • 2, 3 & 4 component vectors (vec2, vec3, vec4), including support for:

    • unit, zero & equality predicates
    • addition, subtraction, multiplication & divising of vectors against each other
    • addition, subtraction, multiplication & divising of scalars against vectors
    • length, length-squared, distance, distance-squared
    • dot, absolute-dot & cross products
    • normalize
    • lerp, bezier & spline
    • Consing and non-consing apis
    • Optional generic API
  • 3x3 & 4x4 matrices (mat3, mat4), including support for:

    • identity, zero & equality predicates
    • component-wise addition & subtraction of matrices
    • multiplication of matrices with matrices and matrices with vectors
    • transpose, adjoint, determinate, trace
    • construction from angle (seperately or as a vec3), axis-angle, scale, or individual components
    • inverse & affine-inverse
    • extraction of rows or columns as vectors
    • Consing and non-consing apis
    • Optional generic API
  • Quaternions

    • addition, subtraction, multiplication & divising of quaternions against each other
    • conversion from & to 3x3 matrices, axis-angle pairs, look-at position & more
    • magnitude, norm, normalize, conjugate, inverse
    • lerp & slerp
  • Basic support for spherical and polar coordinates

And more for all categories.


Reference docs can be found here

All the symbols with documentation in the above reference docs als ohave identical doc-strings and so this can be easily queried from your editor.



  • WARNING: Fixes to from-direction, projection & look-at matrices. Will have import of projects using this lib


  • Ported all the API (except regions for now) to Vari so rtg-math works on the GPU.


  • WARNING: Fix to perspective matrix, will have impact on project using this lib.


  • all lerp functions are stable, stable-lerp is deprecated & will be removed in a future release


  • Fixes to the projection matrices. Are also now typed


  • Add non-consing functions for matrix3 & matrix4


  • Started Changelog. Sorry we havent had this before.
  • Most of vector, matrix, quaternion API is now typed
  • Where possible the optimization for the public is set at (speed 3) (safety 1) (debug 1)
  • I have started adding a non-consing version of the apis. The nicknames for these packages is the regular nickname with -n on the end. Therefore:
  • rtg-math.vector2.non-consing has the nickname v2-n
  • rtg-math.vector3.non-consing has the nickname v3-n
  • rtg-math.vector4.non-consing has the nickname v4-n
  • rtg-math.matrix2.non-consing has the nickname m2-n
  • rtg-math.matrix3.non-consing has the nickname m3-n
  • rtg-math.quaternions.non-consing has the nickname q-n
  • q:qconjugate is now deprecated in favor q:conjugate.
  • directory structure normalized a bit. Now vectors/matrices/quaternions
  • fixed spelling mistake in m3: determinate -> determinant
  • added the regions api support lines, rays, line-segments & axis-aligned boxes in ℝ3

Dependencies (4)

  • alexandria
  • documentation-utils
  • glsl-spec
  • varjo
  • GitHub
  • Quicklisp