[Scilab-users] How to replicate what "load" does (aka creating variable in the current workspace from inside a function)?

Serge Steer Serge.Steer at inria.fr
Mon Feb 22 11:51:46 CET 2016


The following function does the job:

function myload()
   txt=["a=1";"b=2"];
   ncur= size(who("local"),"*")
   execstr(txt);
   vars=who("local");
   vars=vars(1:size(vars,'*')-ncur-1)
   args=strcat(vars,",")
   execstr("["+args+"]=resume("+args+")")
endfunction

Serge
Le 22/02/2016 11:21, Antoine Monmayrant a écrit :
> Hi all,
>
> I need to create variables dynamically depending on what I parse from a text file.
> For testing, I just made a simple script that parses the file and generates a string array that defines some variables:
>      txt=["a=1";"b=2"];
> I then
>      execstr(txt);;
> to create the variables needed (here "a" and "b").
> So far, so good.
> Now, I need to refactor my code to turn my messy script into a proper set of functions (see example code below).
> The issue now is that I can't figure out how to define "a" and "b" from within the function.
> I tried to declare them as "global" inside the function, but it does not work: as I haven't  declared them global at the top level before calling my function, it cannot work.
> Sadly, as I don't know in advance the variables I'll find when I parse the file, I cannot declare the variables global at the top level.
>
> Any solution or workaround?
>
> Cheers,
>
> Antoine
>
> /////example code
>
> //script version:
>
> clear a b;
> exists("a")// nope
> exists("b")// nope
> txt=["a=1";"b=2"];//typical result from parsing my txt file
> execstr(txt);
> exists("a")// yes
> exists("b")// yes
>
> //now with a function
>
> //broken & useless
> function myload()
>      txt=["a=1";"b=2"];
>      //string to declare a and b global
>      globaltxt="global "+strsubst(txt, '/=.*/', ';','r');
>      //does not work
>      execstr(globaltxt);
>      execstr(txt);
> endfunction
>
>
> //does not work
> clear a b;
> exists("a")// nope
> exists("b")// nope
> myload()//
> exists("a")// nope
> exists("b")// nope
>
>
> //this will work
> clear a b
> exists("a")// nope
> exists("b")// nope
> global a b // well I can't do that in practice, I don't know a and b in advance
> myload()//
> exists("a")// nope
> exists("b")// nope
>
>
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users
>




More information about the users mailing list