summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorjdlugosz963 <jdlugosz963@gmail.com>2023-03-05 23:10:15 +0100
committerjdlugosz963 <jdlugosz963@gmail.com>2023-03-05 23:10:15 +0100
commit49aa5542a8e13d2d808f7dee6bd7418add6d74ea (patch)
treed182dbf69f5f7b421283bf2a504ed3b40811a668 /eval.c
parentf44f1f8c7ef7b6266667dce76db686af3258adfc (diff)
downloadjadl-49aa5542a8e13d2d808f7dee6bd7418add6d74ea.tar.gz
jadl-49aa5542a8e13d2d808f7dee6bd7418add6d74ea.zip
Add primitive evaluation system
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/eval.c b/eval.c
new file mode 100644
index 0000000..4e593d9
--- /dev/null
+++ b/eval.c
@@ -0,0 +1,61 @@
1#include "eval.h"
2#include "types.h"
3
4
5LISP_OBJECT *eval_apply(LISP_OBJECT *lisp_list, HashMap *env)
6{
7 if(lisp_list == NULL || lisp_list->type != LISP_TYPE_LIST)
8 return lisp_list;
9
10 LISP_OBJECT *symbol = lisp_list->value.list->ptr;
11 List *args = lisp_list->value.list->next;
12
13 LISP_OBJECT *func = hash_map_find(env, symbol->value.symbol)->value;
14
15 if(func->type != LISP_TYPE_FUNC)
16 return lisp_list;
17
18 List *tmp = lisp_list->value.list;
19 lisp_list->value.list = args;
20 LISP_OBJECT *ret = func->value.func(lisp_list);
21 lisp_list->value.list = tmp;
22 return ret;
23}
24
25LISP_OBJECT *eval_prepere_args(LISP_OBJECT *lisp_list, HashMap *env)
26{
27 if(lisp_list == NULL || lisp_list->type != LISP_TYPE_LIST)
28 return lisp_list;
29
30 LISP_OBJECT *args = lisp_object_make_list();
31 List **args_list = &args->value.list;
32
33 List *list = lisp_list->value.list;
34 LISP_OBJECT *obj = NULL;
35
36 while(list)
37 {
38 obj = list->ptr;
39 if(obj->type==LISP_TYPE_LIST)
40 obj = eval(obj, env);
41
42 *args_list = list_push(*args_list, obj);
43 list = list->next;
44 }
45
46 *args_list = list_reverse(*args_list);
47
48 return eval_apply(args, env);
49}
50
51
52LISP_OBJECT *eval(LISP_OBJECT *lisp_obj, HashMap *env)
53{
54 if(lisp_obj == NULL)
55 return NULL;
56
57 if(lisp_obj->type == LISP_TYPE_LIST)
58 return eval_prepere_args(lisp_obj, env);
59
60 return lisp_obj;
61}