2023-05-05 18:26:07 +00:00
|
|
|
#include "syntax.h"
|
|
|
|
|
|
|
|
#include "eval.h"
|
|
|
|
#include "object.h"
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
2023-05-05 18:31:42 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2023-05-05 18:26:07 +00:00
|
|
|
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;
|
2023-05-05 18:31:42 +00:00
|
|
|
assert(OBJECT_IS_NULL(else_list->pair.b));
|
2023-05-05 18:26:07 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|