diff options
author | jdlugosz963 <jdlugosz963@gmail.com> | 2023-03-05 23:10:15 +0100 |
---|---|---|
committer | jdlugosz963 <jdlugosz963@gmail.com> | 2023-03-05 23:10:15 +0100 |
commit | 49aa5542a8e13d2d808f7dee6bd7418add6d74ea (patch) | |
tree | d182dbf69f5f7b421283bf2a504ed3b40811a668 /eval.c | |
parent | f44f1f8c7ef7b6266667dce76db686af3258adfc (diff) | |
download | jadl-49aa5542a8e13d2d808f7dee6bd7418add6d74ea.tar.gz jadl-49aa5542a8e13d2d808f7dee6bd7418add6d74ea.zip |
Add primitive evaluation system
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -0,0 +1,61 @@ | |||
1 | #include "eval.h" | ||
2 | #include "types.h" | ||
3 | |||
4 | |||
5 | LISP_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 | |||
25 | LISP_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 | |||
52 | LISP_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 | } | ||