nm

11353 Reputation

20 Badges

13 years, 13 days

MaplePrimes Activity


These are questions asked by nm

Maple 2023.1 will not let me overload a method for an object when using _self.  Is there a way around this?

module person()
   option object;
   local the_name::string:="*",the_age;

   export set_info::static:= overload(
   [
      proc(_self,the_name::string,$) option overload;
          _self:-the_name:=the_name;
      end proc,

      proc(_self,the_name::string,the_age::integer, $) option overload;
          _self:-the_name:=the_name;
          _self:-the_age:=the_age;
      end proc
   ]);

   export get_name::static:=proc(_self,$)
      RETURN(_self:-the_name);
   end proc;
end module;

And now when I do 

o:=Object(person);
o:-set_info("me");
o:-set_info("me",20)

Error, (in person:-set_info) `me` does not evaluate to a module
Error, invalid input: no implementation of person:-set_info 
matches the arguments in call, 'person:-set_info("me",20)'

The problem goes away by removing `_self` as first argument in signature of the overloaded method. But then I will not be able to use _self any more inside the methods.

There is no problem overloading the method when using normal module, or one that does not use _self. For example this works

restart;

module person() 
   export set_info:= overload(
   [
      proc(the_name::string,$) option overload;
          print(the_name);
      end proc,

      proc(the_name::string,the_age::integer, $) option overload;
          print(the_name);
          print(the_age);
      end proc
   ]);
end module;

person:-set_info("me");
person:-set_info("me",20)

How to make the first example above work? I need to overload a method inside an module with option object that uses _self

update

I found a workaround. But it is not good, but for now. For the overloaded method, instead of using 
           o:-set_info("me");

This works instead

         set_info(o,"me");

So the following now works

o:=Object(person);

#o:-set_info("me");   #do not use with overloaded
#o:-set_info("me",20); #do not use with overloaded

set_info(o,"me");  #now works OK with no error
set_info(o,"me",20); #now works OK with no error

o:-get_name();  #OK since this method  is not overloaded
o:-get_age();  #OK since this method  is not overloaded

I do not understand why _self can't be used with overloaded methods and if this a bug or by design. 

Maple 2023.1 on windows 10

67588

interface(version);

`Standard Worksheet Interface, Maple 2023.1, Windows 10, July 7 2023 Build ID 1723669`

restart;

67588

module person()
   option object;
   local the_name::string:="*",the_age;

   export set_info::static:= overload(
   [
      proc(_self,the_name::string,$) option overload;
           #print("Inside first overloaded set_info");
          _self:-the_name:=the_name;
      end proc,

      proc(_self,the_name::string,the_age::integer, $) option overload;
          #print("Inside second overloaded set_info");
          _self:-the_name:=the_name;
          _self:-the_age:=the_age;
      end proc
   ]);

   export get_name::static:=proc(_self,$)
      RETURN(_self:-the_name);
   end proc;

   export get_age::static:=proc(_self,$)
      RETURN(_self:-the_age);
   end proc;
end module;

module person () local the_name::string, the_age; option object; end module

o:=Object(person);
#o:-set_info("me");
#o:-set_info("me",20);

set_info(o,"me"):
set_info(o,"me",20):

o:-get_name();
o:-get_age();

module person () local the_name::string, the_age; option object; end module

"me"

20

 

Download self_with_overloaded.mw

I found another big problem. 

In 2022, I get Error, (in SolveTools:-Polynomial) too many levels of recursion when using alias(seq(c[k] = _C||k, k = 0..10)); at the top of my code and the solution to the ode has c[2],c[3] etc.. as constants of integration.

This solution was given by Kitonum in this answer

I had this for years in the code (i.e. the alias) code.

In Maple 2022 the following gives the above exception error from odetest. I am using 2022, because in 2023 it just hangs on the same code.  

If I remove the alias code, no error shows. (solution is wrong, but that is different story). 

Also, If I remove the alias code, 2023 no long hangs!  

restart;

#kernelopts('assertlevel'=2):

alias(seq(c[k] = _C||k, k = 0..10));

c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10]

