Re: Taking either a sequence or a list
- To: mathgroup at smc.vnet.net
- Subject: [mg63135] Re: Taking either a sequence or a list
- From: Maxim <m.r at inbox.ru>
- Date: Thu, 15 Dec 2005 03:06:44 -0500 (EST)
- References: <dnm29m$89q$1@smc.vnet.net> <dnopf9$2gp$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On Wed, 14 Dec 2005 09:43:05 +0000 (UTC), dh <dh at metrohm.ch> wrote:
>
> I first tried the more obvious:
>
> f[ x : (__Integer | {__Integer})]
>
> but this doesn not work. It is not clear to my why not, but may be there
> is somebody who has an explanation.
>
This definitely looks like an inconsistency:
In[1]:= MatchQ[{a}, {__Integer | a}]
Out[1]= True
In[2]:= MatchQ[{a}, {x : __Integer | a}]
Out[2]= False
Just adding a pattern name shouldn't change the outcome. The problem is
that one alternative is a sequence and another is a single element. This
would work:
In[3]:= MatchQ[{a}, {x : __Integer | (a)..}]
Out[3]= True
It is also unclear exactly what value is assigned to x here:
In[4]:= tmp = {a} /. {x : __} -> x
Out[4]= a
In[5]:= tmp2 = {a} /. {x : __ | __} -> x
Out[5]= Sequence[a]
In[6]:= (HoldComplete[tmp] /. OwnValues[tmp]) ===
(HoldComplete[tmp2] /. OwnValues[tmp2])
Out[6]= False
So there might be some discrepancy if the results are later used as
arguments to functions with the attribute SequenceHold.
Maxim Rytin
m.r at inbox.ru