diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap/primitives.c | 51 |
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 | ||
611 | Object * | 611 | Object * |
612 | proc_car(Object *args) { | 612 | proc_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 | ||
617 | Object * | 625 | Object * |
618 | proc_cdr(Object *args) { | 626 | proc_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 | ||
623 | Object * | 639 | Object * |
624 | proc_cons(Object *args) { | 640 | proc_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 | ||
629 | Object * | 650 | Object * |
630 | proc_list(Object *args) { | 651 | proc_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) { | |||
639 | Object * | 670 | Object * |
640 | proc_equal(Object *args) { | 671 | proc_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). | ||