summaryrefslogtreecommitdiff
path: root/pit/src/runtime/macroexpand.c
diff options
context:
space:
mode:
Diffstat (limited to 'pit/src/runtime/macroexpand.c')
-rw-r--r--pit/src/runtime/macroexpand.c31
1 files changed, 8 insertions, 23 deletions
diff --git a/pit/src/runtime/macroexpand.c b/pit/src/runtime/macroexpand.c
index 7ff1a6a..ffa796d 100644
--- a/pit/src/runtime/macroexpand.c
+++ b/pit/src/runtime/macroexpand.c
@@ -1,6 +1,9 @@
#include <lcq/pit/runtime/macroexpand.h>
+#include <stdio.h>
+
pit_value pit_macroexpand(pit_runtime *rt, pit_value top) {
+ fprintf(stderr, "macroexpand: "); pit_dump_to_file(rt, stderr, top, false); fprintf(stderr, "\n");
i64 expr_stack_reset = rt->expr_stack->next;
i64 result_stack_reset = rt->result_stack->next;
i64 traversal_reset = rt->traversal->next;
@@ -15,33 +18,14 @@ pit_value pit_macroexpand(pit_runtime *rt, pit_value top) {
pit_value fsym = pit_value_cons_car(rt, cur);
bool is_symbol = pit_value_is_symbol(rt, fsym);
pit_annotation *ann = pit_annotation_get(rt, pit_value_as_ref(rt, cur));
- if (is_symbol && pit_symtab_is_symbol_macro(rt, fsym)) {
+ if (is_symbol && pit_symtab_is_symbol_special_form(rt, fsym)) {
+ pit_traversal_push_value(rt, rt->traversal, cur);
+ } else if (is_symbol && pit_symtab_is_symbol_macro(rt, fsym)) {
pit_value f = pit_symtab_fget(rt, fsym);
pit_value args = pit_value_cons_cdr(rt, cur);
- pit_value res = pit_value_apply(rt, f, args);
+ pit_value res = pit_vm_apply(rt, f, args);
if (pit_vec_push(pit_value)(rt->expr_stack, res) < 0)
pit_error(rt, "macro expansion stack overflow");
- } else if (is_symbol && pit_symtab_symbol_name_match_cstr(rt, fsym, "defer")) {
- pit_value args = pit_value_cons_cdr(rt, cur);
- pit_traversal_push_value(rt, rt->traversal, pit_value_cons_car(rt, args));
- } else if (is_symbol && pit_symtab_symbol_name_match_cstr(rt, fsym, "quote")) {
- pit_traversal_push_value(rt, rt->traversal, cur);
- } else if (is_symbol && pit_symtab_symbol_name_match_cstr(rt, fsym, "lambda")) {
- pit_value args = pit_value_cons_cdr(rt, cur);
- pit_value bindings = pit_value_cons_car(rt, args);
- pit_value body = pit_value_cons_cdr(rt, args);
- i64 argcount = 0;
- if (pit_vec_push(pit_value)(rt->expr_stack, pit_value_list(rt, 2, pit_symtab_intern_cstr(rt, "defer"), bindings)) < 0)
- pit_error(rt, "macro expansion stack overflow");
- while (body != PIT_NIL) {
- pit_value a = pit_value_cons_car(rt, body);
- if (pit_vec_push(pit_value)(rt->expr_stack, a) < 0)
- pit_error(rt, "macro expansion stack overflow");
- body = pit_value_cons_cdr(rt, body);
- argcount += 1;
- }
- pit_traversal_push_application(rt, rt->traversal, argcount + 1, ann);
- pit_traversal_push_value(rt, rt->traversal, fsym);
} else {
pit_value args = pit_value_cons_cdr(rt, cur);
i64 argcount = 0;
@@ -106,6 +90,7 @@ end: {
rt->expr_stack->next = expr_stack_reset;
rt->result_stack->next = result_stack_reset;
rt->traversal->next = traversal_reset;
+ fprintf(stderr, "macroexpand result: "); pit_dump_to_file(rt, stderr, ret, false); fprintf(stderr, "\n");
return ret;
}
}