[Scilab-users] ?==?utf-8?q? How to replicate what "load" does (aka creating variable in the current workspace from inside a function)?
Antoine Monmayrant
amonmayr at laas.fr
Mon Feb 22 12:04:03 CET 2016
Le Lundi 22 Février 2016 11:51 CET, Serge Steer <Serge.Steer at inria.fr> a écrit:
> 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
Thank you Serge!
It does work on 5.5.0, but it does not work on 6.6.0-beta1.
It might be due to the way variables are ordered when calling "who".
Cheers,
Antoine
>
> 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
> >
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users
>
More information about the users
mailing list