Re: execution model: Function vs. delayed execution
- To: mathgroup at smc.vnet.net
- Subject: [mg121341] Re: execution model: Function vs. delayed execution
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sun, 11 Sep 2011 07:29:49 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
On 9/10/11 at 7:30 AM, alan.isaac at gmail.com (Alan) wrote:
>I am used to a deferred execution model of function definition.
>Roughly, if I can write code that would be successfully executed
>outside a function definition, then I can make it a function body by
>appropriately "wrapping" it.
>In Mathematica, I can evaluate the following):
>x = {1,1,2}
>x=DeleteDuplicates[x]; x
>(Note: the redundancy is intentional.)
>Next, I attempt to "wrap" this as follows
>Clear[x]
>Function[x, (x=DeleteDuplicates[x];x)][{1,1,2}]
>This produces an error: Set::shape: "Lists {1,1,2} and {1,2} are not
>the same shape."
>Can you help me understand the execution model that leads to this?
The code
Function[x, (x=DeleteDuplicates[x];x)][{1,1,2}]
has x playing two roles, as a formal argument to the function
and to hold the result. Mathematica attempts to evaluate the
function body by replacing x with the {1,1,2} wherever x
appears. This results in attempting to evaluate
{1,1,2}=DeleteDuplicates[{1,1,2}]
which is what generates the error message. Adding a new variable
to the code, i.e.,
Function[x, (y=DeleteDuplicates[x];y)][{1,1,2}]
eliminates the problem and error message. Or more simply,
Function[x, DeleteDuplicates[x]][{1,1,2}]
Obviously, this last eliminates the redundancy which you state
was intentional.