MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Changing default options of functions in a package when loading it

  • To: mathgroup at smc.vnet.net
  • Subject: [mg117426] Re: Changing default options of functions in a package when loading it
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Fri, 18 Mar 2011 06:00:08 -0500 (EST)

Hi Heiko,

one possibility would be to create another package where you store the
parameters,
and which has getter and setter methods for them (similar to Java beans in
Java), and import such
package privately into your package where your options must be set. Here is
a minimal
example:

(* Package with parameters *)
BeginPackage["MyParameters`"];
setUserName::usage = "setUserName[name_] is a setter for user name";
getUserName::usage = "getUserName[] is a getter for user name";
Begin["`Private`"];
userName = "someUserName";
setUserName[uname_] := userName = uname;
getUserName[] := userName;
End[];
EndPackage[];


(* Main package *)
BeginPackage["MyPackage`"];
myfun1;
myfun2;
UserName;
Begin["`Private`"];
Needs["MyParameters`"];
Options[myfun1] = {UserName :> getUserName[]};
Options[myfun2] = {UserName :> getUserName[]};

myfun1[opts : OptionsPattern[]] :=
  Print["The user name is ", OptionValue[UserName]];
myfun2[opts : OptionsPattern[]] :=
  Print["The user name length is ", Length@OptionValue[UserName]];
End[];
EndPackage[];

You can execute this code also in the front-end. Note that I used delayed
rules in options. Now,

myfun1[]

The user name is someUserName

setUserName["anotherUserName"];
myfun1[]

The user name is anotherUserName

So, by changing the parameter with a setter method, you control the option
settings at run-time, even
perhaps after the package has been loaded. As for the parameter package, it
can be generated programmatically. It does not have to necessarily be a file
with hard-coded parameters, all that matters
is that its context is on the $ContextPath and in $Packages - then Needs
will not attempt to load it
from the file but will simply put it on the $ContextPath when called. And in
any case, by using delayed rules
in option definitions and exposing setter methods for the parameters, you
can change them at any time
and the default values for options will be automatically triggering these
changes. This should give you
enough flexibility, I guess.

Regards,
Leonid



On Thu, Mar 17, 2011 at 2:31 PM, heiko <heiko.damerau.news at web.de> wrote:

> Hello,
>
>    For a package containing functions with options, I'm looking for a
> clever technique to set the default values of these options when
> loading the package. In fact my package contains several functions
> having an option to define a user name. Is there any possibility to
> define a parameter like user name when loading the package such that
> it is then automatically taken as default value for the options of the
> functions inside the package? Is there any way to specify further
> parameters when loading a package in Mathematica (like options are
> optional parameters to functions), i.e. options of a package?
>
>    Thanks in advance for any idea.
>
> Best regards,
> Heiko
>
>


  • Prev by Date: Re: Does MemoryConstrained count stack space?
  • Next by Date: Re: Wolfram, meet Stefan and Boltzmann
  • Previous by thread: Changing default options of functions in a package when loading it
  • Next by thread: question on example dealing with exists