[Scilab-users] On parameters passing by name in scilab functions

Samuel Gougeon sgougeon at free.fr
Mon Feb 27 19:36:19 CET 2017


Hello Adelson,

Le 27/02/2017 à 15:46, Adelson Oliveira a écrit :
> Hi,
>
> Let's take fft as an example.
>
> In scilab 5 one could call fft specifying parameters like dim and incr 
> by name,
>
> fft(A,-1,dim=100,incr=1)
Here names are simply ignored. There would be a true call by names if 
the order would not matter, while it does:
-->Fp2 = fft(A,-1,incr=1,dim=100);
                                !--error 999
fftw: Wrong values for input argument #3: Elements must be greater than 1.

I guess that this is because fft() is a built-in, not a "macro".
But even for functions written in Scilab language (aka macros), passing 
named parameters is strongly discouraged:

  * this sets a formal link between the calling level and the inner
    called one. Then, any change of the parameters names in the function
    definition breaks such calls.
  * the definition of most (say 99%) scilab functions test input
    parameters against their position rather than their name. It is not
    robust, but so it is. So (provided that fft() would be a macro) when
    calling fft(1,-1,incr=1), incr is detected at the third position
    while in the definition it is listed in the 4th one. Really
    efficient to get a mess ;)

    function  test(a, b)
         mprintf("RHS=%d, exists(a)=%d exists(b)=%d\n",  argn(2),  exists("a","l"),  exists("b","l"))
    endfunction

    -->test(b=1)RHS=1, exists(a)=0 exists(b)=1-->test(b=1,a=2)RHS=2,
    exists(a)=1 exists(b)=1

So, Tim is right. Calls with named parameters make the code fragile, or 
make somewhat harder to code the analysis of input arguments in a robust 
way. This coding way still increases functions overheads, that make them 
slower.

Samuel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20170227/3c080fc6/attachment.htm>


More information about the users mailing list