6 #include "./interpreter.h"
8 struct EvalResult eval_success(struct Expr expr)
10 struct EvalResult result = {
19 struct EvalResult eval_failure(const char *error, struct Expr expr)
21 struct EvalResult result = {
30 static struct EvalResult eval_atom(struct Expr scope, struct Atom *atom)
32 /* TODO: eval_atom is not implemented */
35 return eval_failure("not implemented", void_expr());
38 static struct EvalResult eval_args(struct Expr scope, struct Expr args)
45 return eval_atom(scope, args.atom);
48 struct EvalResult car = eval(scope, args.cons->car);
53 struct EvalResult cdr = eval_args(scope, args.cons->cdr);
58 /* TODO: memory leak */
59 return eval_success(cons_as_expr(create_cons(car.expr, cdr.expr)));
65 return eval_failure("Unexpected expression", args);
68 static struct EvalResult plus_op(struct Expr scope, struct Expr args)
72 /* TODO: plus_op is not implemented*/
73 return eval_failure("not implemnted", void_expr());
76 static struct EvalResult eval_funcall(struct Expr scope, struct Cons *cons)
81 if (cons->car.type != EXPR_ATOM && cons->car.atom->type != ATOM_SYMBOL) {
82 return eval_failure("Not a function", cons->car);
85 if (strcmp(cons->car.atom->sym, "+")) {
86 struct EvalResult args = eval_args(scope, cons->cdr);
90 return plus_op(scope, args.expr);
93 return eval_failure("Unknown function", cons->car);
96 struct EvalResult eval(struct Expr scope, struct Expr expr)
100 return eval_atom(scope, expr.atom);
103 return eval_funcall(scope, expr.cons);
108 return eval_failure("Unexpected expression", expr);