diff --git a/Makefile b/Makefile index 122990f..f407181 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -run: prompt.c loperations.o lnumbers.o lexpressions.o lio.o mpc.o - cc -std=c99 -Wall prompt.c loperations.o lnumbers.o lexpressions.o lio.o mpc.o -ledit -lm -o prompt +run: prompt.c loperations.o lnumbers.o lexpressions.o lio.o lerror.o mpc.o + cc -std=c99 -Wall prompt.c loperations.o lnumbers.o lexpressions.o lio.o lerror.o mpc.o -ledit -lm -o prompt loperations.o: lval/operations.c lval/operations.h cc -std=c99 -Wall -c lval/operations.c -o loperations.o lnumbers.o: lval/numbers.c lval/numbers.h @@ -8,6 +8,8 @@ lexpressions.o: lval/expressions.c lval/expressions.h cc -std=c99 -Wall -c lval/expressions.c -o lexpressions.o lio.o: lval/io.c lval/io.h cc -std=c99 -Wall -c lval/io.c -o lio.o +lerror.o: lval/error.c lval/error.h + cc -std=c99 -Wall -c lval/error.c -o lerror.o mpc.o: mpc.c mpc.h cc -std=c99 -Wall -lm -c mpc.c clean: diff --git a/lval.h b/lval.h index 6046b6f..0fe7489 100644 --- a/lval.h +++ b/lval.h @@ -4,6 +4,8 @@ // Bring in the lval struct and lispy types #include "lval/base.h" +// Error functionality +#include "lval/error.h" // Adds functionality for the numeric data type #include "lval/numbers.h" // Adds functionality for the expression (Q or S) data type diff --git a/lval/error.c b/lval/error.c new file mode 100644 index 0000000..22f3936 --- /dev/null +++ b/lval/error.c @@ -0,0 +1,11 @@ +#include +#include +#include "error.h" + +lval* lval_err(char* m) { + lval* v = (lval *) malloc(sizeof(lval)); + v->type = LVAL_ERR; + v->err = (char *) malloc(strlen(m) + 1); + strcpy(v->err, m); + return v; +} \ No newline at end of file diff --git a/lval/error.h b/lval/error.h new file mode 100644 index 0000000..19b9a45 --- /dev/null +++ b/lval/error.h @@ -0,0 +1,11 @@ +#ifndef LVAL_ERROR +#define LVAL_ERROR +#include +#include "base.h" + +lval* lval_err(char* m); + +#define LASSERT(args, cond, err) \ + if (!(cond)) { lval_del(args); return lval_err(err); } + +#endif diff --git a/lval/expressions.c b/lval/expressions.c index 4ade6ff..9ab6c8c 100644 --- a/lval/expressions.c +++ b/lval/expressions.c @@ -2,8 +2,9 @@ #include #include -#include "operations.h" #include "expressions.h" +#include "operations.h" +#include "error.h" // Think about where to put this declaration later lval* builtin_op(lval* v, char* op); diff --git a/lval/numbers.c b/lval/numbers.c index c5b14d7..ee151b3 100644 --- a/lval/numbers.c +++ b/lval/numbers.c @@ -1,5 +1,6 @@ #include #include "numbers.h" +#include "error.h" lval* lval_long(long x) { lval* v = (lval *) malloc(sizeof(lval)); diff --git a/lval/operations.c b/lval/operations.c index d6049c3..e011b34 100644 --- a/lval/operations.c +++ b/lval/operations.c @@ -12,14 +12,6 @@ lval* lval_sym(char* s) { return v; } -lval* lval_err(char* m) { - lval* v = (lval *) malloc(sizeof(lval)); - v->type = LVAL_ERR; - v->err = (char *) malloc(strlen(m) + 1); - strcpy(v->err, m); - return v; -} - lval* lval_read(mpc_ast_t* t) { // If symbol or number, convert if (strstr(t->tag, "long")) { return lval_read_long(t); } diff --git a/lval/operations.h b/lval/operations.h index 7acea43..501e2e4 100644 --- a/lval/operations.h +++ b/lval/operations.h @@ -4,9 +4,8 @@ #include "../mpc.h" #include "base.h" -// Constructor for other data types +// Constructor for symbol data type lval* lval_sym(char* s); -lval* lval_err(char* m); /* Methods to read (parse AST), evaluate, diff --git a/prompt.c b/prompt.c index 0fb3be7..0107d18 100644 --- a/prompt.c +++ b/prompt.c @@ -53,8 +53,9 @@ int main (int argc, char** argv) { "number : /[0-9]+/; " "long : /-?[0-9]+/; " "double : '.' ; " - "symbol : '+' | '-' | '*' | '/' | '%' \ - | '^' | \"min\" | \"max\"; " + "symbol : '+' | '-' | '*' | '/' | '%' \ + | '^' | \"min\" | \"max\" \ + | \"list\" | \"head\" | \"tail\" | \"join\" | \"eval\" " "sexpr : '(' * ')'; " "qexpr : '{' * '}'; "