Hi package developers and others,
Here is a rather nasty bug in Mathematica 4.0.0, which has been haunting me
for the past couple of weeks. I have reported it to Wolfram Research.
A Cell with comments, such as the one below, is handeled OK when entered in
ordinary one-dimensional notation.
test := Module[{x = 1/10},
(* Everything OK with one dimensional notation *)
x]
The same cell can also be written using two dimensional notation (i.e. 1/10
is written as 10\^-1 with a superscript). This is the preferred style in
Mathematica. Two dimensional notation is also what you get if a cell is
converted into Standard Form using the menu command: CellConvert
ToStandard Form. Note that you can use this even if the cell is input
in
StandardForm, in order to get the nice two dimensional typesetting, and
have all your "[[" turned into \[LeftDoubleBracket] etc. Note, however,
that this removes all comments from your cell.
\!\(test1 :=
Module[{x = 10\^\(-1\)}, \[IndentingNewLine]\[IndentingNewLine] (*\
This\ comment\ ruins\ everything\ *) \[IndentingNewLine]\
\[IndentingNewLine]x]\)
This definition reads correctly by the Kernel when executed directly
from the Notebook. However, if the cell is turned into an initialization
cell and Mathematica is made to auto generate a Package from the
corresponding file (i.e. a file with the file extension .m) the resulting
Auto Generated Package is corrupt.
Unfortunately, this is not always the case. On some occations the file is
read without syntax errors, but the code is interpreted incorrectly by the
Kernel. On one occation I have had a Null expression included in the output
from a particular function, which caused strange behaviour when a complex
program was executed.
On another occation, it may even work. For example, if you move the comma
in the two dimensional Cell above, to the position immediately following the
comment, the corresponding package reads correctly.
When the same expressions are typed into Mathematica 3.0, only \n (\[NewLine])
and \t (\[RawTab]) are used, and everything is fine. When you type in
Mathematica 4.0 this is replaced by \[IndentingNewLine], which gives the
very nice auto indenting of complicated expressions in 4.0, but apparently
also this nasty bug.
A package written in Mathematica 3.0 with comments in two dimensional cells
can therefore be read by Mathematica 4.0 without problems. However, simply
editing the line breaks in 4.0, and regenerating the package, can cause the
package to become corrupt.
Fortunately, Mathematica indicates on which line of the package the problem
is, so opening the .m file in a text editor, you can easily locate which
cell is causing the problem. Then you must either remove the comments, or
rewrite the cell in one dimensional notation.
A safer way to comment your code in Mathematica is therefore to put all
comments in Text cells above or below the actual code, and refrain from
inline comments using (* comment *).
See also an earlier posting of mine regarding how inline comments colored
in red, can yield corrupt notebooks (not only packages) in 4.0.
To illustrate the behaviour with corrupt packages, follow the steps in the
notebook below.
Bye
Jarl
Notebook[{
Cell[CellGroupData[{
Cell["Comments in 2-D cells yield corrupt packages", "Section"],
Cell["The following cells are initialization cells.", "Text"],
Cell[BoxData[
\(test :=
Module[{x = 1/10}, \[IndentingNewLine]\[IndentingNewLine] (*\
Everything\ OK\ with\ one\ dimensional\ notation\ \
*) \[IndentingNewLine]\[IndentingNewLine]x]\)], "Input",
InitializationCell->True],
Cell[BoxData[
\(test1 :=
Module[{x = 10\^\(-1\)}, \[IndentingNewLine]\[IndentingNewLine] (
*\
This\ comment\ ruins\ everything\ *) \[IndentingNewLine]\
\[IndentingNewLine]x]\)], "Input",
InitializationCell->True],
Cell["\<\
If the definitions are sent directly to the Kernel from the \
Notebook, everything is fine\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(test\)], "Input"],
Cell[BoxData[
\(1\/10\)], "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[
\(test1\)], "Input"],
Cell[BoxData[
\(1\/10\)], "Output"]
}, Open ]],
Cell["Save the file.", "Text"],
Cell[BoxData[
\(NotebookSave[EvaluationNotebook[]]\)], "Input"],
Cell["Clear the old definitions", "Text"],
Cell[BoxData[
\(Clear[test, test1]\)], "Input"],
Cell["\<\
and try reading them from the package file (replace the name of the \
package file with the appropriate one)\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(<< "\<Mac OS 8:Desktop Folder:Untitled-1.m\>"\)], "Input"],
Cell[BoxData[
\(Syntax::"sntxb" \(\(:\)\(\ \)\)
"Expression cannot begin with \"\!\(\(\(\(\({x = 10\^\(-1\)}\)\),
\)\) x\
\)\".\!\(\"\"\)"\)], "Message"],
Cell["\<\
Syntax::sntx:
Syntax error in or before \"\[IndentingNewLine]x]\\) \".
^
(line 34 of \"Mac OS 8:De<<13>>Untitled-1.m\")\
\>", "Message"]
}, Open ]],
Cell["\<\
We can see that the definition of test1 went wrong by executing the \
definitions again.\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(test\)], "Input"],
Cell[BoxData[
\(1\/10\)], "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[
\(test1\)], "Input"],
Cell[BoxData[
\(test1\)], "Output"]
}, Open ]],
Cell["\<\
A cell entered in ordinary one dimensional notation is handled \
correctly:\
\>", "Text"],
Cell["\<\
However if two dimensional notation is used in an initialization \
cell, the resulting Auto Generated Package is corrupt.\
\>", "Text"]
}, Open ]]
}]