toma@tekgvs.LABS.TEK.COM (Tom Almy) (10/17/90)
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);
}