reimplementation (oupsi)
This commit is contained in:
parent
0572264f76
commit
1aec6085d9
27 changed files with 1213 additions and 21 deletions
53
src/prim.c
Normal file
53
src/prim.c
Normal 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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue