Re: Stopping a program
- To: mathgroup at smc.vnet.net
- Subject: [mg93304] Re: Stopping a program
- From: David Bailey <dave at Remove_Thisdbailey.co.uk>
- Date: Mon, 3 Nov 2008 05:27:32 -0500 (EST)
- References: <gebm16$eq$1@smc.vnet.net>
carlos at colorado.edu wrote:
> This is a revision of a previous posting "Looking for Stop".
> Unfortunately the answers were not helpful. My fault: I didnt
> explain what I am looking for in specific terms. So here it is.
>
> Several application programs in Mathematica that I use in
> graduate courses are translations from old (1960-80s) Fortran and C
> programs. A medium-size Fortran program with, say, 10^6 statements
> contracts to about 40-100K Mathematica commands, and similarly in
> other high order languages. The reduction comes mostly from
> use of built-in functions. However, the overall hierarchical
> structure
> does not change much, e.g. the "main program" becomes a
> "Driver Script Cell" (DSC) and functions/routines become Modules.
> The typical structure is
>
> DSC:
> Preprocessing Modules (written by students)
> Processing Modules (supplied)
> Postprocessing Modules (supplied)
>
> There are typically 50-200 supplied modules, forming trees 3-6
> levels deep, depending on application. Programs are run
> interactively by students doing homework or take-home exams.
> They write the problem-dependent preprocessing part of the DSC,
> save the NB, initialize the supplied modules (which are in
> untouchable initialization cells) and execute the DSC.
>
> Now suppose an irrecoverable error is detected in a Module four levels
> deep. In Fortran or C, I give diagnostics and call a central error
> termination routine that also displays the "call trace" kept in a
> stack.
> In Mathematica I can only say Exit[], which is a bit drastic.
>
> What I was looking for is a way to transfer to the end of the DSC
> as if the program had terminated normally. The student looks at
> the error message, fixes the preprocessing part as needed, and
> tries again. As mentioned in the OP, I thought to put a Label:
> at the end of the DSC but AFAIK Mathematica does not allow
> forward control transfers. Specific suggestions are welcome.
>
The crucial change that you need to make is to create one or more
functions containing the various steps of your program. At its very
simplest this might look like:
myfunc[]:=Module[{},
step1;
step2;
If[x>y,Abort[]]; (* Conditionally abort the program - step3 will not be
executed *)
step3;
];
where the steps are whole Mathematica expressions.
The last cell in your notebook should start the whole thing running:
myfunc[];
If you structure things in this way, Abort[] will work as advertised,
and you can even trap the abort at a higher level using CheckAbort.
David Bailey
http://www.dbaileyconsultancy.co.uk