11
$\begingroup$

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`*"]

$\endgroup$
3
  • $\begingroup$ This does not happen in V11.3 on my Mac (nor in V12). $\endgroup$ – Michael E2 Jul 27 '19 at 20:20
  • $\begingroup$ @MichaelE2 This happens on 11.3.0 for Linux x86 (64-bit) (March 7, 2018) according to $Version information $\endgroup$ – Acus Jul 29 '19 at 14:14
  • $\begingroup$ I see args and dims in 12.0 on macOS. Since it's common to multiple versions, I suspect these may be defined by a paclet update. Such things tend to be completely harmless, so I would not worry about it. $\endgroup$ – Szabolcs Jan 2 '20 at 12:58
13
$\begingroup$

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.

$\endgroup$
1
  • $\begingroup$ I now get a conflict warning on 12.2.0 for the symbol a. As far as "Subtle points like this are very easy to overlook."---this is the exact kind of thing that unit tests are designed for... $\endgroup$ – evanb May 29 at 14:09
3
$\begingroup$

It exists, because someone somewhere did something wrong, as stated everywhere in all similar questions.

For me it was a question for a long time, which file exactly caused the problem. So that exact filename and definitions/usage might explain the why with more details.

So we need to find a place, where the leak occurred. I did it in the following way for myself. I opened

/usr/local/Wolfram/<Mathematica or WolframEngine>/<version>/SystemFiles/Autoload/PacletManager/Kernel/init.m

file and added there the following function:

$NewSymbol :=
   If[Names@"Global`*" =!= {},
      Print@Names@"Global`*";
      Print[#2, #1];
      Print@$InputFileName;
      Quit@1]&;

It will just show us the context, name and the file of any new symbol. Now we save the file, go to terminal and run math or similar to see, which symbol and file caused this bad leak.

For me it was

$HOME/.Mathematica/Paclets/Repository/StructuredArrayPatch-1.0.2.6/Kernel/StructuredArrayPatch.m

So I just opened it and prepended explicitly some context to these symbols. For me some was StructuredArray, so that I have now StructuredArray`dims and StructuredArray`args inside the code. It seems to be working so far and I am kind of happy about that.

It is not the best solution, but it worked for me. Hopefully, it will allow you to get rid of this issue as well.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.