Re: Optional
- To: mathgroup at smc.vnet.net
- Subject: [mg33786] Re: [mg33689] Optional
- From: Ben Langton <ben at quickmath.com>
- Date: Tue, 16 Apr 2002 03:50:41 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Andrzej, Thanks for your reply. It does indeed look as if this is a bug - I've notified Wolfram support, and they are investigating it. Regards, Ben langton > From: Andrzej Kozlowski <andrzej at tuins.ac.jp> To: mathgroup at smc.vnet.net > Date: Mon, 8 Apr 2002 00:11:33 +0900 > To: Ben Langton <ben at quickmath.com> > Cc: mathgroup at smc.vnet.net > Subject: [mg33786] Re: [mg33689] Optional > > I took another look at your original posting and my reply and noticed I > had mis-typed your definition of f, which resulted in rather different > behaviour from the one you experienced. The crucial difference is the > position of the curly brackets {}. > > As you correctly pointed out the definition > > In[1]:= > f[Optional[index : {_Integer... }, {1}]] := index > > leads to > > In[2]:= > f[] > > Out[2]= > f[] > > Replacing ... with .. makes no difference here. We can see however that > besides the example that I mistook for yours the following one also > works fine: > > In[3]:= > f[Optional[index : _Integer .., 1]] := index > > In[4]:= > f[] > > Out[4]= > 1 > > So it appears that in general the following construction will not work: > > f[Optional[index : F[p..], F[q]]] := something > > even when q matches p (eg. q is p) except when F=Identity. > > > This indeed seems odd and although there are rather obvious ways to get > round this I would now tend to think that it may be a bug, particularly > if it indeed used to work in version 3. > > > > > On Saturday, April 6, 2002, at 11:05 PM, Andrzej Kozlowski wrote: > >> I haven't got Mathematica 3.0 installed anymore but if what you say is >> true the behaviour of 4.1 seems more reasonable to me. Observe that: >> >> In[1]:= >> Clear[f] >> >> In[2]:= >> f[Optional[index : {_Integer }.., {1}]] := index >> >> In[3]:= >> f[] >> >> Out[3]= >> {1} >> >> On the other hand >> >> In[4]:= >> Clear[f] >> >> In[5]:= >> f[Optional[index : {_Integer }..., {1}]] := index >> >> In[6]:= >> f[] >> >> Out[6]= >> Sequence[] >> >> >> This seems perfectly logical to me. In the first case we use .. which >> means one repetition or more. Since the empty collection of arguments >> does not match this the default is used. On the other hand, in the >> second case we use ..., which means zero repetitions or more. No >> arguments matches zero repetitions so you get Sequence[] as the output. >> >> >> Andrzej Kozlowski > Toyama International University > JAPAN > http://platon.c.u-tokyo.ac.jp/andrzej/ >> >> >> On Saturday, April 6, 2002, at 02:49 PM, Ben Langton wrote: >> >>> Hi all, >>> >>> I am having a problem with the Optional function which I have reduced >>> to the >>> following snippet of code : >>> >>> f // Clear; >>> f[Optional[index : {_Integer ...}, {1}]] := index; >>> f[] >>> >>> My understanding of the Optional command is that the function f should >>> accept a list of zero or more integers as its argument or, if that is >>> missing, use the default value of {1}. >>> >>> Under version 3, f[] (f with no arguments) returns {1}, as I would >>> expect, >>> yet under version 4.1 it returns the function evaluated. >>> >>> Can anyone shed any light on why this code acts differently under the >>> two >>> different versions? What can I do to make it work as expected under >>> version >>> 4.1? >>> >>> Many thanks, >>> >>> Ben Langton >>> >>> >>> >> >