Unexpected behaviour of HoldRest
- To: mathgroup at smc.vnet.net
- Subject: [mg45678] Unexpected behaviour of HoldRest
- From: John Tanner <john at janacek.demon.co.uk>
- Date: Mon, 19 Jan 2004 05:15:21 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Inspired by Carl Woll's OrderedUnion (for which many, many thanks!) I have found similar uses for Sequence[], such as using replacement rules: In[1]:= {{0,1,2,3,2},3,2} /. 2->Sequence[] Out[1]= {{0, 1, 3}, 3} But I recently found an "unexpected" result: In[1]:= If[1 == 1, Sequence[], 2] Out[1]= 2 Now when presented in this form it is "obvious", that Sequence[] is being "flattened out" of the arguments to If. The wanted behaviour of If in this case can be restored if SequenceHold is applied: In[3]:= Unprotect[If]; SetAttributes[If, SequenceHold]; Protect[If]; In[6]:= If[1 == 1, Sequence[], 2] Out[6]= Sequence[] But If has (I now find) the Attribute HoldRest, and Hold does not flatten out Sequence[] so I don't understand why that does not apply here also. In[7]:= xx[1+2,2+3,3+4] Out[7]= xx[3,5,7] In[8]:= SetAttributes[xx,HoldRest] In[9]:= xx[1+2,2+3,Sequence[],3+4] Out[9]= xx[3,2+3,3+4] Relatively few built-in functions have SequenceHold applied: {AbsoluteTiming, Rule, RuleDelayed, Set, SetDelayed, TagSet, TagSetDelayed, Timing, UpSet, UpSetDelayed} And also relatively few built-in functions have HoldRest applied: {Assuming, DumpSave, If, PatternTest, RuleDelayed, Save, Switch} I will therefore now be much more careful of the use of Sequence! At present I don't want to be more daring and apply these attributes wholesale without understanding why this is happening. There must be other cases where Sequence can have unexpected effects - I now understand some of the problems I had when trying to use [mg13201] to modify $Post - reallyBig needs to cope with Sequence[] and Sequence[__]. -- from- John Tanner email- john at janacek.demon.co.uk mantra- curse Microsoft, curse... web - http%##www.janacek.demon.co.uk/ I hate this 'orrible computer, I really ought to sell it: It never does what I want, but only what I tell it.