add README.

This commit is contained in:
NunoSempere 2023-05-02 22:08:21 -04:00
parent e7f964c1ad
commit 5c624faca9
4 changed files with 84 additions and 4 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/src/mpc/.git /src/mpc/.git
/src/mpc/.git/** /src/mpc/.git/**
/src/_mumble.c

77
README.md Normal file
View File

@ -0,0 +1,77 @@
# 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/chapter11_variables) 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
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> x
mumble> def { { a b c } { 1 2 3} }
mumble> * a b c
mumble> - a b c
mumble> / a b c
mumble> VERBOSITY=0
mumble> VERBOSITY=1
mumble> VERBOSITY=2
```
## Gotchas
This doesn't currently run on Windows. But it easily could, with [preprocessor statements from the book].

BIN
mumble

Binary file not shown.

View File

@ -596,7 +596,7 @@ lispval* builtin_list(lispval* v, lispenv* e)
lispval* builtin_len(lispval* v, lispenv* e) lispval* builtin_len(lispval* v, lispenv* e)
{ {
// tail { 1 2 3 } // len { 1 2 3 }
LISPVAL_ASSERT(v->count == 1, "Error: function len passed too many arguments"); LISPVAL_ASSERT(v->count == 1, "Error: function len passed too many arguments");
lispval* source = v->cell[0]; lispval* source = v->cell[0];
@ -960,7 +960,8 @@ int main(int argc, char** argv)
print_lispval_tree(env->vals[0], 2); print_lispval_tree(env->vals[0], 2);
if (VERBOSE) if (VERBOSE)
printfln("\n"); printfln("\n");
// Initialize a repl
// Initialize a repl
int loop = 1; int loop = 1;
while (loop) { while (loop) {
char* input = readline("mumble> "); char* input = readline("mumble> ");
@ -1007,11 +1008,12 @@ int main(int argc, char** argv)
} }
delete_lispval(answer); delete_lispval(answer);
if (VERBOSE > 1) if (VERBOSE > 1)
printfln("Answer after deletion: %p", answer); printfln("variable \"answer\" after deletion: %p", answer);
// delete_lispval(answer); // do this twice, just to see. // delete_lispval(answer); // do this twice, just to see.
//if(VERBOSE) printfln("Deleting this lispval:"); //if(VERBOSE) printfln("Deleting this lispval:");
// if(VERBOSE) print_lispval_tree(l,2); // if(VERBOSE) print_lispval_tree(l,2);
delete_lispval(l);
// delete_lispval(l);
// if(VERBOSE) printfln("Deleted that ^ lispval"); // if(VERBOSE) printfln("Deleted that ^ lispval");
// ^ I do not understand how the memory in l is freed. // ^ I do not understand how the memory in l is freed.
// delete the ast // delete the ast