[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