diff options
Diffstat (limited to 'liblali.c')
-rw-r--r-- | liblali.c | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -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. |