diff options
author | Daniel Cerqueira <dan.git@lispclub.com> | 2025-05-30 19:26:17 +0100 |
---|---|---|
committer | Daniel Cerqueira <dan.git@lispclub.com> | 2025-05-30 19:26:17 +0100 |
commit | 2d7568afb438bb3544eb7de0a164aa2c5c2b2009 (patch) | |
tree | d9d7296dca62c09d8f0b7caa9b2f1818b8496ceb /liblali.c | |
parent | 3915751b78122737ee3afa56b39e50cc237de6d3 (diff) |
make joining strings produce a string
Diffstat (limited to 'liblali.c')
-rw-r--r-- | liblali.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -1041,19 +1041,23 @@ Object *primitiveJoin(Object **args, GC_PARAM) { exceptionWithObject((*args)->car, "is not a list"); Object *tmpCons = (*args)->car; + + int elementsType = tmpCons->car->type; + unsigned long i = strlen(tmpCons->car->string); - for (; tmpCons->cdr != nil; tmpCons = tmpCons->cdr) + for (; tmpCons->cdr != nil; tmpCons = tmpCons->cdr) { i += strlen(tmpCons->cdr->car->string); - + if (elementsType != tmpCons->cdr->car->type) + exception("cannot join list atoms of different type"); + } char symbolResult[i+1]; + tmpCons = (*args)->car; unsigned long wordLength = strlen(tmpCons->car->string); unsigned long j = 0; - // first list element for (; j < wordLength; j++) symbolResult[j] = tmpCons->car->string[j]; - // rest of list elements if (tmpCons->cdr->car != nil) { for (i = wordLength; tmpCons->cdr != nil; tmpCons = tmpCons->cdr) { @@ -1064,7 +1068,11 @@ Object *primitiveJoin(Object **args, GC_PARAM) { } } symbolResult[i] = '\0'; - return newSymbol(symbolResult, GC_ROOTS); + + if (elementsType == TYPE_STRING) + return newString(symbolResult, GC_ROOTS); + else + return newSymbol(symbolResult, GC_ROOTS); } typedef struct Primitive { |