NODE* remdup(NODE *seq) { NODE* okay; if (seq == NIL) return seq; /* finds the first element of new seq list */ while (memq(car(seq), cdr(seq))) { seq = cdr(seq); } for (okay = seq; cdr(okay) != NIL; okay = cdr(okay)) { while (memq(cadr(okay), cddr(okay))) { setcdr(okay, cddr(okay)); } } return seq; }
int assemble_options(LISP l, ...) {int result = 0,val,noptions,nmask = 0; LISP lsym,lp = NIL; char *sym; va_list syms; if NULLP(l) return(0); noptions = CONSP(l) ? get_c_long(llength(l)) : -1; va_start(syms,l); while((sym = va_arg(syms,char *))) {val = va_arg(syms,int); lsym = cintern(sym); if (EQ(l,lsym) || (CONSP(l) && NNULLP(lp = memq(lsym,l)))) {result |= val; if (noptions > 0) nmask = nmask | (1 << (noptions - get_c_long(llength(lp)))); else noptions = -2;}} va_end(syms); if ((noptions == -1) || ((noptions > 0) && (nmask != ((1 << noptions) - 1)))) err("contains undefined options",l); return(result);}
// (state 'var (sym|lst exe [. prg]) ..) -> any any doState(any ex) { any x, y, a; cell c1; x = cdr(ex); Push(c1, EVAL(car(x))); NeedVar(ex,data(c1)); CheckVar(ex,data(c1)); while (isCell(x = cdr(x))) { y = car(x); if (car(y) == T || memq(val(data(c1)), car(y))) { y = cdr(y); if (!isNil(a = EVAL(car(y)))) { val(At) = val(data(c1)) = a; drop(c1); return prog(cdr(y)); } } } drop(c1); return Nil; }