diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/parser.c b/src/parser.c index 29a0444..bd52c49 100644 --- a/src/parser.c +++ b/src/parser.c | |||
@@ -852,7 +852,44 @@ object_equal(Object *a, Object *b) { | |||
852 | return sv_equal(&a->text, &b->text); | 852 | return sv_equal(&a->text, &b->text); |
853 | } break; | 853 | } break; |
854 | case OBJ_TYPE_BUILTIN: { | 854 | case OBJ_TYPE_BUILTIN: { |
855 | return a->builtin = b->builtin; | 855 | return a->builtin == b->builtin; |
856 | } break; | ||
857 | case OBJ_TYPE_PAIR: { | ||
858 | Object *a_head = a->head; | ||
859 | Object *b_head = b->head; | ||
860 | if (!object_equal(a_head, b_head)) { | ||
861 | return false; | ||
862 | } | ||
863 | Object *a_tail = a->tail; | ||
864 | Object *b_tail = b->tail; | ||
865 | while (a_tail != NULL && b_tail != NULL) { | ||
866 | if (!object_equal(a_head, b_head)) { | ||
867 | return false; | ||
868 | } | ||
869 | a_head = a_tail->head; | ||
870 | b_head = b_tail->head; | ||
871 | a_tail = a_tail->tail; | ||
872 | b_tail = b_tail->tail; | ||
873 | } | ||
874 | if (a_tail == b_tail && object_equal(a_head, b_head)) { | ||
875 | return true; | ||
876 | } | ||
877 | return false; | ||
878 | } break; | ||
879 | case OBJ_TYPE_LAMBDA: { | ||
880 | size_t n_params_a = array_size(a->params); | ||
881 | size_t n_params_b = array_size(b->params); | ||
882 | size_t n_expr_a = array_size(a->body); | ||
883 | size_t n_expr_b = array_size(b->body); | ||
884 | if (n_params_a != n_params_b || n_expr_a != n_expr_b) { | ||
885 | return false; | ||
886 | } | ||
887 | for (size_t i = 0; i < array_size(a->body); ++i) { | ||
888 | if (!object_equal(a->body[i], b->body[i])) { | ||
889 | return false; | ||
890 | } | ||
891 | } | ||
892 | return true; | ||
856 | } break; | 893 | } break; |
857 | default: break; | 894 | default: break; |
858 | } | 895 | } |