Package Usage and Development » Advanced Features

New-Style Packages

As of version 10 or so there is a new package format that may be used to more easily handle complicated package setups. It involves a set of static tokens that one uses to tell the system how to distribute definitions and expose contexts and things. These are:

  • Package must be at the top of a package file, tells the system it's a package and the package name
  • PackageExport tells the system that a given symbol will be exposed at top level
  • PackageScope tells the system that a given symbol should be exposed at the package level
  • PackageImport tells the system to import a given context and expose it within that file

Any symbol not tagged with PackageExport or PackageScope gets a context that is private to that file.

A sample paclet structure might look like:

 
 MyPaclet 
  + PacletInfo.m 
  Kernel 
   + init.m 
  MyPaclet.m 
  Component1.m 
  Component2.m 
  ...

Each component would look like:

 Package["MyPaclet`"]

PackageImport["Dependency1`"]
PackageImport["Dependency2`"]
...

PackageExport["Symbol1"]
PackageExport["Symbol2"]
...

PackageScope["PkgSym1"]
PackageScope["PkgSym2"]
...

sym1[]:=...
Symbol1[]:=... 

...

Note a few interesting features:

  • There is no Begin or BeginPackage or anything like that
  • The tokens must be declared standalone, without even a ; at the end
  • We don't explicitly tell the system to load all the componentsit does this automatically

This allows for much simpler package construction and is a good clean strategy for developing packages

Package` Context

Even better, there are tools at hand for analyzing/working with these packages. These are the functions in the "Package`" context. There'll be a little reference guide on them, but for now here's a quick rundown of how they work:

  • PackageInformation extracts info for new style packages
  • LoadPackage loads a new style package
  • DeclareLoad sets up autoloading for a package
  • ActivateLoad set by DeclareLoad to delegate to LoadPackage
  • CreatePackageCache generates a .mx redux of a package for optimized loading

See Also: