Skip to content
vic

fogus/ulithp

A micro LISP implementation in 24 lines of Ruby.

fogus/ulithp.json
{
"createdAt": "2012-01-25T19:23:59Z",
"defaultBranch": "master",
"description": "A micro LISP implementation in 24 lines of Ruby.",
"fullName": "fogus/ulithp",
"homepage": "http://fogus.github.com/ulithp/",
"language": "Ruby",
"name": "ulithp",
"pushedAt": "2020-02-13T16:24:16Z",
"stargazersCount": 271,
"topics": [
"langdev"
],
"updatedAt": "2025-10-24T10:16:37Z",
"url": "https://github.com/fogus/ulithp"
}

A micro LISP implementation in 24 lines of Ruby, with a reader in 33 lines, REPL in 35 lines, a compiler in 15 lines and Ruby interop in 13 lines. Really frickin’ small.

  • car
  • cdr
  • quote
  • atom
  • if
  • label
  • cons
  • eq
  • lambda

See the src/lithp.rb file for source and doc/index.org for implementation details and the original announcement in the μLithp blog post.

this is my entry into the December 2012 PLT Games

The LISP interpreter is just a Ruby class that evals expressions in Ruby data structures, like so:

l = Lisp.new
l.eval [:label, :a, 42]
l.eval :a
#=> 42
l.eval [:eq, 42, :a]
#=> true
l.eval [:quote, [1, 2]]
#=> [1, 2]
l.eval [:car, [:quote, [1, 2]]]
#=> 1
l.eval [:cdr, [:quote, [1, 2]]]
#=> [2]
l.eval [:cons, 1, [:quote, [2,3]]]
#=> [1, 2, 3]
l.eval [:if, [:eq, 1, 2], 42, 43]
#=> 43
l.eval [:atom, [:quote, [1,2]]]
#=> false
l.eval [:label, :second, [:quote, [:lambda, [:x], [:car, [:cdr, :x]]]]]
l.eval [:second, [:quote, [1, 2, 3]]]
#=> 2

Have fun!

In your shell use Ruby 1.9.2 to run the REPL:

Terminal window
rvm use ruby-1.9.2
ruby -I . repl.rb

You’ll then see a prompt:

>

Start typing uLithp code:

(car (quote (1 2 3)))
(cdr (quote (1 2 3)))
(label third (quote (lambda (x) (car (cdr (cdr x))))))
(third (quote (1 2 3 4 5)))

Enjoy!

Thanks to Russ Olsen for the reader and REPL.

This software is provided as-is under the MIT license.