[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Uniqueness of &rest arguments

    Date: Mon, 28 Oct 85 16:09 EST
    From: Guy Steele <gls@THINK-AQUINAS.ARPA>

	Date: 28 Oct 1985 15:32-EST

	Are &rest arguments guaranteed to be copied?  Consider the following:

	    (defmacro m (&rest args)
		 `',(nreverse args)        ; Destructive reverse
	    (setq x '(m a b c d))
	    (eval x)

	What is the final value of x?   I think that I would argue that
	it is undefined since args may or may not be a copy of the original
	form.   Is there anything in Cttl that clarifies this?

    I cannot find any place in the manual that addresses this point.  The
    text describing APPLY alludes to appending the last argument to APPLY to
    a list of all other arguments (except the function, of course), and so
    one might think, referring to the definition of APPEND, that the
    resulting list of arguments might contain actual cons cells from the
    list that is the last argument to APPLY.  However, nothing addresses
    whether a &REST argument might share with this list.

None of this applies to macros anyway, since they aren't invoked with APPLY.

    My own opinion is that indeed the args might not be a copy of the
    original form, but I regard this as a non-trivial clarification worthy
    of discussion.

I hope it doesn't take a whole lot of discussion.  It's pretty clear to me
that if the manual doesn't guarantee explicitly that the user can freely
bash the &rest argument, then the user can only sensibly assume that it is
not safe to bash it.  I also can't see any significant advantage to the user
to be gained requiring implementations to make copies of &rest arguments.
Note that if there are implementations that can't avoid making a copy (but
not for macros!), they can easily have a compiler optimizer to remove
calls to copy-list, so there can be no argument from efficiency.