Skip to content

mmniazi/lisp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lisp Interpreter

Lisp interpreter written in C

Usage

  • Clone: git clone https://github.com/mmniazi/lisp.git
  • Build (required for run or repl): make
  • Run: lisp my_file.lisp
  • Repl: lisp

Features

  • Primitive data types and strings
  • Common operators (+, -, *, /, >, <=, == ...)
  • Comments
  • Variables
  • Flow control (if/else, while, switch)
  • Functions & lambdas
  • Higher order functions
  • Scopes
  • S-expressions
  • Q-expressions/lists and list operators
  • Varargs
  • Importing code
  • Error reporting and stack traces

Example Usage

; Fibonacci (fun {fib n} { select { (== n 0) 0 } { (== n 1) 1 } { otherwise (+ (fib (- n 1)) (fib (- n 2))) } }) 

Standard Library

curry

Call function with given list of args

= {params} {1 2 3} fun {plus x y z} {+ x y z} (curry plus params) > 6 

uncurry

Call function with single list created from args

uncurry print 1 2 3 > {1 2 3} 

do

Perform no of actions in sequence

do (= {x} 2) (+ x 4) > 6 

let

Create a local scope

let {do (= {x} 100) (x)} > 100 x > Error: Unbound Symbol 'x' 

not/or/and

Logical functions

or (and true false) true > 1 

flip

Flip arguments for currying

flip / 1 2 > 2 

comp

apply functions in sequence (comp f g x) -> f(g(x))

comp head last {1 2 {3 4 5}} 

fst/snd/trd

Return first, second or third element of list

fst {1 2 3 4} > 1 snd {1 2 3 4} > 2 trd {1 2 3 4} > 3 

nth

Return element on nth index

nth 2 {1 2 3 4} > 3 

last

Return last element of list

last {1 2 3} > 3 

len

Length of list

len {1 2 3 5} > 4 

take

Take N items from list

take 2 {1 2 3 5} > {1 2} 

drop

Drop N items from list

drop 2 {1 2 3 5} > {3 5} 

split

Split list at Nth element

split 1 {1 2 3 5} > {{1 2} {3 5}} 

elem

Check for presence of element

elem 5 {1 2 3 5} > 1 elem 9 {1 2 3 5} > 0 

map

Create new list by applying function to every elem of list

fun {square x} {* x x} map square {1 2 3} > {1 4 9} 

filter

Create a new list of items which match the condition

fun {even x} {== (% x 2) 0} filter even {1 2 3 4} > {2 4} 

foldl

Fold left

foldl * 1 {2 2} > 4 

case

switch statement, takes zero or more (cond, body) pairs

(fun {numbers x} { case x {0 "Zero"} {1 "One"} }) numbers 0 > Zero 

Credits

  • Most of this repo is direct implementation of this amazing book with major difference being that I have written my own tokenizer and parser, instead of using parser-combinator library.

About

lisp interpreter written in c

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages