MathGroup Archive 2005

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

Search the Archive

Re: Shadowing of symbols in a package

  • To: mathgroup at smc.vnet.net
  • Subject: [mg61253] Re: Shadowing of symbols in a package
  • From: albert <awnl at arcor.de>
  • Date: Fri, 14 Oct 2005 05:53:40 -0400 (EDT)
  • References: <dikta4$4ue$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Hi Hannes,

> --> The following warning is generated by running the notebook:
> 
> Meter::shdw: Symbol Meter appears in multiple contexts {PackageUnits`,
> Miscellaneous`SIUnits`}; definitions in context PackageUnits` may
> shadow or be shadowed by other definitions.
>
...

> Should I ignore the warning, or does it indicate that something should
> be done better?

If you write packages intended for others to use you should never ignore
shadow messages. In this case the reason for the message is as follows:

Miscellaneous`Units` automatically loads Miscellaneous`SIUnits` and puts it
onto the context path _and_ Meter happens to be in the SIUnits-Package:

In[1]:= Needs["Miscellaneous`Units`"]

In[2]:= Context[Meter]

Out[2]= Miscellaneous`SIUnits`

In[3]:= $ContextPath

Out[3]= {Miscellaneous`Units`, Miscellaneous`SIUnits`, Global`, System`}

For reasons I don't know and understand, using package names as second
arguments in BeginPackage shows a slightly different behaviour:

In[1]:= BeginPackage["test`",{"Miscellaneous`Units`"}]

Out[1]= test`

In[2]:= $ContextPath

Out[2]= {test`, Miscellaneous`Units`, System`}

In[3]:= Context[Meter]

Meter::shdw: Symbol Meter appears in multiple contexts
    {test`, Miscellaneous`SIUnits`}; definitions in context test`
     may shadow or be shadowed by other definitions.

Out[3]= test`

In[4]:= EndPackage[]

So what you can learn is that the Meter you see in your output is not the
Meter you intend to use and it will fail to be correctly treated by the
Units`-Functions. The workaround in this case is to also add the Context
Miscellaneous`SIUnits` to your BeginPackage-Statement:

In[1]:= BeginPackage["test`"
{"Miscellaneous`Units`","Miscellaneous`SIUnits`"}]

Out[1]= test`

In[2]:= $ContextPath

Out[2]= {test`, Miscellaneous`Units`, Miscellaneous`SIUnits`, System`}

In[3]:= Context[Meter]

Out[3]= Miscellaneous`SIUnits`

In[4]:= EndPackage[]

No error message, the correct Meter is used. Anyway it is counterintuitiv
that in this case the behaviour of BeginPackage is so different from what
Needs does, but most probably everything works as specified :-).

cheers,

albert


  • Prev by Date: Re: challenge problem
  • Next by Date: Re: challenge problem
  • Previous by thread: Shadowing of symbols in a package
  • Next by thread: challenge problem