forked from splatspace/wombat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
97 lines (83 loc) · 2.01 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "types.h"
#include "read_form.h"
#include "print_form.h"
#include "alist.h"
#ifdef ARDUINO
#include "arduino_io.h"
#endif
void* car(void** env, void* expr) {
return CAR(CONS(expr));
}
void* cdr(void** env, void* expr) {
return CDR(CONS(expr));
}
void* quote(void** env, void* expr) {
return expr;
}
void* eq(void** env, void* expr) {
return equal(CAR(expr), CDR(expr));
}
void* eval(void** env, void* expr) {
void *op, *arg, *args;
switch(type(expr)) {
case CONS:
if (!CAR(expr) && !CDR(expr)) {
return expr;
} else {
op = get(*env, CAR(expr));
args = CDR(expr);
while((args)) {
arg = CAR(args);
printf("arg: ");
print_form(arg);
printf("\n");
args = CDR(args) ;
}
switch(type(op)) {
case SPECIAL:
return(expr);
/* return SPECIAL(op)->fn(*env, list); */
default:
return expr;
}
}
case SYMBOL:
return get(*env, expr);
default:
return expr;
}
}
int main(int argc, char *argv[]) {
#ifdef ARDUINO
ARDUINO_INIT_IO(9600);
#endif
/* populate env with special forms */
void *env = empty();
Special Car = { SPECIAL, "car", &car };
Special Cdr = { SPECIAL, "cdr", &cdr };
Special Quote = { SPECIAL, "quote", "e };
Special Eq = { SPECIAL, "eq", &eq };
Special Eval = { SPECIAL, "eval", &eval };
assoc(&env, sym("car"), (void*)&Car);
assoc(&env, sym("cdr"), (void*)&Cdr);
assoc(&env, sym("quote"), (void*)&Quote);
assoc(&env, sym("eq"), (void*)&Eq);
assoc(&env, sym("eval"), (void*)&Eval);
print_form(cons(sym("eq"), cons(integer(1), integer(2))));
printf("\n");
print_form(eval(&env, cons(sym("eq"), cons(integer(2), integer(3)))));
printf("\n");
printf("\n");
print_form(eval(&env, cons(sym("eq"), cons(integer(1), cons(integer(2), integer(3))))));
printf("\n");
while(1) {
printf("=> ");
print_form(read_form(stdin));
printf("\n");
}
return 0;
}