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@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users
_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users


_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

Reply via email to