项目作者: ykskb

项目描述 :
Mini Lisp Interpreter in 300 lines of Lisp
高级语言: Common Lisp
项目地址: git://github.com/ykskb/lips.git
创建时间: 2021-01-18T15:38:21Z
项目社区:https://github.com/ykskb/lips

开源协议:

下载


lips

Mini Lisp in 300 lines of Lisp

This is a very minimal Lisp interpreter written in Lisp. I made it because I wanted to learn Lisp and I was also interested in a Lisp project setup with tools like Roswell and fiveam.

It’s nowhere near a full-fledged Lisp, nor does it intend to be, yet I found it to be a good exercise to make some Lisp in Lisp to get myself familiarized with a bit of Lisp.

Supported Features

  • nil, integers, symbols
  • define (not ANSI CL)
  • if
  • +, -, /, * and =
  • lambda
  • user-defined functions
  • lexically-scoped variables
  • progn
  • quote (data)
  • back quote interpolation
  • macro
  • macroexpand
Examples of Supported Codes
  • Recursive fibonacci function
  1. (define fibonacci (lambda (n) (if (= n 0) nil (if (= n 1) 0 (if (= n 2) 1 (+ (fibonacci (- n 1)) (fibonacci (- n 2))))))))
  2. (fibonacci 12)
  3. ; 89
  • unless macro
  1. (defmacro unless (cond body) `(if ,cond () ,body))
  2. (macroexpand '(unless (= 3 4) 1))
  3. ; (if (= 3 4) NIL 1)
  4. (unless (= 3 4) 1)
  5. ; 1
  • Back quote interpolation & evaluation
  1. (define n 3)
  2. `,(+ 2 n)
  3. ; 5

How to Run

Clone the project under local-projects directory of Quicklisp or Roswell, and run commands as below.

Using Roswell
  1. ./roswell/lips.ros
Using Quicklisp
  1. (ql:quickload '(:lips) :silent t)
  2. (lips:lips)
Exit
  1. (lips:exit)

Test

  1. (ql:quickload :fiveam)
  2. (load #p"lips.asd")
  3. (load #p"lips-test.asd")
  4. (asdf:test-system :lips)