Hi Alex,

Thanks for addressing my comments. I have a few follow up comments:

> On Sep 3, 2025, at 10:16, Alexandra Wang <[email protected]> wrote:
> 
> 
> 
> I don't like the idea of removing the "bool isSlice" argument from the
> *SubscriptTransform() function pointer. This patch series should make
> only minimal changes to the subscripting API. While it's true that
> each implementation can easily determine the boolean value of isSlice
> itself, I don't see a clear benefit to changing the interface. As you
> noted, arrsubs cares about isSlice; and users can also define custom
> data types that support subscripting, so the interface is not limited
> to built-in types.
> 
> As the comment for *SubscriptTransform() explains:
>> (Of course, if the transform method
>> * does not care to support slicing, it can just throw an error if isSlice.)
> 
> It's possible that in the end the "isSlice" argument isn't needed at
> all, but I don’t think this patch set is the right place for that
> refactor.
> 

I agree we should keep the change minimum and tightly related to the core 
feature.

My original suggestion was to move

    /*
     * Detect whether any of the indirection items are slice specifiers.
     *
     * A list containing only simple subscripts refers to a single container
     * element.  If any of the items are slice specifiers (lower:upper), then
     * the subscript expression means a container slice operation.
     */
    foreach(idx, *indirection)
    {
        Node       *ai = lfirst(idx);

        if (IsA(ai, A_Indices) && castNode(A_Indices, ai)->is_slice)
        {
            isSlice = true;
            break;
        }
    }

To out of transformContainerSubscripts(). Because the function was called only 
once under “if”, now this patch change it to be called under “while”, which 
brings two issues:

 * Original it was O(n) as it was under “if”, now it is O(n2) as it is under 
“while”.
* Logically it feels wrong now. Because this loops over the entire indirection 
list to check is_slice, while the subsequent sbsroutines->transform() may only 
process a portion (prefix) of indirection list. Say, the 5th element is slice, 
but the first sbsroutines-transform() call will only process the first 3 
elements of indirection list, then pass true to the first transform() call 
sounds wrong.

if we pull the loop out of transformContainerSubscripts(), then we have to add 
a new parameter “bool is_slice” to it. But after some researching, I found that 
making that change is more complicated than removing “is_slice” parameter from 
SubscriptTransform(). That’s why I ended up suggesting removing “is_slice” from 
SubscriptTransform().

Does that sound reasonable?

--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/




Reply via email to