Here is code that only uses LCS to accomplish the goal (only returning the keys where they exist in both arrays but the values are different). This is made to be similar to the way the existing functions work (with the option to mutate).
command valueDiff @pDestinationA, @pLeftA, pRightA local tMutate, tLeft, tRight, tNewRight if the paramCount is 3 then put false into tMutate put pLeftA into tLeft put pRightA into tRight else put true into tMutate put pDestinationA into tLeft put pLeftA into tRight end if repeat for each key tKey in tLeft if tKey is among the keys of tRight and \ tLeft[tKey] is not tRight[tKey] then put tRight[tKey] into tNewRight[tKey] next repeat end if delete variable tLeft[tKey] end repeat if tMutate then put tLeft into pDestinationA put tNewRight into pLeftA else put tLeft into pDestinationA["1"] put tNewRight into pDestinationA["2"] end if end valueDiff My question from an engine perspective is whether it would be faster to just generate both arrays instead of removing keys from tLeft. I decided to build the tNewRight to avoid iterating the keys of tRight. I'd be pretty confident that Mark's solution will be faster, even with 3 iterations over the keys. On Sat, Aug 4, 2018 at 6:52 PM, Mark Waddingham via use-livecode < use-livecode@lists.runrev.com> wrote: > On 2018-08-04 21:00, Richard Gaskin via use-livecode wrote: > >> Mark Waddingham wrote: >> >> Yes - so come up with LCS handlers which do that, share them, let's >>> work together to make them as efficient in LCS as possible and then >>> see what we can do in the engine to improve their performance (which >>> I'm guessing is as much the purpose for the proposition as the >>> syntax). >>> >> >> It is, primarily. The minor convenience is nice too, but you know how >> much I love to see performance enhancements in the engine. >> >> As for implementation, Mark Wieder's looks good: >> http://lists.runrev.com/pipermail/use-livecode/2018-August/248862.html >> > > One important point here (which I think is something which is often > overlooked in LC as it is just something we deal with implicitly case by > case)... > > In your use-case for 'valueDiff' - do you need to tell the difference > between a key value being the empty string and a key value not being > present at all? > > [ i.e. using an array key absence to emulate 'nothing': meaning you are > actually storing nothing or a value (even the empty string). ] > > It might seem like a minor detail, but does change the operation somewhat > (and potential implementations). > > Warmest Regards, > > Mark. > > -- > Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/ > LiveCode: Everyone can create apps > > _______________________________________________ > use-livecode mailing list > use-livecode@lists.runrev.com > Please visit this url to subscribe, unsubscribe and manage your > subscription preferences: > http://lists.runrev.com/mailman/listinfo/use-livecode > _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode