reimplementation (oupsi)

This commit is contained in:
Lobo 2026-01-10 10:03:31 -03:00
parent 0572264f76
commit 1aec6085d9
27 changed files with 1213 additions and 21 deletions

53
src/prim.c Normal file
View file

@ -0,0 +1,53 @@
#include <prim.h>
#include <stdlib.h>
#include <wolflisp.h>
O prim_make(In *in, const char *name, O (*fn)(In *, O, O)) {
Pr *pr = malloc(sizeof(Pr));
pr->name = name;
pr->fn = fn;
O sym = BOX(TAG(intern(&in->symtab, name, 0), TAG_SYM));
O prim = BOX(TAG(pr, TAG_PRIM));
return pair_make(&in->gc, sym, prim);
}
O prim_cons(In *in, O args, O env) {
args = interp_eval_list(in, args, env);
O head = pair_unwrap(args)->head;
args = pair_unwrap(args)->tail;
O tail = pair_unwrap(args)->head;
return pair_make(&in->gc, head, tail);
}
O prim_head(In *in, O args, O env) {
args = interp_eval_list(in, args, env);
return pair_unwrap(pair_unwrap(args)->head)->head;
}
O prim_tail(In *in, O args, O env) {
args = interp_eval_list(in, args, env);
return pair_unwrap(pair_unwrap(args)->head)->tail;
}
O prim_print(In *in, O args, O env) {
args = interp_eval_list(in, args, env);
O arg = pair_unwrap(args)->head;
print(arg);
return NIL;
}
O prim_println(In *in, O args, O env) {
args = interp_eval_list(in, args, env);
O arg = pair_unwrap(args)->head;
println(arg);
return NIL;
}
O prim_quote(In *in, O args, O env) {
(void)in;
(void)env;
if (args == NIL)
return NIL;
return pair_unwrap(args)->head;
}