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.