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

Reply via email to