REDUCE

12.5 Details on the Break Loop

If the switch break is t, the function break is called by error or continuableerror before unwinding the stacks, or printing a backtrace. Input and output to/from break loops is done from/to the values (channels) of breakin⋆ and breakout⋆. The channels selected on entrance to the break loop are restored upon exit.

breakin* = [Initially: nil] global
   
So rds chooses stdin*.

breakout* = [Initially: nil] global
   
Similar to breakin*.

Break is essentially a read-eval-print function, called in the error context. Any fluid may be printed or changed, function definitions changed, etc. The break uses the normal toploop mechanism (including history), embedded in a catch with tag break. The toploop attempts to use the parent loop’s toploopread*, toploopprint* and toploopeval*; the breakeval function first checks top-level ids to see if they have a special breakfunction on their property lists, stored under breakfunction. This is expected to be a function of no arguments, and is applied instead of eval.