From 34ee57d759f6dfcc93d2c4d63eb01fdc7a7abcac Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Thu, 21 Apr 2011 14:38:00 -0700 Subject: [PATCH] fix cons --- src/list.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/list.c b/src/list.c index b834eda..936ff1c 100644 --- a/src/list.c +++ b/src/list.c @@ -45,9 +45,16 @@ LakeList *list_make(void) LakeList *list_cons(LakeVal *car, LakeVal *cdr) { - LakeList *list = list_make_with_capacity(2); - list->vals[0] = car; - list->vals[1] = cdr; + LakeList *list; + if (IS(TYPE_LIST, cdr)) { + list = LIST(cdr); + list_unshift(list, car); + } + else { + list = list_make_with_capacity(2); + list->vals[0] = car; + list->vals[1] = cdr; + } return list; } @@ -129,6 +136,24 @@ LakeVal *list_shift(LakeList *list) return head; } +LakeVal *list_unshift(LakeList *list, LakeVal *val) +{ + if (list->n == 0) { + list_append(list, val); + } + else { + if (list->n >= list->cap) { + list_grow(list); + } + size_t i = list->n++; + while (i--) { + list->vals[i] = list->vals[i - 1]; + } + list->vals[0] = val; + } + return NULL; +} + LakeVal *list_pop(LakeList *list) { LakeVal *tail = NULL;