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 | } | ||
