Very nice! A natural great extension[1] would be language aware grep/sed/awk: - return an enclosing parse construct after matching something - match on a construct with some pieces wildcarded - replace one structure with another (but based on the match)
Possible uses: - when you change an API of a package, fix up its users - rename variables - replace Go1 constructs with simpler/more efficient Go2 ones. - write generic code and replace with type specific code - program construction (ala Beta language's fragment system) - literate programming (tangle/weave) - optimize code - program analysis - structured diff/merge The tough part would be coming up with a simple but flexible structured regular expression language. [Initially I had thought this is what Rob was writing about in his "Structured Regular Expressions" paper! So the idea is very old.] [1] No good deed goes unpunished :-) > On Jul 4, 2019, at 9:10 AM, Michael Jones <michael.jo...@gmail.com> wrote: > > Recently I shared my Survey <https://github.com/MichaelTJones/survey> > program, saying that it was a sidestep from what I was working on but > interesting and hopefully useful to others. Here is the real thing, named gg, > that Survey was a test for. GG combines lexical analysis and Go-native > pattern matching to extend grep(1) for Go developers > > GG is smart; the search is restricted, seeking matches only in chosen token > classes. A search in number literals can match values in addition to > patterns: "v 255" matches the numeric value 255 in source code as > 0b1111_1111, 0377, 0o377, 255, 0xff, etc. Go's linear-time regular > expression engine is Unicode-aware and supports many extensions: numbers in > identifiers are found with "gg i [0-9]" or "gg i [\d]", find comments with > math symbols using "gg c \p{Sm}", and Greek in strings via "gg s \p{Greek}". > > GG is fast, uses all cores, understands filesystem hierarchies, archives, and > compression schemes, and is general like grep while focused in a new way: > find within package names, identifiers, types, strings, comments, and more. > > Source code: > https://github.com/MichaelTJones/gg <https://github.com/MichaelTJones/gg> > > Man page (all is explained here): > https://github.com/MichaelTJones/gg/blob/master/gg.pdf > <https://github.com/MichaelTJones/gg/blob/master/gg.pdf> > > Examples: > > Search the Go 1.13 source code for strings containing Megalosaurus, but not > comments: > > $ gg -r s Megalosaurus ~/go > /Users/mtj/go/src/cmd/link/link_test.go:`text:"London. Michaelmas term lately > over, and the Lord Chancellor sitting in Lincoln’s Inn Hall. Implacable > November weather. As much mud in the streets as if the waters had but newly > retired from the face of the earth, and it would not be wonderful to meet a > Megalosaurus, forty feet long or so, waddling like an elephantine lizard up > Holborn Hill. ... > > Search the Go 1.13 source code for identifiers with greek letters (but not > strings or comments): > > $ gg -r i '\p{Greek}' ~/go > /Users/mtj/go/src/encoding/json/encode_test.go: A0, À, Aβ int > /Users/mtj/go/src/math/cmplx/polar.go:func Polar(x complex128) (r, θ float64) > { > /Users/mtj/go/src/math/cmplx/rect.go:func Rect(r, θ float64) complex128 { > /Users/mtj/go/src/math/cmplx/rect.go: s, c := math.Sincos(θ) > /Users/mtj/go/src/math/rand/rand_test.go: var χ2 float64 > : > > Best to all, > Michael > > -- > Michael T. Jones > michael.jo...@gmail.com <mailto:michael.jo...@gmail.com> > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com > <mailto:golang-nuts+unsubscr...@googlegroups.com>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/CALoEmQz-KdFaWjS%2Bfyd-QQS4LEgYmnofiZNmugnoQ7sNaG0HEA%40mail.gmail.com > > <https://groups.google.com/d/msgid/golang-nuts/CALoEmQz-KdFaWjS%2Bfyd-QQS4LEgYmnofiZNmugnoQ7sNaG0HEA%40mail.gmail.com?utm_medium=email&utm_source=footer>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/18AEB87E-E8A1-40BB-A63C-1DA84A607AF7%40bitblocks.com. For more options, visit https://groups.google.com/d/optout.