Added builtin len functionality for Q-expressions
This commit is contained in:
parent
a485e65838
commit
3c27644903
3 changed files with 14 additions and 2 deletions
|
@ -3,6 +3,7 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
5
prompt.c
5
prompt.c
|
@ -55,7 +55,9 @@ int main (int argc, char** argv) {
|
|||
"double : <long> '.' <number>; "
|
||||
"symbol : '+' | '-' | '*' | '/' | '%' \
|
||||
| '^' | \"min\" | \"max\" \
|
||||
| \"list\" | \"head\" | \"tail\" | \"join\" | \"eval\";"
|
||||
| \"list\" | \"head\" | \"tail\" \
|
||||
| \"join\" | \"eval\" | \"len\" \
|
||||
| \"init\" | \"cons\"; "
|
||||
|
||||
"sexpr : '(' <expr>* ')'; "
|
||||
"qexpr : '{' <expr>* '}'; "
|
||||
|
@ -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); }
|
||||
|
|
Reference in a new issue