ode:=diff(diff(y(x),x),x)+4*diff(y(x),x)+12*y(x) = 80*sin(2*x);
sol:=y(x) = -10*exp(-1/2*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*((-1/10*exp(4*I*2^(1/2)*x)+1/10)*c[2]-1/10*I*c[3]*exp(4*I*2^(1/2)*x)-1/10*I*c[3])/((exp(4*I*2^(1/2)*x)-1)*c[2]+I*c[3]*exp(4*I*2^(1/2)*x)+I*c[3])*c[1]-10*I*exp(-1/2*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*(cos(2*x)-sin(2*x))*exp(2*I*2^(1/2)*x)*exp(2*I*2^(1/2)*x)^(-1/2*I*2^(1/2))/((exp(4*I*2^(1/2)*x)-1)*c[2]+I*c[3]*exp(4*I*2^(1/2)*x)+I*c[3]);

odetest(sol,ode);

diff(diff(y(x), x), x)+4*(diff(y(x), x))+12*y(x) = 80*sin(2*x)

y(x) = -10*exp(-(1/2)*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*((-(1/10)*exp((4*I)*2^(1/2)*x)+1/10)*c[2]-((1/10)*I)*c[3]*exp((4*I)*2^(1/2)*x)-((1/10)*I)*c[3])*c[1]/((exp((4*I)*2^(1/2)*x)-1)*c[2]+I*c[3]*exp((4*I)*2^(1/2)*x)+I*c[3])-(10*I)*exp(-(1/2)*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*(cos(2*x)-sin(2*x))*exp((2*I)*2^(1/2)*x)*(exp((2*I)*2^(1/2)*x))^(-((1/2)*I)*2^(1/2))/((exp((4*I)*2^(1/2)*x)-1)*c[2]+I*c[3]*exp((4*I)*2^(1/2)*x)+I*c[3])

Error, (in SolveTools:-Polynomial) too many levels of recursion

 

Download odetest_error_june_15_2023.mw

Why using the alias line above causes this error?  If you remove the alias line, you will see it completes with no error.

But it hangs in 2023. I am no longer using 2023 but went back to 2022 due to too many hangs in 2023. I wonder now if it because of this alias line I had there all the time.  I will remove now and see if this solves some of the hangs I had in 2023.

Anyone can shed some more light on what is going on?

Windows 10.

I can't figure how to obtain list of all modules inside my .mla file.

I can see all the modules using the command LibraryTools:-Browse("..../my_file.mla") then clicking EDIT then VIEW option at top right corner.  Member type is automatically set to MODULE in the lower left corner. So I can see the names of all the modules. And using the slider, I can scrol down. I see 73 modules listed.

But I want to do this in code. Not using GUI.

I tried the command

          L:=LibraryTools:-ShowContents(my_file.mla):

And this gives L of lenght 15805. Looking at each entry in the above list, it shows things I do not understand and I do not want. It has names in there which I do not know where these came from.

There does not seem to be an option in LibraryTools:-ShowContents() to only return the names of the modules inside .mla. At least I can't find such option.

reference Maple help page

Any idea how to do this in code? Not using the maplet? 

Maple 2022 on windows 10

ps. I know I can use the GUI and do EXTRACT to save the list to a file. But this is not good solution. I need the list of names of the modules be in a list so I can do this all in a function with no manual steps.

Does Maple have a command to list all names of all procs (local and exported) given a name of module?

There is a question/answer here which shows how to list all procs in module. But I only want the names.

The reason I am asking, I am trying to see if I can code 

     trace(moduleA:-proc1,
               moduleA:-proc2,
               moduleB:-proc3,....,
               moduleE:-proc1000,
               statements = false)

Before running my programming in order to turn tracing on. The problem is that there are 1,000's of proc's in dozens of modules so I need a way to obtain a sequence of the names all such procs automatically each time.

Once I figure how to do it for one module (say moduleA), I will apply this to the other modules I have and collect all names in one long sequence and see if this will work.

Any suggestion how to do this?  I now have all my modules inside one .mla file if it helps. They are all build ito this .mla from source tree of dozens of .mpl files.

Maple 2022 on windows 10

When adding option trace: inside a proc, Maple display trace of all assignments. I only want to see the --> enter  and <-- exit messages,.

I can't figure how to do that. Any suggestions? 

Maple 2022 on windows

restart;

A := module()
 export foo:=proc(n,m,k)   
   option trace:
   local r;

   r:=n:
   B:-boo(r);
 end proc:
end module:
B := module()
 export boo:=proc(n)
   option trace:
   local k;

   k:=n;
   RETURN();
 end proc:
end module:

#kernelopts(tracelineinfo=2);
#printlevel := 10:
kernelopts(traceincidentalassign=false):
kernelopts(tracesplitmulassign=false):
kernelopts(traceshowspecassign=false):
kernelopts(traceincidentalassign=false):
kernelopts(tracesplitmulassign=false):
kernelopts(traceshowspecassign=false):
kernelopts(tracelineinfo=0):
A:-foo(1,2,diff(y(x),x)=sin(x))

{--> enter foo, args = 1, 2, diff(y(x), x) = sin(x)

1

{--> enter boo, args = 1

1

<-- exit boo (now in foo) = }

<-- exit foo (now at top level) = }

 

Download trace_june_14_2023.mw

First 45 46 47 48 49 50 51 Last Page 47 of 199