[Scilab-users] Anonymous functions

Stefan Du Rietz sdr at durietz.se
Fri Jan 20 11:05:23 CET 2017


Sorry, I left out a line below (a = 2;)

Hello Pierre,
is this too simple?

function outer()
   a = 1
   function inner()
     mprintf("a = %i (inner: a has the value of the outer function)\n",a)
     a = 2;
     a = resume(a);
   endfunction
   inner()
   mprintf("a = %i (outer: a has got its new inner value of 2\n", a)
endfunction

/Stefan


On 2017-01-20 09:00, Pierre Vuillemin wrote:
> Hi Samuel,
>
> Indeed, the behaviour I seek to reproduce is similar to what could be
> done with a global variable. Yet I would avoid to resort to global
> variables.
>
> From what I've understand about variables scoping in Scilab
> (https://wiki.scilab.org/howto/global%20and%20local%20variables),
> variables from the above level are only replaced/copied locally when
> needed, e.g.
>
> function outer()
>   a = 1
>     function inner()
>       disp(a) // a has the value of the outer function
>       a = 2   // now a copy is made and a is locally equal to 2
>     endfunction
>   inner()
>   disp(a) // a has kept its initial value of 1
> endfunction
>
>
> Hence I guess that the fact that a = 1 in the scope of the outer
> function is stored somewhere so that Scilab can retrieve that
> information when needed. I'm wondering how it works internally and
> whether I could use this to create generic lambda function?
>
> I'm aware that this cannot be done solely in Scilab but requires to
> fiddle with the C interface, but I'm curious to experiment.
>
>
> Regards,
>
> Pierre
>
>
> Le 17.01.2017 14:21, Samuel Gougeon a écrit :
>> Le 17/01/2017 11:46, Pierre Vuillemin a écrit :
>>> I have actually implemented a similar solution (in the previous
>>> link) except that the data are stored in some list. This leads to
>>> anonymous functions that behaves as in Matlab, i.e. the data of the
>>> function is instantiated when the function is created.
>>>
>>> In python, the value of the data 'a' is instantiated when the
>>> function is evaluated. Therefore, if the data 'a' changes, the
>>> function changes.
>>>
>>> Here I could make something like
>>>
>>> deff('y=f(x)','y = a*x')
>>>
>>> but then the function will get the value of the variable 'a' of the
>>> current namespace, e.g.
>>>
>>> a = 1
>>> function outer(x)
>>>  a = 2
>>>  disp(f(1))
>>> endfunction
>>>
>>> f(1)     // will give 1
>>> outer(1) // will give 2
>>> a = 3
>>> f(1)     // will give 3
>>> outer(1) // will give 2
>>>
>>> In this example, I would like f(1) to behave identically
>>> independently of its position.
>>
>> If i understand correctly your query, the global space is unique and
>> aims to allow that:
>> deff('y=f(x)','global a; y = a*x')
>>
>> This requires the only variable "a" you want to consider been declared
>> "global a" before some calling point. Actually, i don't see how to
>> refer to a unique "a" without telling to Scilab which one it must be.
>>
>> Samuel
>>
>>
>>
>> _______________________________________________
>> users mailing list
>> users at lists.scilab.org
>> http://lists.scilab.org/mailman/listinfo/users
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users





More information about the users mailing list