RE: Different Methods inside one package
- To: mathgroup at smc.vnet.net
- Subject: [mg33729] RE: [mg33715] Different Methods inside one package
- From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
- Date: Wed, 10 Apr 2002 00:49:12 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Guillermo, I have to add a note (see below) > -----Original Message----- > From: Wolf, Hartmut To: mathgroup at smc.vnet.net > Sent: Tuesday, April 09, 2002 11:23 AM > To: 'J. Guillermo Sanchez'; mathgroup at smc.vnet.net > Subject: [mg33729] RE: [mg33715] [mg33715] Different Methods inside one package > > > > > -----Original Message----- > > From: J. Guillermo Sanchez [mailto:guillerm at usal.es] To: mathgroup at smc.vnet.net > > Sent: Tuesday, April 09, 2002 7:03 AM > > To: mathgroup at smc.vnet.net > > Subject: [mg33729] [mg33715] [mg33715] Different Methods inside one package > > > > > > > > (* Dear friends, I wish build a package where the user, as > one option, > > can be choose one of three methods of evaluation, i.e: > > Automatic, LT or > > EV. Some thing like this silly example *) > > > > BeginPackage["test`test`"] > > > > methodTest::usage="methodTest. This is an example" > > > > Options[methodTest]={Method\[Rule]Automatic}; > > > > Begin["`Private`"] > > > > methodTest[matrixA_, incond_, opts___]:= > > If[Automatic == Method/.{opts}/.Options[methodTest], > > Module[{a, b, r},(a = matrixA; b = incond; r = a b)]] > > > > methodTest[matrixA_, incond_, opts___]:= > > If[LT == Method/.{opts}/.Options[methodTest], > > Module[{a, b, r},(a = matrixA; b = incond; r = a /b)]] > > > > methodTest[matrixA_, incond_, opts___]:= > > If[EV == Method/.{opts}/.Options[methodTest], > > Module[{a, b, r},(a = matrixA; b = incond; r = a + b)]] > > > > End[] > > > > Protect[methodTest]; > > > > EndPackage[] > > > > list1 ={{a11, a12 },{a21,a22}} > > > > methodTest[list1,list2] > > > > methodTest[list1,list2, Method\[Rule]EV] > > > > methodTest[list1,list2, Method\[Rule]LT] > > > > > > (*How can I get that this example work?*) > > > > Guillermo, > > observe > > In[15]:= BeginPackage["test`test`"] > > methodTest::usage = "methodTest. This is an example"; > LT::usage = "read manual"; > EV::usage = "before operating"; > > Options[methodTest] = {Method -> Automatic}; > > Begin["`Private`"] > > methodTest[matrixA_, incond_, opts___] := > Module[{a, b, r, m = Method /. Flatten[{opts}] /. > Options[methodTest]}, > a = matrixA; b = incond; > Which[ > m === Automatic, r = a b, > m === LT, r = a/b, > m === EV, r = a + b, > True, "something went wrong"]] > > End[] > > Protect[methodTest] > > EndPackage[] > > In[25]:= list1 = {{a11, a12}, {a21, a22}} > > In[26]:= methodTest[list1, XXX] > Out[26]= {{a11 XXX, a12 XXX}, {a21 XXX, a22 XXX}} > > In[27]:= methodTest[list1, XXX, Method -> EV] > Out[27]= {{a11 + XXX, a12 + XXX}, {a21 + XXX, a22 + XXX}} > > In[28]:= methodTest[list1, XXX, Method -> LT] > Out[28]= {{a11/XXX, a12/XXX}, {a21/XXX, a22/XXX}} > > In[29]:= ?LT > In[30]:= ?EV > > > Two things: first, if you repeat a definition (i.e. the same > lhs of a transformation rule), only the last one will be > stored. Adding a condition wouldn't work in your case > however. Second, you must export your symbols (LT, EV), > otherwise global symbols will be inserted at call (and not be > recognized in the context "test`test`Private`") > > In[33]:= Context[EV] > Out[33]= "test`test`" > > -- > Hartmut > I must correct myself: adding a condition might help! So you have this alternative: ... Begin["`Private`"] methodTest[matrixA_,incond_,opts___]:= With[{m=Method/.Flatten[{opts}]/.Options[methodTest]}, Module[{a,b,r}, a=matrixA;b=incond;r=a b] /; m===Automatic] methodTest[matrixA_,incond_,opts___]:= With[{m=Method/.Flatten[{opts}]/.Options[methodTest]}, Module[{a,b,r}, a=matrixA;b=incond;r=a/ b] /; m===LT] methodTest[matrixA_,incond_,opts___]:= With[{m=Method/.Flatten[{opts}]/.Options[methodTest]}, Module[{a,b,r}, a=matrixA;b=incond;r=a +b] /; m===EV] methodTest[matrixA_,incond_,opts___]:="Something went wrong"; End[] ... The Condition in With is effective for pattern matching. To understand this, scan the archive for "Allan Hayes", "Michael Trott" and "Adam Strzebonski". kind regards, Hartmut Wolf