On 2021-09-08 11:35, Andre Garzia via use-livecode wrote:
I just don't understand this one, so no comment.

As I understand, this is LC version of the “spread operator”.  It
allows you to spread the elements of an array as the arguments to a
handler.

The code:

  put “an...@example.com <mailto:an...@example.com>” into tDataA[1]
  put “Andre Garzia” into tDataA[2]

  sendEmail …tDataA

Is syntactically equivalent to:


  put “an...@example.com <mailto:an...@example.com>” into tDataA[1]
  put “Andre Garzia” into tDataA[2]

  sendEmail tDataA[1], tDataA[2]

Which means that you can code the “sendEmail” command to have two
string arguments instead of an array, as shown below:

  command sendEmail pEmail, pFullName
    // send your email
  end sendEmail

The spread operator will pass every array element as an argument to
the handler.

Yes - that is precisely what it is :)

It would be beneficial if this feature would also come paired a “rest
operator” that collected extra arguments in an array, so that we could
declare the “sendEmail” handler as

  command sendEmail pEmail, pFullName, …pMoreArgumentsA
    // stuff
  end sendEmail

This way, if the call uses an array that contains more than two
elements, the remaining parameters are collected in the final
“pMoreArgumentsA” array. That if what I would like to have, LC didn’t
say anything about this but it is very common in other languages to
implement both operators at the same time.

Indeed.

The key thing here is that doing that adds to the handler signature syntax which I'd prefer to do as part of a more substantial improvement to the expressibility of that aspect of the language.

Therefore...

In the case of LiveCode there is an alternative though. We can use
“paramCount” and “param()” to grab the extra parameters, but that
requires us coding it while something like a “rest operator” do that
for us automatically.

The feature I omitted from the list and which does pair with the spread (or tail) operator is a tweak to the params function... Namely:

   params(N) => returns a sequence or params starting from the Nth

So in the above:

   command sendEmail pEmail, pFullName
     local tMoreArgumentsA
     put params(3) into tMoreArgumentsA
     ...
   end sendEmail

This is a direct evolution / useful addition to the current way existing handlers manipulate arguments - and, more importantly, saves a blob of code I've seen 100's of times in code which needs to forward arguments:

   command foo
     local tParams
     repeat with i = 1 to the paramCount
        put param(i) into tParams[i]
     end repeat
     ...
   end foo

Also this feature is largely orthogonal to any tweak to handler signature (i.e. the merge operator, Andre suggests above) as it just manipulates the parameters as defined by the signature. For example, in the imagined case of a 'merge' clause:

   command merged pFoo, pRestA...
       put the paramCount into tCount -- gives 2
       put param(1) into tFoo -- would give pFoo
       put param(2) into tRestA - would give pRestA
   end merged

Here there are two parameters - pFoo, and an (array) pRestA which contains the rest of the parameters passed.

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

Reply via email to