Making a list of patterns of arbitrary length

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
10
down vote

favorite
1












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.







share|improve this question


























    up vote
    10
    down vote

    favorite
    1












    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.







    share|improve this question
























      up vote
      10
      down vote

      favorite
      1









      up vote
      10
      down vote

      favorite
      1






      1





      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.







      share|improve this question














      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.









      share|improve this question













      share|improve this question




      share|improve this question








      edited Aug 28 at 2:18









      m_goldberg

      81.7k869187




      81.7k869187










      asked Aug 28 at 0:45









      Winkelried

      1634




      1634




















          4 Answers
          4






          active

          oldest

          votes

















          up vote
          8
          down vote



          accepted










          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_







          share|improve this answer


















          • 1




            The middle one will fail if x1=1.
            – Kuba♦
            Aug 28 at 7:37











          • @Kuba, good point.
            – kglr
            Aug 28 at 8:09

















          up vote
          8
          down vote













          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[
          "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_







          share|improve this answer
















          • 2




            It won't work if x1 = 1.
            – Kuba♦
            Aug 28 at 7:36










          • Function[sym,Pattern[sym,Blank],HoldFirst] instead of Pattern[#,Blank]& as usual.
            – Anton.Sakovich
            Aug 28 at 7:44










          • @Kuba what exactly do you mean by x1 = 1 ?
            – Winkelried
            Aug 28 at 8:57










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

















          up vote
          4
          down vote













          Nothing new but shorter:



          StringTemplate["x``_"] /@ Range[10] // ToExpression



          x1_, x2_, x3_, x4_, x5_, x6_, x7_, x8_, x9_, x10_






          share|improve this answer



























            up vote
            3
            down vote













            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




            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.



            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.






            share|improve this answer






















            • It won't work if x1 = 1
              – Kuba♦
              Aug 28 at 7:36










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










            Your Answer




            StackExchange.ifUsing("editor", function ()
            return StackExchange.using("mathjaxEditing", function ()
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
            );
            );
            , "mathjax-editing");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "387"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: false,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













             

            draft saved


            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f180763%2fmaking-a-list-of-patterns-of-arbitrary-length%23new-answer', 'question_page');

            );

            Post as a guest






























            4 Answers
            4






            active

            oldest

            votes








            4 Answers
            4






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            8
            down vote



            accepted










            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_







            share|improve this answer


















            • 1




              The middle one will fail if x1=1.
              – Kuba♦
              Aug 28 at 7:37











            • @Kuba, good point.
              – kglr
              Aug 28 at 8:09














            up vote
            8
            down vote



            accepted










            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_







            share|improve this answer


















            • 1




              The middle one will fail if x1=1.
              – Kuba♦
              Aug 28 at 7:37











            • @Kuba, good point.
              – kglr
              Aug 28 at 8:09












            up vote
            8
            down vote



            accepted







            up vote
            8
            down vote



            accepted






            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_







            share|improve this answer














            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_








            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Aug 28 at 4:10

























            answered Aug 28 at 1:54









            kglr

            158k8183382




            158k8183382







            • 1




              The middle one will fail if x1=1.
              – Kuba♦
              Aug 28 at 7:37











            • @Kuba, good point.
              – kglr
              Aug 28 at 8:09












            • 1




              The middle one will fail if x1=1.
              – Kuba♦
              Aug 28 at 7:37











            • @Kuba, good point.
              – kglr
              Aug 28 at 8:09







            1




            1




            The middle one will fail if x1=1.
            – Kuba♦
            Aug 28 at 7:37





            The middle one will fail if x1=1.
            – Kuba♦
            Aug 28 at 7:37













            @Kuba, good point.
            – kglr
            Aug 28 at 8:09




            @Kuba, good point.
            – kglr
            Aug 28 at 8:09










            up vote
            8
            down vote













            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[
            "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_







            share|improve this answer
















            • 2




              It won't work if x1 = 1.
              – Kuba♦
              Aug 28 at 7:36










            • Function[sym,Pattern[sym,Blank],HoldFirst] instead of Pattern[#,Blank]& as usual.
              – Anton.Sakovich
              Aug 28 at 7:44










            • @Kuba what exactly do you mean by x1 = 1 ?
              – Winkelried
              Aug 28 at 8:57










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














            up vote
            8
            down vote













            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[
            "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_







            share|improve this answer
















            • 2




              It won't work if x1 = 1.
              – Kuba♦
              Aug 28 at 7:36










            • Function[sym,Pattern[sym,Blank],HoldFirst] instead of Pattern[#,Blank]& as usual.
              – Anton.Sakovich
              Aug 28 at 7:44










            • @Kuba what exactly do you mean by x1 = 1 ?
              – Winkelried
              Aug 28 at 8:57










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












            up vote
            8
            down vote










            up vote
            8
            down vote









            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[
            "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_







            share|improve this answer












            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[
            "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_








            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Aug 28 at 1:31









            Carl Woll

            56k272146




            56k272146







            • 2




              It won't work if x1 = 1.
              – Kuba♦
              Aug 28 at 7:36










            • Function[sym,Pattern[sym,Blank],HoldFirst] instead of Pattern[#,Blank]& as usual.
              – Anton.Sakovich
              Aug 28 at 7:44










            • @Kuba what exactly do you mean by x1 = 1 ?
              – Winkelried
              Aug 28 at 8:57










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












            • 2




              It won't work if x1 = 1.
              – Kuba♦
              Aug 28 at 7:36










            • Function[sym,Pattern[sym,Blank],HoldFirst] instead of Pattern[#,Blank]& as usual.
              – Anton.Sakovich
              Aug 28 at 7:44










            • @Kuba what exactly do you mean by x1 = 1 ?
              – Winkelried
              Aug 28 at 8:57










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







            2




            2




            It won't work if x1 = 1.
            – Kuba♦
            Aug 28 at 7:36




            It won't work if x1 = 1.
            – Kuba♦
            Aug 28 at 7:36












            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] instead of Pattern[#,Blank]& as usual.
            – Anton.Sakovich
            Aug 28 at 7:44












            @Kuba what exactly do you mean by x1 = 1 ?
            – Winkelried
            Aug 28 at 8:57




            @Kuba what exactly do you mean by x1 = 1 ?
            – Winkelried
            Aug 28 at 8:57












            @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




            @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










            up vote
            4
            down vote













            Nothing new but shorter:



            StringTemplate["x``_"] /@ Range[10] // ToExpression



            x1_, x2_, x3_, x4_, x5_, x6_, x7_, x8_, x9_, x10_






            share|improve this answer
























              up vote
              4
              down vote













              Nothing new but shorter:



              StringTemplate["x``_"] /@ Range[10] // ToExpression



              x1_, x2_, x3_, x4_, x5_, x6_, x7_, x8_, x9_, x10_






              share|improve this answer






















                up vote
                4
                down vote










                up vote
                4
                down vote









                Nothing new but shorter:



                StringTemplate["x``_"] /@ Range[10] // ToExpression



                x1_, x2_, x3_, x4_, x5_, x6_, x7_, x8_, x9_, x10_






                share|improve this answer












                Nothing new but shorter:



                StringTemplate["x``_"] /@ Range[10] // ToExpression



                x1_, x2_, x3_, x4_, x5_, x6_, x7_, x8_, x9_, x10_







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Aug 28 at 7:38









                Kuba♦

                99.3k11194491




                99.3k11194491




















                    up vote
                    3
                    down vote













                    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




                    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.



                    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.






                    share|improve this answer






















                    • It won't work if x1 = 1
                      – Kuba♦
                      Aug 28 at 7:36










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














                    up vote
                    3
                    down vote













                    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




                    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.



                    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.






                    share|improve this answer






















                    • It won't work if x1 = 1
                      – Kuba♦
                      Aug 28 at 7:36










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












                    up vote
                    3
                    down vote










                    up vote
                    3
                    down vote









                    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




                    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.



                    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.






                    share|improve this answer














                    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




                    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.



                    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.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Aug 28 at 9:49

























                    answered Aug 28 at 1:19









                    C. E.

                    47.6k390192




                    47.6k390192











                    • It won't work if x1 = 1
                      – Kuba♦
                      Aug 28 at 7:36










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
















                    • It won't work if x1 = 1
                      – Kuba♦
                      Aug 28 at 7:36










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















                    It won't work if x1 = 1
                    – Kuba♦
                    Aug 28 at 7:36




                    It won't work if x1 = 1
                    – Kuba♦
                    Aug 28 at 7:36












                    @Kuba You mean if the symbols have values?
                    – C. E.
                    Aug 28 at 9:48




                    @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




                    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




                    @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

















                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f180763%2fmaking-a-list-of-patterns-of-arbitrary-length%23new-answer', 'question_page');

                    );

                    Post as a guest













































































                    Comments

                    Popular posts from this blog

                    What does second last employer means? [closed]

                    List of Gilmore Girls characters

                    Confectionery