diff --git a/lval/expressions.c b/lval/expressions.c index ab0c205..3c4f579 100644 --- a/lval/expressions.c +++ b/lval/expressions.c @@ -3,6 +3,7 @@ #include #include "expressions.h" +#include "numbers.h" #include "operations.h" #include "error.h" @@ -143,3 +144,11 @@ lval* builtin_join(lval* a) { lval_del(a); return x; } + +lval* builtin_len(lval* a) { + LASSERT(a, a->cell[0]->type == LVAL_QEXPR, "Function 'len' passed incorrect type") + lval* x = lval_long(a->cell[0]->count); + + lval_del(a); + return x; +} diff --git a/lval/expressions.h b/lval/expressions.h index c1482ca..9bda991 100644 --- a/lval/expressions.h +++ b/lval/expressions.h @@ -36,6 +36,6 @@ lval* builtin_list(lval* a); lval* builtin_eval(lval* a); lval* lval_join(lval* x, lval* y); lval* builtin_join(lval* a); - +lval* builtin_len(lval* a); #endif diff --git a/prompt.c b/prompt.c index f629658..9a5d647 100644 --- a/prompt.c +++ b/prompt.c @@ -55,7 +55,9 @@ int main (int argc, char** argv) { "double : '.' ; " "symbol : '+' | '-' | '*' | '/' | '%' \ | '^' | \"min\" | \"max\" \ - | \"list\" | \"head\" | \"tail\" | \"join\" | \"eval\";" + | \"list\" | \"head\" | \"tail\" \ + | \"join\" | \"eval\" | \"len\" \ + | \"init\" | \"cons\"; " "sexpr : '(' * ')'; " "qexpr : '{' * '}'; " @@ -166,6 +168,7 @@ lval* builtin(lval* a, char* func) { if (strcmp("tail", func) == 0) { return builtin_tail(a); } if (strcmp("join", func) == 0) { return builtin_join(a); } if (strcmp("eval", func) == 0) { return builtin_eval(a); } + if (strcmp("len", func) == 0) { return builtin_len(a); } if (strstr("+-/*^%", func)) { return builtin_op(a, func); } if (strcmp("min", func) == 0) { return builtin_op(a, func); } if (strcmp("max", func) == 0) { return builtin_op(a, func); }