summaryrefslogtreecommitdiffstats
path: root/repl.c
diff options
context:
space:
mode:
Diffstat (limited to 'repl.c')
-rw-r--r--repl.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/repl.c b/repl.c
new file mode 100644
index 0000000..53be144
--- /dev/null
+++ b/repl.c
@@ -0,0 +1,109 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <readline/readline.h>
5
6#include "types.h"
7#include "parser.h"
8#include "eval.h"
9
10
11LISP_OBJECT *Fadd(LISP_OBJECT *l)
12{
13 long long natural=0;
14
15 List *list = l->value.list;
16 LISP_OBJECT *a = NULL;
17 while(list)
18 {
19 a = list->ptr;
20 natural += *a->value.number_natural;
21 list = list->next;
22 }
23 LISP_OBJECT *c = lisp_object_make_number_natural(natural);
24 return c;
25}
26
27LISP_OBJECT *Fminus(LISP_OBJECT *l)
28{
29 LISP_OBJECT *a = l->value.list->ptr;
30 LISP_OBJECT *b = l->value.list->next->ptr;
31 LISP_OBJECT *c = lisp_object_make_number_natural(
32 *a->value.number_natural - *b->value.number_natural);
33 return c;
34}
35
36LISP_OBJECT *Fmul(LISP_OBJECT *l)
37{
38 LISP_OBJECT *a = l->value.list->ptr;
39 LISP_OBJECT *b = l->value.list->next->ptr;
40 LISP_OBJECT *c = lisp_object_make_number_natural(
41 *a->value.number_natural * *b->value.number_natural);
42 return c;
43}
44
45LISP_OBJECT *Fdiv(LISP_OBJECT *l)
46{
47 LISP_OBJECT *a = l->value.list->ptr;
48 LISP_OBJECT *b = l->value.list->next->ptr;
49 LISP_OBJECT *c = lisp_object_make_number_natural(
50 *a->value.number_natural / *b->value.number_natural);
51 return c;
52}
53
54LISP_OBJECT *Fplusone(LISP_OBJECT *l)
55{
56 LISP_OBJECT *a = l->value.list->ptr;
57 LISP_OBJECT *c = lisp_object_make_number_natural(
58 *a->value.number_natural+1);
59 return c;
60}
61
62
63LISP_OBJECT *READ(char *input)
64{
65 return parser_parse_str(input);
66}
67
68LISP_OBJECT *EVAL(LISP_OBJECT *input, HashMap *env)
69{
70 return eval(input, env);
71}
72
73void PRINT(LISP_OBJECT *input)
74{
75 lisp_object_print(input, 0);
76 lisp_object_free(input);
77}
78
79void rep(char *input, HashMap *env)
80{
81 PRINT(EVAL(READ(input), env));
82}
83
84
85int main()
86{
87 HashMap *env = NULL;
88 env = hash_map_push(env, "+", lisp_object_make_func(&Fadd));
89 env = hash_map_push(env, "-", lisp_object_make_func(&Fminus));
90 env = hash_map_push(env, "*", lisp_object_make_func(&Fmul));
91 env = hash_map_push(env, "/", lisp_object_make_func(&Fdiv));
92 env = hash_map_push(env, "++", lisp_object_make_func(&Fplusone));
93
94 char *input1 = NULL;
95 char *input = NULL;
96
97 while(1)
98 {
99 input = readline("JADL> ");
100 input1 = malloc(sizeof(char) * strlen(input) + 1);
101 strcpy(input1, input);
102 input1[strlen(input)] = '\0';
103
104 free(input);
105
106 rep(input1, env);
107 free(input1);
108 }
109}