The conflict with System`
symbols that I was referring to is the following. Suppose we have this package:
BeginPackage["MyPack`"];
DistanceMatrix;
Begin["`Private`"];
DistanceMatrix[pts_] := Outer[EuclideanDistance, pts, pts, 1]
End[];
EndPackage[];
Version 10.0 does not have System`DistanceMatrix
, but it does have HierarchicalClustering`DistanceMatrix
in the HierarchicalClustering package. If we load MyPack, it will work fine. If we now load HierarchicalClustering, then MyPack`DistanceMatrix
will be shadowed, but it will still function correctly and can be called using the fully qualified name
MyPack`DistanceMatrix
HierarchicalClustering`DistanceMatrix
and MyPack`DistanceMatrix
can coexist peacefully, it's just necessary to use the full name to refer to them in an unambigous manner.
But what if we load this package in 10.3, which does have System`DistanceMatrix
? It simply won't work. We get the error
SetDelayed::write: Tag DistanceMatrix in DistanceMatrix[pts_] is Protected. >>
To fix it, we need to modify the package now to look like this:
BeginPackage["MyPack`"];
MyPack`DistanceMatrix; (* must give fully qualified name here *)
Begin["`Private`"];
DistanceMatrix[pts_] := Outer[EuclideanDistance, pts, pts, 1]
End[];
EndPackage[];
So perhaps in this new era where the System context is so crowded, it is indeed necessary to use a fully qualified name in packages in the section where symbols are made public, so prepare for shadowing by a System symbol in the future.
But currently this is not standard practice. The only time it is done even in standard packages is when the shadowing has already happened, such as in Combinatorica.