[comp.lang.lisp.x] Implementation of NREVERSE

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);
}