(* Content-type: application/mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Mathematica 6.0' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 145, 7] NotebookDataLength[ 20088, 742] NotebookOptionsPosition[ 17171, 650] NotebookOutlinePosition[ 17533, 666] CellTagsIndexPosition[ 17490, 663] WindowFrame->Normal ContainsDynamic->False*) (* Beginning of Notebook Content *) Notebook[{ Cell[CellGroupData[{ Cell["Lesson 14 More on Functions", "Section"], Cell["\<\ In Lesson 8 you learned the basic syntax for defining functions. Now is the \ time to look at some more advanced features.\ \>", "Text"], Cell[CellGroupData[{ Cell["If", "Subsection"], Cell[TextData[{ "The ", StyleBox["If", "Input", FontWeight->"Bold"], " command is one of the most useful commands for programming. Its syntax is" }], "Text"], Cell[BoxData[ RowBox[{"?", "If"}]], "Input"], Cell[TextData[{ "For example, here's way of defining the function \n", Cell[BoxData[ FormBox[ StyleBox[ RowBox[{ RowBox[{"f", "(", "x", ")"}], "=", TagBox[ RowBox[{ StyleBox["{", ShowAutoStyles->False], StyleBox[" ", ShowAutoStyles->False], StyleBox[GridBox[{ { RowBox[{" ", RowBox[{ RowBox[{"cos", " ", "x", " ", "if", " ", "0"}], "\[LessEqual]", "x", " ", "\[LessEqual]", "\[Pi]"}]}]}, { RowBox[{ RowBox[{ RowBox[{ FractionBox["2", "\[Pi]"], "x"}], "-", RowBox[{"3", " ", "if", " ", "\[Pi]"}]}], "<", "x", "\[LessEqual]", RowBox[{"2", "\[Pi]"}]}]} }], ShowAutoStyles->True]}], #& ]}], "Input"], TraditionalForm]]] }], "Text"], Cell[BoxData[ RowBox[{ RowBox[{"f", "[", "x_", "]"}], ":=", " ", RowBox[{"If", "[", RowBox[{ RowBox[{"x", "\[LessEqual]", " ", "Pi"}], ",", " ", RowBox[{"Cos", "[", "x", "]"}], ",", RowBox[{ RowBox[{"2", " ", RowBox[{"x", "/", "Pi"}]}], "-", "3"}]}], "]"}]}]], "Input"], Cell[BoxData[{ RowBox[{"f", "[", "1", "]"}], "\[IndentingNewLine]", RowBox[{"f", "[", "4", "]"}]}], "Input"], Cell[BoxData[ RowBox[{"Plot", "[", RowBox[{ RowBox[{"f", "[", "x", "]"}], ",", RowBox[{"{", RowBox[{"x", ",", "0", ",", RowBox[{"2", " ", "Pi"}]}], "}"}]}], "]"}]], "Input"], Cell[TextData[{ "Here's another example: A function that takes a list ", StyleBox["L", "Input", FontWeight->"Bold"], " of numbers and sets all its negative entries to zero. " }], "Text"], Cell[BoxData[ RowBox[{ RowBox[{"makepos", "[", "L_", "]"}], ":=", " ", RowBox[{"Table", "[", RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{ RowBox[{"L", "[", RowBox[{"[", "i", "]"}], "]"}], ">", "0"}], ",", RowBox[{"L", "[", RowBox[{"[", "i", "]"}], "]"}], ",", "0"}], "]"}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"Length", "[", "L", "]"}]}], "}"}]}], "]"}]}]], "Input"], Cell[BoxData[ RowBox[{"makepos", "[", RowBox[{"{", RowBox[{"1", ",", "2", ",", RowBox[{"3", "-", "4"}], ",", RowBox[{"-", "6"}], ",", RowBox[{"-", "Pi"}], ",", "0"}], "}"}], "]"}]], "Input"], Cell["\<\ Let's test this with a random list - random elements and a random length. The \ elements are real numbers between -10 and 10, and the list has a random \ length between 5 and 20 elements.\ \>", "Text"], Cell[BoxData[ RowBox[{"L", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"RandomReal", "[", RowBox[{"{", RowBox[{ RowBox[{"-", "10"}], ",", "10"}], "}"}], "]"}], ",", RowBox[{"{", RowBox[{"RandomInteger", "[", RowBox[{"5", ",", "20"}], "]"}], "}"}]}], "]"}]}]], "Input"], Cell[BoxData[ RowBox[{"makepos", "[", "L", "]"}]], "Input"] }, Open ]], Cell[CellGroupData[{ Cell["Multi-Line Definitions of Functions", "Subsection"], Cell[TextData[{ "Assume the function you want to define consists of executing several steps, \ like an algorithm. In this case, you need to enclose the separate steps in \ parentheses. For example, to calculate the area of a triangle with sides of \ length ", StyleBox["a", "Input"], ", ", StyleBox["b", "Input"], ", and ", StyleBox["c", "Input"], ", we can use Heron's formula:" }], "Text"], Cell[BoxData[ RowBox[{"area", "=", SqrtBox[ RowBox[{"s", RowBox[{"(", RowBox[{"s", "-", "a"}], ")"}], RowBox[{"(", RowBox[{"s", "-", "b"}], ")"}], RowBox[{"(", RowBox[{"s", "-", "c"}], ")"}]}]]}]], "Input"], Cell[TextData[{ "where", StyleBox[" s=(a+b+c)/2", "Input"], " is the semi-perimiter of the triangle. A ", StyleBox["Mathematica", FontSlant->"Italic"], " function to calculate the area would have two steps:" }], "Text"], Cell[BoxData[ RowBox[{ RowBox[{"area", "[", RowBox[{"a_", ",", "b_", ",", "c_"}], "]"}], ":=", RowBox[{"(", RowBox[{ RowBox[{"s", "=", RowBox[{ RowBox[{"(", RowBox[{"a", "+", "b", "+", "c"}], ")"}], "/", "2"}]}], ";", RowBox[{"Sqrt", "[", RowBox[{"s", RowBox[{"(", RowBox[{"s", "-", "a"}], ")"}], RowBox[{"(", RowBox[{"s", "-", "b"}], ")"}], RowBox[{"(", RowBox[{"s", "-", "c"}], ")"}]}], "]"}]}], ")"}]}]], "Input"], Cell[TextData[{ "Between the parentheses are two ", StyleBox["Mathematica", FontSlant->"Italic"], " functions separated by a semicolon. The output of the function is the \ output of the last function only. The output of ", StyleBox["s=(a+b+c)/2", "Input"], " is suppressed because of the following semicolon." }], "Text"], Cell[BoxData[ RowBox[{"area", "[", RowBox[{"3", ",", "4", ",", "5"}], "]"}]], "Input"], Cell[BoxData[ RowBox[{"area", "[", RowBox[{"1", ",", "1", ",", "1"}], "]"}]], "Input"] }, Open ]], Cell[CellGroupData[{ Cell["Do, While, For", "Subsection"], Cell[TextData[{ "In programming, it is essential to have looping commands that can do a \ series of commands repeatedly. In ", StyleBox["Mathematica,", FontSlant->"Italic"], StyleBox[" the most useful of these are the ", FontVariations->{"CompatibilityType"->0}], StyleBox["Do", "Input", FontWeight->"Bold", FontVariations->{"CompatibilityType"->0}], StyleBox[", ", FontVariations->{"CompatibilityType"->0}], StyleBox["While", "Input", FontWeight->"Bold", FontVariations->{"CompatibilityType"->0}], StyleBox[" and ", FontVariations->{"CompatibilityType"->0}], StyleBox["For", "Input", FontWeight->"Bold", FontVariations->{"CompatibilityType"->0}], StyleBox[" commands.\n\nThe syntax of the ", FontVariations->{"CompatibilityType"->0}], StyleBox["Do", "Input", FontWeight->"Bold", FontVariations->{"CompatibilityType"->0}], StyleBox[" command is almost the same as the ", FontVariations->{"CompatibilityType"->0}], StyleBox["Table", "Input", FontWeight->"Bold", FontVariations->{"CompatibilityType"->0}], StyleBox[" command, except that no table is generated. ", FontVariations->{"CompatibilityType"->0}] }], "Text"], Cell[BoxData[ RowBox[{"?", "Do"}]], "Input"], Cell[TextData[{ StyleBox["Here's another way of adding the numbers ", FontVariations->{"CompatibilityType"->0}], StyleBox["1", "Input", FontVariations->{"CompatibilityType"->0}], StyleBox[" to ", FontVariations->{"CompatibilityType"->0}], StyleBox["100", "Input", FontVariations->{"CompatibilityType"->0}], StyleBox[":", FontVariations->{"CompatibilityType"->0}] }], "Text"], Cell[BoxData[{ RowBox[{ RowBox[{"tot", "=", "0"}], ";"}], "\[IndentingNewLine]", RowBox[{"Do", "[", RowBox[{ RowBox[{"tot", "=", RowBox[{"tot", "+", "i"}]}], ",", RowBox[{"{", RowBox[{"i", ",", "1", ",", "100"}], "}"}]}], "]"}], "\[IndentingNewLine]", "tot"}], "Input"], Cell[TextData[{ "Notice that the ", StyleBox["Do", "Input", FontWeight->"Bold"], " command does not produce any output itself, but it has changed the value \ of ", StyleBox["tot", "Input", FontWeight->"Bold"], StyleBox[" ", FontWeight->"Bold"], StyleBox["100 times.\n\nIt is perfectly possible to put more than one \ command inside the ", FontVariations->{"CompatibilityType"->0}], StyleBox["Do", "Input", FontWeight->"Bold", FontVariations->{"CompatibilityType"->0}], StyleBox[", so long as the commands are seperated by semicolons:", FontVariations->{"CompatibilityType"->0}] }], "Text"], Cell[BoxData[{ RowBox[{ RowBox[{"tot", "=", "0"}], ";", RowBox[{"pro", "=", "1"}], ";"}], "\[IndentingNewLine]", RowBox[{"Do", "[", RowBox[{ RowBox[{ RowBox[{"tot", "=", RowBox[{"tot", "+", "i"}]}], ";", RowBox[{"pro", "=", RowBox[{"pro", "*", "i"}]}]}], ",", RowBox[{"{", RowBox[{"i", ",", "1", ",", "100"}], "}"}]}], "]"}], "\[IndentingNewLine]", "tot", "\[IndentingNewLine]", "pro"}], "Input"], Cell[TextData[{ "The command ", StyleBox["While", "Input", FontWeight->"Bold"], " executes a command repeatedly until a test fails. " }], "Text"], Cell[BoxData[ RowBox[{"?", "While"}]], "Input"], Cell[TextData[{ "For example, the following sums up the positive integers until ", StyleBox["10000", "Input"], " is reached. " }], "Text"], Cell[BoxData[{ RowBox[{ RowBox[{"tot", "=", "0"}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"i", "=", "0"}], ";"}], "\[IndentingNewLine]", RowBox[{"While", "[", RowBox[{ RowBox[{"tot", "<", "10000"}], ",", " ", RowBox[{ RowBox[{"tot", "=", RowBox[{"tot", "+", "i"}]}], ";", RowBox[{"i", "=", RowBox[{"i", "+", "1"}]}]}]}], "]"}], "\[IndentingNewLine]", "i", "\[IndentingNewLine]", "tot"}], "Input"], Cell[TextData[{ "The ", StyleBox["While", "Input", FontWeight->"Bold"], " command executes the commands ", StyleBox["tot=tot+i; i=i+1", "Input", FontWeight->"Bold"], " until the test ", StyleBox["tot<10000", "Input", FontWeight->"Bold"], " fails. \n\nAnother way of incrementing ", StyleBox["i", "Input", FontWeight->"Bold"], " is with the command ", StyleBox["i++", "Input", FontWeight->"Bold"], ". This simply adds ", StyleBox["1", "Input"], " to ", StyleBox["i", "Input"], " every time it is executed. There is also an ", StyleBox["AddTo", "Input"], " command, written ", StyleBox["+=", "Input"], ", that can be used to abbreviate ", StyleBox["tot=tot+i", "Input", FontWeight->"Bold"], StyleBox[" ", FontWeight->"Bold"], " as ", StyleBox["tot+=i", "Input", FontWeight->"Bold"], ". With these simplications, our example becomes." }], "Text"], Cell[BoxData[{ RowBox[{ RowBox[{"tot", "=", "0"}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"i", "=", "0"}], ";"}], "\[IndentingNewLine]", RowBox[{"While", "[", RowBox[{ RowBox[{"tot", "<", "10000"}], ",", " ", RowBox[{ RowBox[{"tot", "+=", "i"}], ";", RowBox[{"i", "++"}]}]}], "]"}], "\[IndentingNewLine]", "i", "\[IndentingNewLine]", "tot"}], "Input"], Cell[TextData[{ "Here is a function that calulates limits in a simple minded way. It simply \ calculates ", StyleBox["f[1], f[2],...", "Input"], " until the difference between two consectutive terms is less that variable \ ", StyleBox["tol", "Input"], " (tolerance)." }], "Text"], Cell[BoxData[ RowBox[{ RowBox[{"lim", "[", RowBox[{"f_", ",", "tol_"}], "]"}], ":=", RowBox[{"(", RowBox[{ RowBox[{"n", "=", "1"}], ";", RowBox[{"While", "[", RowBox[{ RowBox[{ RowBox[{"Abs", "[", RowBox[{ RowBox[{"f", "[", RowBox[{"n", "+", "1"}], "]"}], "-", RowBox[{"f", "[", "n", "]"}]}], "]"}], ">", "tol"}], ",", RowBox[{"n", "++"}]}], "]"}], ";", RowBox[{"f", "[", "n", "]"}]}], ")"}]}]], "Input"], Cell[BoxData[ RowBox[{ RowBox[{"f", "[", "n_", "]"}], ":=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"1", "+", RowBox[{"1", "/", "n"}]}], ")"}], "^", "n"}], "//", "N"}]}]], "Input"], Cell[BoxData[ RowBox[{"lim", "[", RowBox[{"f", ",", ".0001"}], "]"}]], "Input"], Cell[TextData[{ "Of course, the built-in ", StyleBox["Limit", "Input"], " function does a much better job." }], "Text"], Cell[BoxData[{ RowBox[{"Clear", "[", "n", "]"}], "\[IndentingNewLine]", RowBox[{"Limit", "[", RowBox[{ RowBox[{"f", "[", "n", "]"}], ",", RowBox[{"n", "\[Rule]", "Infinity"}]}], "]"}]}], "Input"], Cell[TextData[{ " The ", StyleBox["For", "Input", FontWeight->"Bold"], " command is more general than the other two commands: " }], "Text"], Cell[BoxData[ RowBox[{"?", "For"}]], "Input"], Cell[TextData[{ "Hence the example just done with the ", StyleBox["While", "Input", FontWeight->"Bold"], " command can be written using a single ", StyleBox["For", "Input", FontWeight->"Bold"], " comand:" }], "Text"], Cell[BoxData[{ RowBox[{"For", "[", RowBox[{ RowBox[{ RowBox[{"tot", "=", "0"}], ";", RowBox[{"i", "=", "0"}]}], ",", RowBox[{"tot", "<", "10000"}], ",", RowBox[{"i", "++"}], ",", " ", RowBox[{"tot", "+=", "i"}]}], "]"}], "\[IndentingNewLine]", "i", "\[IndentingNewLine]", "tot"}], "Input"] }, Open ]], Cell[CellGroupData[{ Cell["Example", "Subsection"], Cell["\<\ Here is a function that simulates calculates the sum of two random dice \ throws: \ \>", "Text"], Cell[BoxData[ RowBox[{ RowBox[{"dice", "[", "]"}], ":=", RowBox[{ RowBox[{"RandomInteger", "[", RowBox[{"{", RowBox[{"1", ",", "6"}], "}"}], "]"}], "+", RowBox[{"RandomInteger", "[", RowBox[{"{", RowBox[{"1", ",", "6"}], "}"}], "]"}]}]}]], "Input"], Cell[BoxData[ RowBox[{"dice", "[", "]"}]], "Input"], Cell["Here is a table containing 1000 such throws:", "Text"], Cell[BoxData[ RowBox[{ RowBox[{"L", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"dice", "[", "]"}], ",", RowBox[{"{", "1000", "}"}]}], "]"}]}], ";"}]], "Input"], Cell[TextData[{ "Now we want to count how many times ", StyleBox["2", "Input"], " occured, how many times ", StyleBox["3", "Input"], " occured, etc. To do this we initialize a list of counts to zeros, then go \ through the list ", StyleBox["L", "Input"], " incrementing the appropriate counter. " }], "Text"], Cell[BoxData[{ RowBox[{ RowBox[{"cnt", "=", RowBox[{"Table", "[", RowBox[{"0", ",", RowBox[{"{", "12", "}"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"Do", "[", RowBox[{ RowBox[{ RowBox[{"cnt", "[", RowBox[{"[", RowBox[{"L", "[", RowBox[{"[", "i", "]"}], "]"}], "]"}], "]"}], "++"}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"Length", "[", "L", "]"}]}], "}"}]}], "]"}]}], "Input"], Cell[TextData[{ "Notice that the ", StyleBox["Do", "Input"], " command produces no output -it just modifies the list of counters ", StyleBox["cnt", "Input"], ". To see the result we need to evaluate ", StyleBox["cnt", "Input"], "." }], "Text"], Cell[BoxData["cnt"], "Input"] }, Open ]], Cell[CellGroupData[{ Cell["Practice", "Subsection"], Cell[TextData[{ "Let ", StyleBox["L", "Input"], " be a list of integers between ", StyleBox["1", "Input"], " and ", StyleBox["10", "Input"], ". Write a function ", StyleBox["count[L_]", "Input"], " that produces a list of length ", StyleBox["10", "Input"], " whose ", StyleBox["n", "Input"], "th entry is the number of occurances of ", StyleBox["n", "Input"], " in the list ", StyleBox["L", "Input"], "." }], "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Practice", "Subsection"], Cell[TextData[{ "Use the ", StyleBox["While", "Input", FontWeight->"Bold"], " or ", StyleBox["For", "Input", FontWeight->"Bold"], " command to re-do an exercise from Assignment 4 - Find the ", StyleBox["smallest", FontVariations->{"Underline"->True}], " positive integer whose factorial is greater than ", Cell[BoxData[ FormBox[ StyleBox[ RowBox[{"6.023", "\[Times]", SuperscriptBox["10", "23"]}], "Input"], TraditionalForm]]], "." }], "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Homework", "Subsection"], Cell[TextData[{ "1) Write a simple function ", StyleBox["nextprime[n_]", "Input"], " that finds the first prime number that is greater than ", StyleBox["n", "Input"], ". You could use the function ", StyleBox["Prime[k]", "Input"], "that gives the ", StyleBox["k", "Input"], "th prime number. (There is a built-in ", StyleBox["Mathematica", FontSlant->"Italic"], " command ", StyleBox["NextPrime[n_]", "Input"], " that does the same thing.)" }], "Text"], Cell[TextData[{ "2) Let ", StyleBox["L", "Input"], " be a list of random points in the plane. Write a function ", StyleBox["circnt[L_]", "Input"], " that counts how many of these points are less than one unit away from the \ origin. Hint: ", StyleBox["RandomReal[{-1, 1}, {100, 2}]", "Input"], " will generate a list of 100 random points whose x- and y-coordinates are \ between -1 and 1." }], "Text"] }, Open ]] }, Open ]] }, WindowSize->{640, 750}, WindowMargins->{{106, Automatic}, {Automatic, 0}}, ShowSelection->True, FrontEndVersion->"6.0 for Mac OS X PowerPC (32-bit) (April 20, 2007)", StyleDefinitions->"Default.nb" ] (* End of Notebook Content *) (* Internal cache information *) (*CellTagsOutline CellTagsIndex->{} *) (*CellTagsIndex CellTagsIndex->{} *) (*NotebookFileOutline Notebook[{ Cell[CellGroupData[{ Cell[590, 23, 48, 0, 67, "Section"], Cell[641, 25, 147, 3, 41, "Text"], Cell[CellGroupData[{ Cell[813, 32, 24, 0, 34, "Subsection"], Cell[840, 34, 162, 5, 26, "Text"], Cell[1005, 41, 45, 1, 27, "Input"], Cell[1053, 44, 899, 30, 68, "Text"], Cell[1955, 76, 305, 9, 27, "Input"], Cell[2263, 87, 111, 2, 43, "Input"], Cell[2377, 91, 195, 6, 27, "Input"], Cell[2575, 99, 191, 5, 26, "Text"], Cell[2769, 106, 450, 14, 27, "Input"], Cell[3222, 122, 213, 6, 27, "Input"], Cell[3438, 130, 211, 4, 41, "Text"], Cell[3652, 136, 318, 10, 27, "Input"], Cell[3973, 148, 60, 1, 27, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[4070, 154, 57, 0, 34, "Subsection"], Cell[4130, 156, 398, 11, 56, "Text"], Cell[4531, 169, 246, 9, 32, "Input"], Cell[4780, 180, 226, 7, 41, "Text"], Cell[5009, 189, 510, 17, 27, "Input"], Cell[5522, 208, 328, 8, 56, "Text"], Cell[5853, 218, 90, 2, 27, "Input"], Cell[5946, 222, 90, 2, 27, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[6073, 229, 36, 0, 34, "Subsection"], Cell[6112, 231, 1162, 32, 71, "Text"], Cell[7277, 265, 45, 1, 27, "Input"], Cell[7325, 268, 389, 11, 26, "Text"], Cell[7717, 281, 297, 9, 58, "Input"], Cell[8017, 292, 611, 18, 86, "Text"], Cell[8631, 312, 443, 13, 73, "Input"], Cell[9077, 327, 151, 5, 26, "Text"], Cell[9231, 334, 48, 1, 27, "Input"], Cell[9282, 337, 141, 4, 26, "Text"], Cell[9426, 343, 447, 13, 88, "Input"], Cell[9876, 358, 885, 33, 86, "Text"], Cell[10764, 393, 390, 11, 88, "Input"], Cell[11157, 406, 285, 8, 41, "Text"], Cell[11445, 416, 497, 16, 27, "Input"], Cell[11945, 434, 205, 7, 27, "Input"], Cell[12153, 443, 83, 2, 27, "Input"], Cell[12239, 447, 122, 4, 26, "Text"], Cell[12364, 453, 208, 5, 43, "Input"], Cell[12575, 460, 144, 5, 26, "Text"], Cell[12722, 467, 46, 1, 27, "Input"], Cell[12771, 470, 225, 8, 26, "Text"], Cell[12999, 480, 320, 9, 58, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[13356, 494, 29, 0, 34, "Subsection"], Cell[13388, 496, 106, 3, 26, "Text"], Cell[13497, 501, 283, 9, 27, "Input"], Cell[13783, 512, 52, 1, 27, "Input"], Cell[13838, 515, 60, 0, 26, "Text"], Cell[13901, 517, 183, 6, 27, "Input"], Cell[14087, 525, 315, 9, 41, "Text"], Cell[14405, 536, 458, 15, 43, "Input"], Cell[14866, 553, 250, 8, 41, "Text"], Cell[15119, 563, 29, 0, 27, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[15185, 568, 30, 0, 34, "Subsection"], Cell[15218, 570, 433, 18, 41, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[15688, 593, 30, 0, 34, "Subsection"], Cell[15721, 595, 473, 17, 45, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[16231, 617, 30, 0, 34, "Subsection"], Cell[16264, 619, 467, 15, 56, "Text"], Cell[16734, 636, 409, 10, 56, "Text"] }, Open ]] }, Open ]] } ] *) (* End of internal cache information *)