5 #include "./builtins.h"
7 #include "./interpreter.h"
9 struct EvalResult eval_success(struct Expr expr)
11 struct EvalResult result = {
20 struct EvalResult eval_failure(const char *error, struct Expr expr)
22 struct EvalResult result = {
31 static struct EvalResult eval_atom(struct Expr scope, struct Atom *atom)
33 /* TODO: eval_atom is not implemented */
36 return eval_failure("not implemented", void_expr());
39 static struct EvalResult eval_args(struct Expr scope, struct Expr args)
46 return eval_atom(scope, args.atom);
49 struct EvalResult car = eval(scope, args.cons->car);
54 struct EvalResult cdr = eval_args(scope, args.cons->cdr);
59 /* TODO: memory leak */
60 return eval_success(cons_as_expr(create_cons(car.expr, cdr.expr)));
66 return eval_failure("Unexpected expression", args);
69 static struct EvalResult plus_op(struct Expr args)
73 while (!nil_p(args)) {
74 if (args.type != EXPR_CONS) {
75 return eval_failure("Expected cons", args);
78 if (args.cons->car.type != EXPR_ATOM ||
79 args.cons->car.atom->type != ATOM_NUMBER) {
80 return eval_failure("Expected number", args.cons->car);
83 result += args.cons->car.atom->num;
84 args = args.cons->cdr;
87 return eval_success(atom_as_expr(create_number_atom(result)));
90 static struct EvalResult eval_funcall(struct Expr scope, struct Cons *cons)
95 if (cons->car.type != EXPR_ATOM && cons->car.atom->type != ATOM_SYMBOL) {
96 return eval_failure("Not a function", cons->car);
99 if (strcmp(cons->car.atom->sym, "+")) {
100 struct EvalResult args = eval_args(scope, cons->cdr);
104 return plus_op(args.expr);
107 return eval_failure("Unknown function", cons->car);
110 struct EvalResult eval(struct Expr scope, struct Expr expr)
114 return eval_atom(scope, expr.atom);
117 return eval_funcall(scope, expr.cons);
122 return eval_failure("Unexpected expression", expr);