# Mumble: A lisp in C ## About This is a Lisp written in C. It follows the outline in this [Build Your Own Lisp](https://buildyourownlisp.com) book, though it then adds some small tweaks and improvements and quality of life improvements: - A makefile - Configurable verbosity levels - Different and perhaps slightly more elegant printing functions - A slightly different approach to evaluating functions - Capturing Ctrl+D - Float instead of ints Conversely, it doesn't have: - Function currying - strings - Variable arguments - ... Overall this might be mostly of interest as a pointer to the book that this is originally based on. And to readers of that same book, I'd be curious to see what you ended up with. ## Installation and usage ### Dependencies This depends on [editline](https://github.com/troglobit/editline), which can be installed on Debian/Ubuntu with: ``` git clone https://github.com/troglobit/editline ./autogen.sh ./configure make all sudo make install ldconfig ``` Readers might also find it interesting to compile it with [tiny c compiler](https://bellard.org/tcc/) rather than gcc, as it is significantly faster. ### Compilation ``` git clone https://github.com/NunoSempere/mumble make # sudo make install # ``` ### Usage Simply call the `./mumble` binary: ``` ./mumble ``` ## Example usage ``` mumble> (1 2 3) mumble> { 1 2 3 } mumble> head {1 2 3} mumble> { head {1 2 3) } mumble> tail { 1 2 3 } mumble> list ( 1 2 3 ) mumble> eval { head {1 2 3} } mumble> (eval { head {+ tail head } } ) 1 2 3 mumble> len {1 2 3} mumble> join { {1 2} {3 4} } mumble> def {x} { 100 } mumble> def {y} 100 mumble> (x y) mumble> VERBOSITY=2 mumble> def {sq} (@ {x} {* x x}) mumble> sq 44 mumble> VERBOSITY=1 mumble> def {sqsum} (@ {x y} {(+ (sq x) (sq y))}) mumble> sqsum 2 3 mumble> VERBOSITY=0 mumble> def {init} (@ {xs} { list((head xs)) } ) mumble> def {kopf} (@ {xx} { head (list xx) } ) mumble> init {1 2} mumble> kopf (1 2) mumble> ifelse 1 2 3 mumble> if 1 2 3 mumble> ifelse 0 1 2 mumble> if 0 1 2 mumble> if {1 2 3} (1) (1) mumble> def {positive} (@ {x} {> x 0}) mumble> def {fibtest} (@ {x} {if (> x 0) {+ x 1} 0 }) mumble> fibtest 2 mumble> def {fibonacci} (@ {x} {if (> x 1) { + (fibonacci (- x 2)) ( fibonacci ( - x 1 ) ) } 1} ) mumble> fibonacci 4 mumble> def {!} (@ {x} { if ( > 1 x) 1 { * x (! (- x 1)) } }) mumble> ! 100 mumble> def {++} (@ {x} { if ( > 1 x) 0 { + x (++ (- x 1)) } }) mumble> ++ 10 mumble> def {++2} (@ {x} { / (* x (+ x 1)) 2 }) mumble> ++2 10 ``` ## To do - [x] Define functions - [x] Define if, = and > - [x] Build fibonacci function ## Gotchas This doesn't currently run on Windows. But it easily could, with the preprocessor staments from parsing.c [here](https://buildyourownlisp.com/chapter6_parsing).