From a47f72f510b7195f96779715d1dfac7cdda8e295 Mon Sep 17 00:00:00 2001 From: Brandon Rozek Date: Sat, 9 Jun 2018 10:16:03 -0400 Subject: [PATCH] Added builtin cons operation --- lval/expressions.c | 15 +++++++++++++++ lval/expressions.h | 1 + lval/operations.c | 1 - prompt.c | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lval/expressions.c b/lval/expressions.c index 77fc9e3..0400984 100644 --- a/lval/expressions.c +++ b/lval/expressions.c @@ -165,3 +165,18 @@ lval* builtin_len(lval* a) { lval_del(a); return x; } + +lval* builtin_cons(lval* a) { + LASSERT(a, a->cell[0]->type != LVAL_QEXPR, "Function 'cons' passed incorrect type on first argument") + LASSERT(a, a->cell[1]->type == LVAL_QEXPR, "Function 'cons' passed incorrect type on second argument") + LASSERT(a, a->count == 2, "Function 'cons' passed an incorrect number of arguments") + + lval* x = lval_qexpr(); + x = lval_add(x, lval_pop(a, 0)); + x = lval_join(x, lval_pop(a, 0)); + + lval_del(a); + + return x; + +} diff --git a/lval/expressions.h b/lval/expressions.h index 5893a01..8cc2a59 100644 --- a/lval/expressions.h +++ b/lval/expressions.h @@ -41,5 +41,6 @@ lval* builtin_eval(lval* a); lval* lval_join(lval* x, lval* y); lval* builtin_join(lval* a); lval* builtin_len(lval* a); +lval* builtin_cons(lval* a); #endif diff --git a/lval/operations.c b/lval/operations.c index e011b34..67611ad 100644 --- a/lval/operations.c +++ b/lval/operations.c @@ -50,7 +50,6 @@ lval* lval_eval(lval* v) { return v; } - void lval_del(lval* v) { switch (v->type) { case LVAL_LONG: break; diff --git a/prompt.c b/prompt.c index eb08752..3701c44 100644 --- a/prompt.c +++ b/prompt.c @@ -170,6 +170,7 @@ lval* builtin(lval* a, char* func) { if (strcmp("eval", func) == 0) { return builtin_eval(a); } if (strcmp("len", func) == 0) { return builtin_len(a); } if (strcmp("init", func) == 0) { return builtin_init(a); } + if (strcmp("cons", func) == 0) { return builtin_cons(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); }