How to control the evaluation queue
- To: mathgroup at smc.vnet.net
- Subject: [mg8078] How to control the evaluation queue
- From: dreissNOSPAM at nospam.earthlink.net (David Reiss)
- Date: Tue, 5 Aug 1997 03:22:43 -0400
- Organization: EarthLink Network, Inc.
- Sender: owner-wri-mathgroup at wolfram.com
For Mathematica 3.0. Assume that there is an open notebook, (call it notebook1.nb) and a closed notebook (call it test.nb). Assume that notebook1.nb has two evaluable cells, cellA and cellB. Assume that test.nb is a notebook on disk (and on the search path -- otherwise use its full pathname) that has a sequence of evaluable cells. For this discussion assume that test.nb is not open and its two evaluable cells are called cell1 and cell2, Normally if a user has a number of evaluable cells in an open notebook or in multiple open notebooks, the user can select and execute cells one at a time, in whatever order he or she chooses. The Kernel will then evaluate those cells in the order that they were executed (and if several cells are chosen at one time in a notebook, and the user evaluates them, they are executed by the kernel in the order that they appear in the given notebook). Below are two functions, executeNotebook1 and executeNotebook2. The purpose of these functions (they are different versions yielding the same effective functionality: executeNotebook1 uses a While statement, whereas executeNotebook2 uses FrontEndExecute) is to open a notebook (they first check to see if they have previously opened the notebook in question) and execute all of the cells in that notebook in the sequence that they appear. NotebookClose can then be used to close the notebook. My question concerns the evaluation queue and how to gain control over it from the front end when using notebook manipulation commands. For example if one has executeNotebook1["test.nb"]; in cellA of notebook1.nb and NotebookClose[openNotebook1]; in the next cell, cellB. Select cellA and cellB together and evaluate them. Then cellA is first in the evaluation queue and cellB is second. The command executeNotebook2["test.nb"] then puts the cells of test.nb sequentially into the evaluation queue following cellB. So the evaluation queue looks like: cellA cellB cell1 cell2 This is actually consistent with the usual expectations for "manual" cell evaluation. But in this case the NotebookClose[openNotebook1] command in cellB will execute before the commands in cell1 and cell2: test.nb will be closed and cell1 and cell2 will be removed from the evaluation queue and will not be executed. But, what I want is to be able to select all of the cells in notebook1.nb, evaluate them, and have the evaluation queue look like: cellA cell1 cell2 cellB I want to do this independent of the NotebookClose[openNotebook1] example for cellB above (i.e., cellB could have a command different from NotebookClose[openNotebook1]. Any thoughts on this would be helpful. ---Thanks (* ********************************************** *) Unprotect[openNotebook1,openNotebook2]; Clear[executeNotebook1,executeNotebook2,openNotebook1,openNotebook2]; openNotebook1::usage = "openNotebook1 is a protected variable used by executeNotebook1."; openNotebook2::usage = "openNotebook2 is a protected variable used by executeNotebook2."; executeNotebook1::usage = "executeNotebook1[\"file\"] opens the notebook given by \"file\" and then executes each cell in turn, (thus acting as if each of the cells in the notebook were each selected and executed one at a time). The notebook object is called \"openNotebook1\" and the notebook can be closed by executing \n\n NotebookClose[openNotebook1]; \n\n Because executeNotebook1 makes use of \"openNotebook1\", it is restricted to use on a single file at a time."; executeNotebook2::usage = "executeNotebook2[\"file\"] works like executeNotebook1 but uses \n FrontEndExecute[FrontEndToken[\"EvaluateNotebook\"] \n rather than a While, thus acting as if all of the cells were selected and then evaluated. The opened notebook can be closed by executing \n\n NotebookClose[openNotebook1]; \n "; executeNotebook1[file_String] := Module[{tem = 1}, Unprotect[openNotebook1]; If[MemberQ[Notebooks[], openNotebook1], NotebookClose[openNotebook1] ]; openNotebook1 = NotebookOpen[file, Visible -> True]; SelectionMove[openNotebook1, Next, Cell]; While[tem =!= {}, SelectionEvaluate[openNotebook1]; SelectionMove[openNotebook1, Next, Cell]; tem = NotebookRead[openNotebook1]]; Protect[openNotebook1] ]; executeNotebook2[file_String] := Module[{}, Unprotect[openNotebook2]; If[MemberQ[Notebooks[], openNotebook2], NotebookClose[openNotebook2] ]; openNotebook2 = NotebookOpen[file, Visible -> True]; FrontEndExecute[FrontEndToken["EvaluateNotebook"]]; Protect[openNotebook2] ]; -- David Reiss dreissNOSPAM at nospam.earthlink.net http://home.earthlink.net/~dreiss To send personal email, remove the words "nospam" and "NOSPAM" from the email address