Re: Re: pattern matching quirks
- To: mathgroup at smc.vnet.net
- Subject: [mg29378] Re: [mg29362] Re: pattern matching quirks
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Sat, 16 Jun 2001 02:47:50 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
You certainly can can. This is even documented: The form s_:v is equivalent to Optional[s_, v].This form is also equivalent to s:_: v.There is no syntactic ambiguity since s must be a symbol in this case. You can also test it yourself: In[12]:= f[1,a:Sin[x_]:Sin[2]]:=x In[13]:= f[1] Out[13]= 2 -- Andrzej Kozlowski Toyama International University JAPAN http://platon.c.u-tokyo.ac.jp/andrzej/ http://sigma.tuins.ac.jp/~andrzej/ on 01.6.15 3:23 PM, Jens-Peer Kuska at kuska at informatik.uni-leipzig.de wrote: > Hi, > > you can't give optional arguments *and* general pattern with : > > But the definition > > > test[1, X["4"]] := X["4"] > test[1, inputs : X[X[_Integer]] ...] := inputs > test[1] := test[1, X["4"]] > > > should produce what you want. > > Regards > Jens > > Michael wrote: >> >> I am trying to write a function which matches only on a specific pattern of >> arguments, some of which can be optional. The problem I am having is that >> certain complex patterns aren't being matched under conditions which should >> match. >> >> For example: >> >> In[1] := test[1, inputs : (X["4"] | X[X[_Integer]] ...) : X["4"]] := inputs >> >> In[2] := test[1] >> Out[2] := X[4] >> >> This is the expected behavior. However if I redefine the function so that >> the alternatives are collected within a single head, it doesn't work: >> >> In[3] := Clear[test]; >> test[1, inputs : (X["4" | X[_Integer] ...]) : X["4"]] := inputs >> >> In[4] := test[1] >> Out[4] := test[1] >> >> In[5] := MatchQ[X["4"], (X["4" | X[_Integer] ...])] >> Out[5] := True >> >> MatchQ says that my default values matches the given pattern. Through some >> experimentation I had discovered that the function will NOT be called if the >> default value does not match the pattern for the optional argument. This is >> annoying (and undocumented I think) because I would like to insert a >> function call to generate the default value. This does not work right >> either because the default value appears to be evaluated when the function >> is defined, and wrapping it with Hold causes it to fail the above pattern >> match. So instead I have to assign it to some inane value (hence the >> alternatives) and then do a rule transformation in the function itself (not >> shown above). >> >> So here are my questions: >> 1. Why does the default value for a pattern have to match that pattern? >> 2. Why is the default value seeming to be evaluated when the function is >> defined? >> 3. Why do some patterns pass MatchQ but not result in a function call? >> Notably, X[a|b] versus X[a]|X[b]? >> 4. What other quirks should I be aware of that I haven't run into yet? :-) >> >> Regards, >> >> Michael Schmidt >> michael at science.edu > >