diff options
| -rw-r--r-- | liblali.c | 26 |
1 files changed, 14 insertions, 12 deletions
@@ -1041,21 +1041,23 @@ bool hasADot(char *string) { return false; } +Object *say(Object *object, GC_PARAM) { + if ((object)->type != TYPE_SYMBOL && + (object)->type != TYPE_NUMBER && + (object)->type != TYPE_CONS) + exceptionWithObject(object, "cannot have say"); + + Object *result = newObject(TYPE_CONS, GC_ROOTS); + result->car = nil; + result->cdr = object; + return result; +} + Object *primitiveJoin(Object **args, GC_PARAM) { + // check if there are () arguments if ((*args)->car == nil) exception("cannot join an empty list"); - else if ((*args)->car->type != TYPE_CONS) - 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) { - i += strlen(tmpCons->cdr->car->string); - if (elementsType != tmpCons->cdr->car->type) - exception("cannot join list atoms of different type"); } char symbolResult[i+1]; @@ -1441,7 +1443,7 @@ Object *evalExpr(Object **object, Object **env, GC_PARAM) { break; case PRIMITIVE_QUOTE: return (*gcArgs)->car; case PRIMITIVE_SAY: *gcArgs = (*gcArgs)->car; - return newCons(&nil, gcArgs, GC_ROOTS); + return say(*gcArgs, GC_ROOTS); case PRIMITIVE_SET: return evalSet(gcArgs, gcEnv, GC_ROOTS); case PRIMITIVE_PROG: *gcObject = evalProg(gcArgs, gcEnv, GC_ROOTS); break; |
