Hi Eliot. Yes, the recursive mode is default in BPatterns.
I wonder when we do not need it пн, 9 февр. 2026 г., 13:45 Eliot Miranda <[email protected]>: > > > On Feb 9, 2026, at 2:03 AM, Denis Kudriashov <[email protected]> wrote: > > > Hi Eliot. > > The recursive mode is per pattern variable. It can be done globally of > course in a way you suggested. But I do not see much value from this. > > Do you have an example where we don't want the non recursive search? > > > Yes. When I refactored the VM to make the object memory/garbage collector > an instance variable of the interpreter, rather than the superclass of the > interpreter, this major refactoring needed to be recursive. > > > ср, 4 февр. 2026 г., 01:16 Eliot Miranda <[email protected]>: > >> Hi Denis, >> >> could you support single & double ticks/non-recursive & recursive >> modes by providing eg shallowBpattern and bpattern? >> >> >> > P.S. > > Also why bpattern and not bPattern or rewritePattern? >> > > > _,,,^..^,,,_ (phone) >> >> On Feb 3, 2026, at 10:41 AM, Denis Kudriashov <[email protected]> >> wrote: >> >> >> Hi Richard. >> >> I checked the code and the double backticks are for the recursion mode. >> It forces the search to dive into the current matching node to find more >> cases inside it. >> For example: >> >> (instVar isNil ifTrue: [ 'inside recursion' ]) isNil ifTrue: [ 'outer >> node' ] >> >> The syntax with single backtick will not find the internal "instVar >> isNil" expression. >> >> In BPatterns the recursion mode is enabled by default for the pattern >> variables. So the default mode covers the maximum scope for a search. >> Currently you can't not disable the #recurseInto flag as there is not >> suitable accessor for this. But if it would be there the pattern would like: >> >> [ anyVar isNil ifTrue: anyBlock ] bpattern with: [ anyVar ] -> [:pattern >> | pattern recurseInto: false ] >> >> >> Anyway I adjusted my blog accordingly. Thanks for the attention. >> >> вт, 3 февр. 2026 г. в 10:47, Richard O'Keefe <[email protected]>: >> >>> Thank you. One of the reasons given for introducing BPatterns is a >>> subtle difference between >>> single backticks and double backticks, which is mentioned but not >>> explained in the BPatterns >>> blog entry. The help screen you directed me to does not explain that. >>> >>> Is there any documentation which is *complete* and *proofread*? >>> >>> On Tue, 3 Feb 2026 at 23:16, Denis Kudriashov <[email protected]> >>> wrote: >>> >>>> Yes. There is nice help presenter in the Pharo: >>>> >>>> StRewriterHelpBrowserPresenter new open >>>> >>>> >>>> <Screenshot 2026-02-03 at 10.15.45.png> >>>> >>>> >>>> >>>> вт, 3 февр. 2026 г. в 01:36, Richard O'Keefe <[email protected]>: >>>> >>>>> Is the "classic" rewriting syntax documented anywhere? >>>>> >>>>> On Mon, 2 Feb 2026 at 22:52, Denis Kudriashov via Pharo-users < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi all. >>>>>> >>>>>> This is the release of *BPatterns* project, one of my old ideas on >>>>>> how to make the rewrite engine usable for scripting. >>>>>> >>>>>> As a quick reminder, here is an example of the classic rewrite-engine >>>>>> matching syntax: >>>>>> >>>>>> *``@receiver isNil ifTrue: ``@nilBlock* >>>>>> >>>>>> >>>>>> In practice, patterns like this usually live inside string >>>>>> literals—hidden away in lint rules, deprecations, or refactorings. >>>>>> To use them for *manual* code search or rewriting, you typically >>>>>> need a dedicated tool. >>>>>> >>>>>> Now compare that with the same pattern expressed as a *BPattern*: >>>>>> >>>>>> *[ any isNil ifTrue: anyBlock ] bpattern* >>>>>> >>>>>> No special syntax. >>>>>> No magical tools. >>>>>> Just pure Smalltalk. >>>>>> >>>>>> You write a block. >>>>>> You send #bpattern. >>>>>> You’re done. >>>>>> >>>>>> Every editor understands it. >>>>>> Every tool respects it. >>>>>> >>>>>> Want to see where this pattern appears? >>>>>> >>>>>> * [ any isNil ifTrue: anyBlock ] bpattern browseUsers* >>>>>> >>>>>> >>>>>> <Screenshot 2026-01-31 at 12.16.19.png> >>>>>> >>>>>> >>>>>> Want to rewrite all of them? >>>>>> >>>>>> *[[ any isNil ifTrue: anyBlock ] -> [ any ifNil: anyBlock ]] brewrite >>>>>> preview* >>>>>> >>>>>> >>>>>> <Screenshot 2026-01-31 at 12.17.57.png> >>>>>> >>>>>> Because *BPatterns are real Smalltalk code*, all development tools >>>>>> work out of the box: >>>>>> syntax highlighting, completion, navigation, refactorings. >>>>>> >>>>>> This is the rewrite engine treated as a *first-class citizen*. >>>>>> >>>>>> Not strings. >>>>>> Not tooling sidecars. >>>>>> Not just for advanced users. >>>>>> >>>>>> *A rewrite engine you can actually use.* >>>>>> * A rewrite engine at your fingertips.* >>>>>> More details are in the blog post: >>>>>> >>>>>> - >>>>>> >>>>>> https://dionisiydk.blogspot.com/2026/02/bpatterns-rewrite-engine-with-smalltalk.html >>>>>> >>>>>> And follow the project on GitHub: >>>>>> >>>>>> - https://github.com/dionisiydk/BPatterns >>>>>> >>>>>> >>>>>> - >>>>>> >>>>>>
