MathGroup Archive 2003

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

Search the Archive

Re: Re: shadow-proofing a package

  • To: mathgroup at smc.vnet.net
  • Subject: [mg42743] Re: [mg42724] Re: [mg42712] shadow-proofing a package
  • From: Dr Bob <drbob at bigfoot.com>
  • Date: Thu, 24 Jul 2003 04:10:46 -0400 (EDT)
  • References: <4B100857-BD1E-11D7-87C6-000393671006@earthlink.net>
  • Reply-to: drbob at bigfoot.com
  • Sender: owner-wri-mathgroup at wolfram.com

Combined with the Shadow package, that works pretty well.

Bobby

On Wed, 23 Jul 2003 10:59:43 -0400, Selwyn Hollis <selwynh at earthlink.net> 
wrote:

> Here's a better solution. It doesn't remove anything that has a value,  
> but does prevent the shadowing that happens when the user inadvertently  
> enters a package function prior to loading the package.
>
> Consider the following function:
>
> valuelessglobals[nameslist:{_String..}] :=
> With[{exprs = ToExpression/@
> Intersection[nameslist, ToString/@ToExpression/@nameslist]},
> Complement[exprs,
> Select[exprs, {UpValues[#],DownValues[#]} =!= {{},{}}& ]]]
>
> and suppose that
>
> mypackagenames = {"a", "b", "c", "f", "x"};
>
> Let's say we enter
>
> a = 1; f[x_] := x; c[something];
>
> Then
>
> valuelessglobals[mypackagenames]
>
> {b, c, x}
>
> and
>
> Remove@@(valuelessglobals[mypackagenames])
>
> removes the problem symbol c.
>
> -----
> Selwyn Hollis
> http://www.math.armstrong.edu/faculty/hollis
>
>
> On Wednesday, July 23, 2003, at 07:08  AM, Andrzej Kozlowski wrote:
>
>> As others have pointed out, a properly written program does not erase  
>> or remove definitions made by the user without first saving them  
>> somewhere else or at least giving the user a chance to do so. However,  
>> you can modify your package so that it first "moves" all such symbols,  
>> together with their DownValues, UpValues etc, to a newly created  
>> context (which should be different from any existing one).
>>
>> Andrzej Kozlowski
>> Yokohama, Japan
>> http://www.mimuw.edu.pl/~akoz/
>> http://platon.c.u-tokyo.ac.jp/andrzej/
>>
>>
>>
>> On Wednesday, July 23, 2003, at 06:25 AM, Dr Bob wrote:
>>
>>> That's essentially the method used in Notation.m
>>>
>>> Or here's my own utility package, featuring the same method:
>>>
>>> BeginPackage["DrBob`Utility`"]
>>>
>>> Unprotect[Evaluate[$Context<>"*"]];
>>> ClearAll[Evaluate[$Context<>"*"]];
>>>
>>> DrBob`Utility::gshadw="The symbol '`1`' has been used in the global
>>> context. \
>>> The DrBob`Utility` package needs the full use of the symbol '`1`' and  
>>> has \
>>> therefore removed this symbol from the global context.";
>>>
>>> Begin["`Private`"]
>>>
>>> publicFunctions=
>>> Map[StringJoin["Global`",#1]&,{"animate","browse","divvy","divvySort",
>>> "self","subFunction","test","testOption","testMax
>>> ","testFst","zeroQ"}];
>>> overideNames=Intersection[Names["Global`*"],publicFunctions];
>>> If[overideNames=!={},((Message[DrBob`Utility::gshadw,#1]&)/ 
>>> @(StringDrop[#1,
>>> 7]&)/@overideNames;
>>> Unprotect/@overideNames;
>>> ClearAll/@overideNames;
>>> Remove/@overideNames;
>>> Null)];
>>>
>>> End[]
>>>
>>> ... usage statements here ...
>>>
>>> Begin["`Private`"]
>>>
>>> ... function definitions ...
>>>
>>> End[]
>>>
>>> Protect[Evaluate[$Context<>"*"]];
>>>
>>> EndPackage[];
>>>
>>> Bobby
>>>
>>> On Tue, 22 Jul 2003 04:40:46 -0400 (EDT), Selwyn Hollis
>>> <selwynh at earthlink.net> wrote:
>>>
>>>> The following occurred to me as a way to prevent the shadowing  
>>>> problem:
>>>>
>>>> Before BeginPackage["blah`blahblah`"] put
>>>>
>>>> Remove@@( StringJoin["Global`",#]&/@
>>>> Intersection[Names["Global`*"],
>>>> 		{"name1", "name2", ... for all symbols defined in the package}] )
>>>>
>>>> This seems to work well. But surely there must be some downside to  
>>>> it, or
>>>> else it would already be the recommended way of doing things. What  am 
>>>> I
>>>> overlooking here?
>>>>
>>>> -----
>>>> Selwyn Hollis
>>>> http://www.math.armstrong.edu/faculty/hollis
>>>>
>>>>
>>>
>>>
>>>
>>> -- majort at cox-internet.com
>>> Bobby R. Treat
>>>
>>>
>>>
>>
>>
>
>



-- 
majort at cox-internet.com
Bobby R. Treat


  • Prev by Date: Problem with Show, Can't Give More than 5 Arguments
  • Next by Date: Re: Calling Mathematica-4.2 from C Code.
  • Previous by thread: Re: Re: shadow-proofing a package
  • Next by thread: Re: shadow-proofing a package