Making a list of patterns of arbitrary length
Making a list of patterns of arbitrary length
I would like to create a list of arbitrary length:
x1_, x2_, ...
Where each of the elements of the list has the full form:
Pattern[xi, Blank]
This answer shows how to create a list of symbols:
x1, x2, ...
but I don't know how to adapt that to obtain the above.
I intend to use this list in the definition of a function as in here.
4 Answers
4
Array[ToExpression["x" <> ToString @ # <> "_"] &, 5]
x1_, x2_, x3_, x4_, x5_
FullForm @ %
List[Pattern[x1,Blank], Pattern[x2, Blank], Pattern[x3, Blank], Pattern[x4, Blank], Pattern[x5, Blank]]
Also
Thread[Pattern[Evaluate@Array[Symbol["x" <> ToString@#] &, 5], Blank]]
x1_, x2_, x3_, x4_, x5_
and
ToExpression[Table["x" <> i <> "_", i, ToString /@ Range[5]]]
x1_, x2_, x3_, x4_, x5_
x1=1
@Kuba, good point.
– kglr
Aug 28 at 8:09
If you construct a list of strings instead, you can take advantage of the fact that ToExpression
is listable, and supports a 3rd argument that post-processes the output. For example:
ToExpression
ToExpression[
"x1", "x2", "x3",
StandardForm,
Pattern[#,Blank]&
]
x1_, x2_, x3_
Or, creating the list and converting:
ToExpression[
Table["x" <> ToString@i, i, 5],
StandardForm,
Pattern[#, Blank]&
]
x1_, x2_, x3_, x4_, x5_
It won't work if
x1 = 1
.– Kuba♦
Aug 28 at 7:36
x1 = 1
Function[sym,Pattern[sym,Blank],HoldFirst]
instead of Pattern[#,Blank]&
as usual.– Anton.Sakovich
Aug 28 at 7:44
Function[sym,Pattern[sym,Blank],HoldFirst]
Pattern[#,Blank]&
@Kuba what exactly do you mean by
x1 = 1
?– Winkelried
Aug 28 at 8:57
x1 = 1
@Winkelried if any of
xi
have values prior to that evaluation then you will get e.g. Pattern[1, Blank]
– Kuba♦
Aug 28 at 8:58
xi
Pattern[1, Blank]
Nothing new but shorter:
StringTemplate["x``_"] /@ Range[10] // ToExpression
x1_, x2_, x3_, x4_, x5_, x6_, x7_, x8_, x9_, x10_
Here is an example of how to make the solution in the link work for this case:
patt = Table[
With[
s = Symbol["x" <> ToString[i]],
Pattern[s, Blank]
], i, 10];
Range[10] /. patt :> x5, x8
5, 8
5, 8
Using With
here is a trick to insert the symbol into Pattern
. Since Pattern
has the attribute HoldFirst
, it would not work to write e.g.
With
Pattern
Pattern
HoldFirst
Pattern[Symbol["x" <> ToString[i]], Blank]
because Symbol["x" <> ToString[i]]
would not be evaluated before it was passed to Pattern
, i.e. Pattern
would not receive a string as is required.
Symbol["x" <> ToString[i]]
Pattern
Pattern
It won't work if
x1 = 1
– Kuba♦
Aug 28 at 7:36
x1 = 1
@Kuba You mean if the symbols have values?
– C. E.
Aug 28 at 9:48
Yes, sorry for not being clear.
– Kuba♦
Aug 28 at 9:54
@Kuba Well, you are right. I wanted to show how to adapt the answer OP linked to, but it has this flaw.
– C. E.
Aug 28 at 10:40
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
The middle one will fail if
x1=1
.– Kuba♦
Aug 28 at 7:37