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
>>>
>>>
>>>
>>
>