NODE *loneof(NODE *args) { NODE *val = UNBOUND, *argcopy; if (!is_list(car(args))) { setcar(args, cons(car(args), NIL)); } /* now the first arg is always a list of objects */ /* make sure they're really objects */ argcopy = car(args); while (argcopy != NIL && NOT_THROWING) { while (!is_object(car(argcopy)) && NOT_THROWING) { setcar(argcopy, err_logo(BAD_DATA, car(argcopy))); } argcopy = cdr(argcopy); } if (NOT_THROWING) { val = newobj(); setparents(val, car(args)); /* apply [[InitList] [Exist Output Self]] cdr(args) */ return make_cont(withobject_continuation, cons(val, make_cont(begin_apply, cons(askexist, cons(cons(cdr(args), NIL), NIL))))); } return val; }
/* Runs RunList, with Object as the current object for the duration of the * Ask. After RunList finishes, the current object reverts to what it was * before the Ask. * @params - Object RunList */ NODE *lask(NODE *args) { while (!is_object(car(args)) && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); if (NOT_THROWING) { return make_cont(withobject_continuation, cons(car(args), make_cont(begin_seq, cadr(args)))); } return UNBOUND; }
/* The logo word APPLY. */ NODE *lapply(NODE *args) { return make_cont(begin_apply, args); }