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