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