summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--liblali.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/liblali.c b/liblali.c
index 3c749f4..561aac4 100644
--- a/liblali.c
+++ b/liblali.c
@@ -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;