#
Chapter 37
`restart.ss`: Simulating Stand-alone MzScheme

To load: `(require (lib "restart.ss"))`

`(restart-mzscheme``` `init-argv adjust-flag-table argv init-namespace``)` PROCEDURE

Simulates starting the stand-alone version of MzScheme with the vector of command-line strings `argv`. The `init-argv`, `adjust-flag-table`, and `init-namespace` arguments are used to modify the default settings for command-line flags, adjust the parsing of command-line flags, and customize the initial namespace, respectively.

The vector of strings `init-argv` is read first with the standard MzScheme command-line parsing. Flags that load files or evaluate expressions (e.g., `-f` and `-e`) are ignored, but flags that set MzScheme's modes (e.g., `-g` or `-m`) effectively set the default mode before `argv` is parsed.

Before `argv` is parsed, the procedure `adjust-flag-table` is called with a command-line flag table as accepted by `parse-command-line` (see section 9). The return value must also be a table of command-line flags, and this table is used to parse `argv`. The intent is to allow `adjust-flag-table` to add or remove flags from the standard set.

After `argv` is parsed, a new thread and a namespace are created for the ``restarted'' MzScheme. (The new namespace is installed as the current namespace in the new thread.) In the new thread, restarting performs the following actions:

- The `init-namespace` procedure is called with no arguments. The return value is ignored.

- Expressions and files specified by `argv` are evaluated and loaded. If an error occurs, the remaining expressions and files are ignored, and the return value for `restart-mzscheme` is set to `#f`.

- The `read-eval-print-loop` procedure is called, unless a flag in `init-argv` or `argv` disables it. When `read-eval-print-loop` returns, the return value for `restart-mzscheme` is set to `#t`.

Before evaluating command-line arguments, an exit handler is installed that immediately returns from `restart-mzscheme` with the value supplied to the handler. This exit handler remains in effect when `read-eval-print-loop` is called (unless a command-line argument changes it). If `restart-mzscheme` returns normally, the return value is determined as described above. (Note that an error in a command-line expression followed by `read-eval-print-loop` produces a `#t` result. This is consistent with MzScheme's stand-alone behavior.)