Path: utzoo!attcan!uunet!zephyr.ens.tek.com!tekchips!tekgvs!toma From: toma@tekgvs.LABS.TEK.COM (Tom Almy) Newsgroups: comp.lang.lisp.x Subject: Implementation of NREVERSE Message-ID: <8276@tekgvs.LABS.TEK.COM> Date: 16 Oct 90 17:25:05 GMT Reply-To: toma@tekgvs.LABS.TEK.COM (Tom Almy) Organization: Tektronix, Inc., Beaverton, OR. Lines: 55 Here is a definition of NREVERSE I added recently. It follows the Common LISP convention of working on any sequence (list, array, string). Tom Almy toma@tekgvs.labs.tek.com Standard Disclaimers Apply /* xnreverse -- built-in function nreverse (destructive reverse) */ LVAL xnreverse() { LVAL seq,val,next; unsigned int i,j; int ival; /* get the sequence to reverse */ seq = xlgetarg(); xllastarg(); if (seq == NIL) return (NIL); /* empty argument */ switch (ntype(seq)) { case CONS: val = NIL; while (consp(seq)) { next = cdr(seq); rplacd(seq,val); val = seq; seq = next; } break; case VECTOR: for (i = 0, j = getlength(seq)-1; i < j; i++, j--) { val = getelement(seq,i); setelement(seq,i,getelement(seq,j)); setelement(seq,j,val); } return seq; break; case STRING: for (i = 0, j=getslength(seq)-2 ; i < j; i++, j--) { ival = seq->n_string[i]; seq->n_string[i] = seq->n_string[j]; seq->n_string[j] = ival; } return seq; break; default: xlbadtype(seq); break; } /* return the sequence */ return (val); }