Hello,
Again, I'm working my way through some of the programming examples
in Michael Trott's Programming Guidebook, and there's behaviour that I
cannot figure out. I've been over and over section A.5.2 and 2.5.10 in
the Mathematica Book, but I still don't understand up values when
applied to functions with more than one argument. Also, I had a
question about level specification, which I couldn't figure out even
after looking at section A.3.6. Any help is appreciated. First the
upvalue questions:
I don't understand the point of using TagSet as opposed to UpSet:
e.g. in Michael Trott's Programming Guidebook on page 318 he states:
"For functions with several arguments, the information can be
associated with a certain prescribed argument rather than with all
arguments at the first level." However, I don't see any difference in
functionality between this:
x /: Plus[x, y_] = y;
Plus[x, 7]
??x
??y
and this (after clearing x and y)
Plus[x, y_] ^:= y
Plus[x, 7]
??x
??y
Also, I'm stumped on this particular wording in the TagSet
documentation:
"If f appears several times in lhs, then f/: lhs = rhs associates the
assignment with each occurrence"
What does this really mean?
As regards Apply:
Is it true that Apply[newHead, expr, 1] and Apply[newHead, expr, {1}]
will always be the same result given that the other two arguments are
identical?
By definition, a level specification of n applies to levels 1 through
n. I have found that if I do something like Apply[newHead, expr, -2],
that what I actually end up with seems to be equivalent to newExpr =
Apply[newHead, expr, {1}] followed by Apply[newHead, newExpr, {-2}].
Here is an example:
Cell[BoxData[{
RowBox[{
RowBox[{"a1", " ", "=", " ",
RowBox[{"Array", "[",
RowBox[{"\[DoubleStruckR]", ",",
RowBox[{"{",
RowBox[{"2", ",", "2"}], "}"}], ",",
RowBox[{"{",
RowBox[{"2", ",", "4"}], "}"}]}], "]"}]}],
";"}], "\[IndentingNewLine]",
RowBox[{"MatrixForm", "[", "a1", "]"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"a11", " ", "=", " ",
RowBox[{"Apply", "[",
RowBox[{"newHead", ",", "a1", ",",
RowBox[{"{", "1", "}"}]}], "]"}]}],
";"}], "\[IndentingNewLine]",
RowBox[{"MatrixForm", "[", "a11", "]"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"a12", " ", "=", " ",
RowBox[{"Apply", "[",
RowBox[{"newHead", ",", "a11", ",",
RowBox[{"{",
RowBox[{"-", "2"}], "}"}]}], "]"}]}],
";"}], "\[IndentingNewLine]",
RowBox[{"MatrixForm", "[", "a12", "]"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"a13", " ", "=", " ",
RowBox[{"Apply", "[",
RowBox[{"newHead", ",", " ", "a1", ",", " ",
RowBox[{"-", "2"}]}], "]"}]}],
";"}], "\[IndentingNewLine]",
RowBox[{"MatrixForm", "[", "a13", "]"}]}], "Input"]
What is the general rule, or am I just misusing the level specification
in Apply?
And finally, a question on modified built in functions:
In Michael Trott's Programming Guidebook, on page 311, he uses the
following construct to remove a downvalue that had been specified for
the Cos and Sin functions:
Unprotect[Cos];
Clear[Cos];
Protect[Cos];
{Cos}
I've noticed that if I omit the last line (i.e. {Cos}), that it still
works. What is the point of the last line?
Thanks very much,
Matt