aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/primitives.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r--src/bootstrap/primitives.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c
index f6b354e..6300067 100644
--- a/src/bootstrap/primitives.c
+++ b/src/bootstrap/primitives.c
@@ -610,26 +610,57 @@ proc_num_equal(Object *args) {
610 610
611Object * 611Object *
612proc_car(Object *args) { 612proc_car(Object *args) {
613 // TODO: stub 613 if (args == obj_nil) {
614 return NULL; 614 fprintf(stderr, "error: not enough arguments\n");
615 return obj_nil;
616 }
617 Object *obj = eval(args->car);
618 if (obj->type != OBJ_TYPE_PAIR) {
619 fprintf(stderr, "error: wrong argument type\n");
620 return obj_nil;
621 }
622 return obj->car;
615} 623}
616 624
617Object * 625Object *
618proc_cdr(Object *args) { 626proc_cdr(Object *args) {
619 // TODO: stub 627 if (args == obj_nil) {
620 return NULL; 628 fprintf(stderr, "error: not enough arguments\n");
629 return obj_nil;
630 }
631 Object *obj = eval(args->car);
632 if (obj->type != OBJ_TYPE_PAIR) {
633 fprintf(stderr, "error: wrong argument type\n");
634 return obj_nil;
635 }
636 return obj->cdr;
621} 637}
622 638
623Object * 639Object *
624proc_cons(Object *args) { 640proc_cons(Object *args) {
625 // TODO: stub 641 if (args == obj_nil || args->cdr == obj_nil) {
626 return NULL; 642 fprintf(stderr, "error: not enough arguments\n");
643 return obj_nil;
644 }
645 Object *a = eval(args->car);
646 Object *b = eval(args->cdr->car);
647 return make_pair(a, b);
627} 648}
628 649
629Object * 650Object *
630proc_list(Object *args) { 651proc_list(Object *args) {
631 // TODO: stub 652 if (args == obj_nil) {
632 return NULL; 653 return obj_nil;
654 }
655 Object *head = make_pair(eval(args->car), obj_nil);
656 Object *curr = head;
657 args = args->cdr;
658 while (args != obj_nil) {
659 curr->cdr = make_pair(eval(args->car), obj_nil);
660 curr = curr->cdr;
661 args = args->cdr;
662 }
663 return head;
633} 664}
634 665
635// 666//
@@ -639,6 +670,7 @@ proc_list(Object *args) {
639Object * 670Object *
640proc_equal(Object *args) { 671proc_equal(Object *args) {
641 // TODO: stub 672 // TODO: stub
673 (void) args;
642 return NULL; 674 return NULL;
643} 675}
644 676
@@ -649,3 +681,6 @@ proc_equal(Object *args) {
649// TODO: LAMBDA 681// TODO: LAMBDA
650// TODO: let 682// TODO: let
651// TODO: better error handling? 683// TODO: better error handling?
684// TODO: Revise all instances where we are returning an object, since currently
685// we may be returning a pointer to an object instead of a new one. Check also
686// on eval function and everytime we do make_xxx(obj).