#include "syntax.h" #include "eval.h" #include "object.h" #include struct Object *syntax_begin(struct Object *args) { assert(OBJECT_IS_LIST_HEAD(args)); struct Object *result = NULL; while (!OBJECT_IS_NULL(args)) { assert(Object_is_pair(args)); result = eval(args->pair.a); args = args->pair.b; } return result; } struct Object *syntax_if(struct Object *const args) { assert(Object_is_pair(args)); struct Object *const cond = args->pair.a; struct Object *const then_else_list = args->pair.b; assert(then_else_list); assert(Object_is_pair(then_else_list)); struct Object *const then_branch = then_else_list->pair.a; struct Object *const else_list = then_else_list->pair.b; assert(else_list); assert(Object_is_pair(else_list)); struct Object *const else_branch = else_list->pair.a; assert(OBJECT_IS_NULL(else_list->pair.b)); if (Object_is_false(cond)) { return eval(else_branch); } else { return eval(then_branch); } } struct Object *syntax_quote(struct Object *const args) { assert(Object_is_pair(args)); assert(OBJECT_IS_NULL(args->pair.b)); return args->pair.a; }