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)
38 return eval_success(atom_as_expr(atom));
41 /* TODO: Evaluating symbols is not implemented */
42 return eval_failure("Evaluating symbols is not implemented",
46 return eval_failure("Unexpected expression", atom_as_expr(atom));
49 static struct EvalResult eval_args(struct Expr scope, struct Expr args)
56 return eval_atom(scope, args.atom);
59 struct EvalResult car = eval(scope, args.cons->car);
64 struct EvalResult cdr = eval_args(scope, args.cons->cdr);
69 /* TODO: memory leak */
70 return eval_success(cons_as_expr(create_cons(car.expr, cdr.expr)));
76 return eval_failure("Unexpected expression", args);
79 static struct EvalResult plus_op(struct Expr args)
83 while (!nil_p(args)) {
84 if (args.type != EXPR_CONS) {
85 return eval_failure("Expected cons", args);
88 if (args.cons->car.type != EXPR_ATOM ||
89 args.cons->car.atom->type != ATOM_NUMBER) {
90 return eval_failure("Expected number", args.cons->car);
93 result += args.cons->car.atom->num;
94 args = args.cons->cdr;
97 return eval_success(atom_as_expr(create_number_atom(result)));
100 static struct EvalResult eval_funcall(struct Expr scope, struct Cons *cons)
105 if (cons->car.type != EXPR_ATOM && cons->car.atom->type != ATOM_SYMBOL) {
106 return eval_failure("Not a function", cons->car);
109 if (strcmp(cons->car.atom->sym, "+")) {
110 struct EvalResult args = eval_args(scope, cons->cdr);
114 return plus_op(args.expr);
117 return eval_failure("Unknown function", cons->car);
120 struct EvalResult eval(struct Expr scope, struct Expr expr)
124 return eval_atom(scope, expr.atom);
127 return eval_funcall(scope, expr.cons);
132 return eval_failure("Unexpected expression", expr);