summaryrefslogtreecommitdiff
path: root/liblali.c
diff options
context:
space:
mode:
authorDaniel Cerqueira <dan.git@lispclub.com>2025-05-30 22:01:46 +0100
committerDaniel Cerqueira <dan.git@lispclub.com>2025-05-30 22:01:46 +0100
commit6151706fb563c0fa4c82e24193e8ec9d170d04e8 (patch)
treef52d53d40752fa740568a38d6f45a7a3c67052ef /liblali.c
parent2d7568afb438bb3544eb7de0a164aa2c5c2b2009 (diff)
add split
Diffstat (limited to 'liblali.c')
-rw-r--r--liblali.c25
1 files changed, 25 insertions, 0 deletions
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.