In fresh kernel Mathematica 11.3 (Linux) asking for args (similarly for dims) I obtain
??args
Global`args
As far as I remember similar problem we had in 10.x with the symbol z
See
Seems like Global context is again polluted with args
and dims
as is confirmed by Names["Global`*"]
Answer
It's a type of otherwise harmless bug that tends to come and go with versions. I would suggest to report it to Wolfram, but also not to worry about it. Notice that the symbols have no associated definitions, which means that they will not interfere with your code.
A potential way in which such a situation can arise is the following. Imagine you put
Sqr[x_] := x^2
in your $UserBaseDirectory/Kernel/init.m
file. It will cause not only Sqr
to be created in the Global`
context, but also x
, which is easy to overlook. This is completely harmless though, and will not interfere with any x
symbol you might use in your session.
A case that is a bit more realistic, and better shows why these bugs tend to occur regularly, is illustrated e.g. by my MaTeX package. Take a look at the Kernel/init.m
file of MaTeX, which does follow the standard package structure. In the simplest case, this file would only contain Get["MaTeX`MaTeX`"]
. In this case, I chose to include a few extra checks, as well as unprotect/protect symbols. Notice, however, that only System`
context symbols appear in this file. If I as much as mentioned any other symbol, it would be created in Global`
because at the time when the context init.m
is evaluated, BeginPackage
may not have yet been reached or EndPackage[]
may have been passed already.
Consider e.g. how we can set Protected
and ReadProtected
on all symbols of a package called MyPack
after EndPackage[]
. A simple way is
With[{symbols = Names["MyPack`*"]},
SetAttributes[symbols, {Protected, ReadProtected}]
]
However, this would create Global`symbols
. Therefore in MaTeX I opted for the following, perhaps slightly less clear construct:
SetAttributes[
Evaluate@Names["MyPack`*"],
{Protected, ReadProtected}
]
Notice that this second version avoid mentioning any non-System symbols, therefore it will not pollute the Global context.
Subtle points like this are very easy to overlook.
Comments
Post a Comment