4

I am trying to rewrite patterns. For example, I'd like to rewrite the pattern

jFoo_Integer

which has FullForm

Pattern[jFoo,Blank[Integer]]

into just

Blank[Integer]

In other words, I want to strip out the names of patterns. I tried the following

jFoo_Integer /. {Pattern[nym_, Blank[typ_]] :> {nym, typ}}

which does not match or reduce and produces the (IMO bogus) error message

Pattern::patvar: First element in pattern Pattern[nym_,Blank[typ_]] is not a valid pattern name. >>

I also tried

    Pattern[jFoo,Blank[Integer]] /. {Pattern[nym_, Blank[typ_]] :> {nym, typ}}
    Pattern[jFoo,Blank[Integer]] /. {Verbatim[Pattern][nym_, Blank[typ_]] :> {nym, typ}}
    jFoo_Integer /. {Verbatim[Pattern][nym_, Blank[typ_]] :> {nym, typ}}
    jFoo_Integer /. {Verbatim[Pattern][nym_, Blank[typ_]] :> {nym, typ}}

all with exactly the same (failed) results.

Any hints, please & thanks?

Reb.Cabin
  • 8,661
  • 1
  • 34
  • 62

2 Answers2

7

What you want is probably

jFoo_Integer /. Verbatim[Pattern][nym_, Verbatim[Blank][typ_]] :> {nym, typ}
(* {jFoo, Integer} *)

The usage of Verbatim points it out

Verbatim[expr] represents expr in pattern matching, requiring that expr be matched exactly as it appears, with no substitutions for blanks or other transformations.

halirutan
  • 112,764
  • 7
  • 263
  • 474
3

I'm not sure how do you want to work with it, but those are ways to go:

List @@ (jFoo_Integer)
{jFoo, _Integer}
(jFoo_Integer) /. x_Pattern :> {x[[1]], x[[2]]}
{jFoo, _Integer}
(jFoo_Integer)[[2]]
_Integer
Kuba
  • 136,707
  • 13
  • 279
  • 740