From 6151706fb563c0fa4c82e24193e8ec9d170d04e8 Mon Sep 17 00:00:00 2001 From: Daniel Cerqueira Date: Fri, 30 May 2025 22:01:46 +0100 Subject: add split --- liblali.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'liblali.c') diff --git a/liblali.c b/liblali.c index ac552c2..9afec71 100644 --- a/liblali.c +++ b/liblali.c @@ -1075,6 +1075,30 @@ Object *primitiveJoin(Object **args, GC_PARAM) { return newSymbol(symbolResult, GC_ROOTS); } +Object *primitiveSplit(Object **args, GC_PARAM) { + Object *symbol = (*args)->car; + + if (symbol == nil || (symbol->type != TYPE_SYMBOL && + symbol->type != TYPE_STRING && + symbol->type != TYPE_NUMBER)) + exceptionWithObject(symbol, "is not a symbol, not a number, not a string"); + + GC_TRACE(gcRes, nil); + GC_TRACE(gcElement, nil); + char string[2] = {'\0'}; + size_t size = strlen(symbol->string); + for (unsigned long i = 0; i < size; i++) { + string[0] = symbol->string[i]; + if (symbol->type == TYPE_STRING) + *gcElement = newString(string, GC_ROOTS); + else + *gcElement = newSymbol(string, GC_ROOTS); + + *gcRes = newCons(gcElement, gcRes, GC_ROOTS); + } + return reverseList(*gcRes); +} + typedef struct Primitive { char *name; int nMinArgs, nMaxArgs; @@ -1118,6 +1142,7 @@ Primitive primitives[] = { { ">", 1, -1, primitiveGreater }, /* { ">=", 1, -1, primitiveGreaterEqual } */ { "join", 1, 1, primitiveJoin }, + { "split", 1, 1, primitiveSplit }, }; // Special forms handled by evalExpr. Must be in the same order as above. -- cgit