From fece4fc3d4decb70c94b49ab854fa9ae93b4d887 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Fri, 14 Aug 2026 14:51:01 -0400 Subject: pit: More VM-style evaluation --- pit/src/runtime/macroexpand.c | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) (limited to 'pit/src/runtime/macroexpand.c') 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 +#include + 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; } } -- cgit v1.3.1