nm

11493 Reputation

20 Badges

13 years, 88 days

MaplePrimes Activity


These are questions asked by nm

As I am playing with Maple object to understand it better, I found strange thing.

I have simple object with 2 methods. Both are exported so they could be called from outside.

One method is called set_name and this one is called OK (I have print inside to print it is called). The next exported method is called process and when calling this method, the print never shows up. Which means it is not called. Using the same exact call.

When changing the name from process to something else, say processX now the print show, meaning the method is now called.

Is there restriction on what one can call their object method? And why would there be ?

Here is an example

restart;
module car_class()
      option object;
      local name::string:=""; 

      export process::static := proc(o::car_class)
             print("process method");             
      end proc:   

      export set_name::static := proc(o::car_class,_name::string)
             print("inside set name"); 
             o:-name := _name:
      end proc:     
end module:

my_car:=Object(car_class):  #make object

set_name(my_car,"toyota"):
process(my_car):
set_name(my_car,"toyota"):

On the screen, it only shows 

Now I changed it to 

restart;
module car_class()
      option object;
      local name::string:=""; 

      export processX::static := proc(o::car_class)
             print("process method");             
      end proc:   

      export set_name::static := proc(o::car_class,_name::string)
             print("inside set name"); 
             o:-name := _name:
      end proc:     
end module:

my_car:=Object(car_class):
set_name(my_car,"toyota"):
processX(my_car):
set_name(my_car,"toyota"):

And now on the screen it shows OK

Is there a way a way to be able to freely choose what method names to give to the object method? clearly the name "process"  is something special for Maple here for some reason.

When I do ?process, I see that Maple has some commands that have this name. But this is a name of a method inside Object class, so it should not have anything to do with any Maple own command. 

This was never an issue with module() for an example.  If one has to worry about what name to give to their methods for an object, then this will be very awkward. For example, what if one calls their method FOO and future version of Maple introduce a new command called FOO now the code will no longer work.

 

 

I wanted to create an Array() to store only objects of specific type in it.  

Array() supports the datatype=value  telling it the type of elements to store. But when I try to create an Array() using datatype of the class, it fails. I must be doing something wrong. Here is an example

restart;
module solution_class()
      option object;
      local sol::anything;
end module;
sol:=Object(solution_class); #create an object

Now the following works:

A:=Array();
A(1):=sol;

But I wanted to do

A:=Array(datatype=solution_class);
A(1) := sol;

 Error, unable to store '0' when datatype=module solution_class () local sol::anything; option object; end module
 

Help says 

And this is the case here, because type(sol,solution_class)  gives true

So 'solution_class' is valid type name.

Where is my error?

 

 

There is a whole chapter in programming guide on OO in Maple.

How much is OO actually used by Maple programmers? Is OO used much internally at Maplesoft itself in implementing internal code? I do not see questions about OO in Maple in the forum. May be it has not taken off? 

Any one knows of packages in Maple written in OO style, using the Object module? I think OO was added in Maple 16, which is 2012?

p.s. I myself like OO programming. Done alot of it in Java. I think it can be useful for large applications.

 

 

 

This proc is valid, yet Maple mint thinks there is syntax error

foo:= proc(x)
local z := "";
    if not x in ["A","B"] then
        return;
    fi;

    z:=cat("A
            B");    
end proc;

mint t.mpl gives

on line     7:     z:=cat("A
                          ^ Syntax error
A "then" was found without a previous matching "if".
An "end" may be needed to close the "in" construct from line 3.

But these two below procs below it gives no syntax error

foo:= proc(x)
local z := "";
    if not x in ["A","B"] then
        return;
    fi;  
end proc;

And

foo:= proc(x)
local z := "";
    z:=cat("A
            B");    
end proc;

No syntax error on either one. the syntax error only shows up when combining them. 

What does if not x in ["A","B"] then  have to do with the cat  below it? And why when they are combined, the syntax error shows?

I know of workaround, such as changing the cat to  z:=cat("A\nB");     or keep the strings on two lines, but do it like this

    z:=cat("A\n
           B");

Or write it like this

   z:=cat("A "
           "B"); 

But none of these changes were needed before adding the not x in ["A","B"]  before.

Is this a bug in mint? Is there a work around so the first example above still works using 

    z:=cat("A
            B");   

?

When making a function and using the return type, I found Maple is not catching the case when the function returns wrong type.

Actually there are two issues in this example I like to ask about. First, here is the example

restart;
kernelopts(assertlevel):=2;
TypeTools:-AddType(type_A, record(x::integer)):

foo:=proc( A::type_A ) ::type_A;  #this is what return type should be
     print( type(A,'type_A')); #this prints TRUE
     A:-x :=1.5; #opps, wrong type, changes type of record now!
     print( type(A,'type_A')); #This now prints FALSE
     return A;
end proc:

A:=Record('x' = 1);
B:=foo(A):
eval(B)

The call to foo() goes through as expected since type is correct.

First issue: Inside the function doing A:-x :=1.5;  changed the type of record now, since is supposed to be integer and now become real. Is there a way to have Maple detect this at run time?

Second issue: The function was defined to return type_A  but due to this overwriting the field of the record by wrong value, it is no longer type_A  (the print now says false). But why Maple did not detect this? Since the function is defined to only return type_A ?

Is it possible to change the code above to catch these type mistakes I made?

First 129 130 131 132 133 134 135 Last Page 131 of 202