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