1
0
Fork 0
lesson-lisp/src/syntax.c

47 lines
1.2 KiB
C
Raw Normal View History

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;
}