implement macros and dotted pairs
This commit is contained in:
parent
44237a650d
commit
83fce46449
9 changed files with 68 additions and 15 deletions
24
src/prim.c
24
src/prim.c
|
|
@ -223,6 +223,30 @@ O prim_fn(In *in, O args, O env) {
|
|||
return BOX(hdr);
|
||||
}
|
||||
|
||||
O prim_mac(In *in, O args, O env) {
|
||||
O params = nextarg(&args);
|
||||
O body = args;
|
||||
|
||||
I mark = gc_rootmark(&in->gc);
|
||||
gc_addroot(&in->gc, ¶ms);
|
||||
gc_addroot(&in->gc, &env);
|
||||
gc_addroot(&in->gc, &body);
|
||||
|
||||
O progn = symbol_make(in, "progn");
|
||||
O body_form = pair_make(in, progn, body);
|
||||
gc_addroot(&in->gc, &body_form);
|
||||
|
||||
Gh *hdr = gc_alloc(&in->gc, sizeof(Gh) + sizeof(Cl));
|
||||
hdr->type = TYPE_MAC;
|
||||
Cl *cl = (Cl *)(hdr + 1);
|
||||
cl->args = params;
|
||||
cl->env = env;
|
||||
cl->body = body_form;
|
||||
|
||||
gc_rootreset(&in->gc, mark);
|
||||
return BOX(hdr);
|
||||
}
|
||||
|
||||
O prim_gc(In *in, O args, O env) {
|
||||
(void)in;
|
||||
(void)args;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue