Obj adjoinArg(Obj val, Obj arglist) { List* args = GETLIST(arglist); if (!args) return LISTOBJ(makeList(val, args)); List* pnr = args; while (pnr->cdr) pnr = pnr->cdr; pnr->cdr = malloc(sizeof(List)); pnr = pnr->cdr; pnr->car = val; pnr->cdr = NULL; return LISTOBJ(args); }
Obj transformOr(Obj expr) { Obj seq = boolExps(expr); if (noExps(seq)) return FALSEOBJ; Obj first = firstExp(seq); List* cdr = GETLIST(seq)->cdr; Obj rest = LISTOBJ(makeList(OROBJ, cdr)); List* ifTrans = makeList( IFOBJ, makeList(first, makeList(TRUEOBJ, makeList(rest, NULL)))); return LISTOBJ(ifTrans); }
Obj transformDelay(Obj expr) { List* list = makeList(LAMBDAOBJ, makeList(NULLOBJ, makeList(delayExpr(expr), NULL))); Obj obj = LISTOBJ(list); return obj; }
Obj adjoinArg(Obj val, Obj arglist) { List* args = GETLIST(arglist); List* head = malloc(sizeof(List)); head->car = val; head->cdr = args; head = reverse(head); return LISTOBJ(head); }
bool noCompoundArgs(Obj expr) { if (noArgs(expr)) return true; else { List* list = GETLIST(expr); return isSimple(list->car) && noCompoundArgs(LISTOBJ(list->cdr)); } }
Obj makeFunc(Obj params, Obj body, Obj env) { List* list = makeList(NAMEOBJ(FUN_KEY), makeList(params, makeList(body, makeList(env, NULL)))); Obj obj = LISTOBJ(list); return obj; }
Obj beginActions(Obj expr) { return LISTOBJ(CDR(GETLIST(expr))); }
Obj restExps(Obj seq) { // return MKOBJ(LIST, list, CDR(GETLIST(seq))); return LISTOBJ(CDR(GETLIST(seq))); }
Obj funcBody(Obj obj) { return LISTOBJ(CDDR(GETLIST(obj))); }
Obj restArgs(Obj expr) { return LISTOBJ(CDR(GETLIST(expr))); }
Obj makeFunc(Obj params, Obj body, Obj env) { List* list = makeList(env, makeList(params, makeList(body, NULL))); return LISTOBJ(list); }