valueDiff for arrays?
Brian Milby
brian at milby7.com
Sat Aug 4 21:23:19 EDT 2018
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 at 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 ~ mark at livecode.com ~ http://www.livecode.com/
> LiveCode: Everyone can create apps
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
More information about the use-livecode
mailing list