3 unstable releases

0.2.1 Jan 24, 2023
0.2.0 Jan 22, 2023
0.1.0 Jan 21, 2023

#552 in Programming languages

GPL-2.0 license

33KB
767 lines

Callum's Lisp

Build Crates.io Docs Lines of code Files License

A Lisp interpreter designed to be run in the browser using WASM.

Usage

You can perform simple numerical operations using +, -, *, and /:

(+ 1 2) => 3
(/ 5 2) => 2.5
(- 2) => -2
(/ 5) => 0.2

You can define constants using def:

(def x 3) => 3
x => 3

You can create functions using lambda:

(lambda (x) (+ x 1)) => <function>
(def add1 (lambda (x) (+ x 1))) => <unspecified>
(add1 3) => 4

List of all builtin functions and special forms

Special forms

  • (def name value): creates a binding of name to value in current environment
  • (lambda (bindings) expr) or (λ (bindings) expr): creates a function
  • (if cond do else): evaluate do expr if cond is true, otherwise evaluate else expr

Builtin functions

  • +,-,*,/: simple arithmetic operators
  • exit: exits with code 0 or code provided by argument
  • eval: evaluate the expression passed as an argument
  • use: evaluate all expressions contained in a file in the current environment
  • putstr: print a string to stdout
  • readline: read a line from stdin
  • equal?: check if any amount of values are equal
  • >, >=, <, <=: number comparison operators
  • list: creates a list out of arguments given
  • list?: returns true if argument is a list, otherwise returns false
  • empty?: returns true if argument is a list of length 0, otherwise returns false
  • count: returns the length of the argument if the argument is a list

Goals

Goals in order of priority:

  • Tail call optimization
  • Macros
  • Proper error handling
  • Strings
  • Multi-precision numbers
  • Vectors
  • Structs/enums/union types
  • IO (print, readline, etc.)

Dependencies

~1.5–2.4MB
~46K SLoC