fogus/ulithp
A micro LISP implementation in 24 lines of Ruby.
{ "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"}μLithp
Section titled “μLithp”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.
carcdrquoteatomiflabelconseqlambda
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
Embedded usage
Section titled “Embedded usage”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]]] #=> 2Have fun!
REPL usage
Section titled “REPL usage”In your shell use Ruby 1.9.2 to run the REPL:
rvm use ruby-1.9.2 ruby -I . repl.rbYou’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
Section titled “thanks”Thanks to Russ Olsen for the reader and REPL.
License
Section titled “License”This software is provided as-is under the MIT license.