6
$\begingroup$

I am learning the new package style as current one is not working for me. I know it is probably not a good idea to use something with no official Wolfram documentation and not officially released. But I was just trying it out for now.

I'd like to make top level package with public API's and number of lower level subpackages each to process each API. But I want the name of the API in top level to be same as in subpackages.

The new package style is supposed to allow this from the references below.

In this new setup, I have this layout

 C:\Users\Owner\AppData\Roaming\Mathematica\Applications\nma
    nma.m
    dsolveMGR.m

The top level package is nma.m and since it is the same name as folder, then kernel/init.m is not needed (but it can also be there).

dsolveMGR is supposed to be a subpackage of nma

Both packages loads OK using

 <<nma`

from anywhere.

Now here is the problem. I have one public API in nma.m which is called dsolve[....] and inside this function I want to call the subpackage dsolveMGR for more processing.

But the function there is also called dsolve[].

This is supposed to work in the new style packages.

But eveything I tried is not working. When I call the public API dsolve[], the call bypasses the dsolve in nma.m and goes directly to dsolverMGR dsolve instead. It means the dsolve in the subpackage has overwritten the dsolve in the main top level package.

Here is complete code

nma.m file

Package["nma`"]
Print["nma.m loaded"]

PackageExport["dsolve"] (*so that user can call this from outside*)

dsolve[ode_]:= 
   Module[{},
   Print["In nma`dsolve. Before calling  nma`dsolveMGR`dsolve"];
 
   (*now need to my own internal dsolve function to process more. *)

   (*nma`PackageScope`dsolveMGR`dsolve[ode]*)
   (*nma`dsolveMGR`PackagePrivate`dsolve[ode]*)
   nma`PackageScope`dsolve[ode]
]
    

file dsolverMGR.m

(* It might look strange to just say Package["nma`"] below in 
   the subpackage nma`dsolverMGR` but this is how it works. 
   See example in first reference below. Mathematica sees this
   file in the nma folder and automatically makes it subpackage,
   at least this is my understanding *)

Package["nma`"]
Print["dsolveMGR.m loaded"]

(*PackageScope["dsolve"]*) (*not sure if I need to do anything more here *)

dsolve[ode_]:=Module[{},    
    Print["in nma`dsolveMGR`dsolve[] to do the actual processing..."]
]

Using example

Now from a notebook, I do the following from clean kernel

 << nma`

And see

 nma.m loaded
 dsolveMGR.m loaded

So both files are read OK automatically. Mathematica always loads nma.m first since that is the same as name of the folder. Then the rest are loaded. I only have one subpackage now but will be adding more if this set up works.

The problem comes now when making this call from the notebook:

 nma`dsolve[y'[x] == Sin[x]]

Gives

  in nma`dsolveMGR`dsolve[] to do the actual processing...

You see? top level dsolve was overwritten. I was expecting to see

 In nma`dsolve. Before calling  nma`dsolveMGR`dsolve 

 in nma`dsolveMGR`dsolve[] to do the actual processing...

Question is: How to see the above and not have dsolve in subpackage overwrite the dsolve in the top level package? I know ofcourse I can rename dsolve function in the subpackage. But this should not be needed. Each lives in its own package space, so one should be able to have same name in different packages.

I tried and tried and gave up. My limit on trying is 2 hrs. I learn better by examples, and not able to find one single example on the net showing this. I see many discussions but no examples.

V14

References

https://yuluyan.com/posts/mma-package/

What to be aware when using new-style package?

Declaring Package with dependencies in multiples files?

https://mresources.github.io/tutorial/package-usage-and-development/higher-level-features/newstyle-packages.html

mathematica package new style: a few beginner questions

$\endgroup$
0

1 Answer 1

6
$\begingroup$

Change the definition to:

dsolveMGR`dsolve[ode_] := ...

in the subfile, and call it as

dsolve[ode_]:= Module[{}, dsolveMGR`dsolve[...]]

in the main file.

$\endgroup$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.