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