Added builtin cons operation
This commit is contained in:
parent
cd75e60fb9
commit
a47f72f510
4 changed files with 17 additions and 1 deletions
|
@ -165,3 +165,18 @@ lval* builtin_len(lval* a) {
|
||||||
lval_del(a);
|
lval_del(a);
|
||||||
return x;
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -41,5 +41,6 @@ lval* builtin_eval(lval* a);
|
||||||
lval* lval_join(lval* x, lval* y);
|
lval* lval_join(lval* x, lval* y);
|
||||||
lval* builtin_join(lval* a);
|
lval* builtin_join(lval* a);
|
||||||
lval* builtin_len(lval* a);
|
lval* builtin_len(lval* a);
|
||||||
|
lval* builtin_cons(lval* a);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,7 +50,6 @@ lval* lval_eval(lval* v) {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void lval_del(lval* v) {
|
void lval_del(lval* v) {
|
||||||
switch (v->type) {
|
switch (v->type) {
|
||||||
case LVAL_LONG: break;
|
case LVAL_LONG: break;
|
||||||
|
|
1
prompt.c
1
prompt.c
|
@ -170,6 +170,7 @@ lval* builtin(lval* a, char* func) {
|
||||||
if (strcmp("eval", func) == 0) { return builtin_eval(a); }
|
if (strcmp("eval", func) == 0) { return builtin_eval(a); }
|
||||||
if (strcmp("len", func) == 0) { return builtin_len(a); }
|
if (strcmp("len", func) == 0) { return builtin_len(a); }
|
||||||
if (strcmp("init", func) == 0) { return builtin_init(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 (strstr("+-/*^%", func)) { return builtin_op(a, func); }
|
||||||
if (strcmp("min", func) == 0) { 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); }
|
if (strcmp("max", func) == 0) { return builtin_op(a, func); }
|
||||||
|
|
Reference in a new issue