M[UMPS] Commands

Q[UIT]

Introduced in the 1977 ANSI M[UMPS] language standard.

 WRITE 1 DO SUB WRITE 2
 ...
SUB ;
 ; ... check processing conditions
 IF PROBLEMS QUIT
 ; ... process data
 QUIT

In this example, the value 1 is written, then the subroutine is invoked. The subroutine starts out checking whether all conditions are met that are needed for it to function properly. If not all conditions are met, the first QUIT command is executed, and control reverts back to the calling program, i.e. the command WRITE 2 is executed.
Otherwise, the rest of the subroutine is executed, and the final QUIT command is processed eventually, after which control reverts to the calling routine and the command WRITE 2 is executed.

SET S="" FOR  SET X=$ORDER(DATA(S)) QUIT:S=""  DO
. ; process one occurrence of DATA(S)
. QUIT

In this example, the second QUIT command is very much like the QUIT commands in the previous example, but the first QUIT command, the one on the same line as the FOR command, is used to terminate a loop that would otherwise continue forever.

Addition in the 1990 ANSI M[UMPS] language standard.
 SET X=$$ADD(13,45)
 ...
 QUIT
 ;
ADD(P,Q) QUIT P+Q

In the case of an extrinsic function call, the value to be returned to the calling program is specified as the argument of the QUIT command that returns control back to that calling program.

 ;...
 SET X=$$A()
 QUIT
A() FOR  QUIT 1
 QUIT 2

This example will yield an error (M16) when the command QUIT 1 is encountered in the context of the FOR loop.

 ;...
 SET SPECIES="Fowl",GENDER="F"
 WRITE $$SUB(SPECIES,GENDER)
 QUIT
 ;
SUB(SP,GN) IF SP="Fowl" DO
 . IF GN="F" QUIT "Hen"
 . ELSE  QUIT "Cock"
 ELSE  QUIT "Don't know"

This example will cause an error (M16) at the command QUIT "Hen".
The indented block is not called as an extrinsic function, and hence cannot return a value.

 SET INCOME=250000,DEPENDENTS=3 DO TAX
 QUIT
 ;
TAX SET TAX=0 DO
 . IF INCOME>5000 DO
 . . IF DEPENDENTS>0 QUIT
 . . SET TAX=(INCOME-5000)*0.05
 . IF INCOME>50000 DO
 . . IF DEPENDENTS>2 QUIT
 . . SET TAX=TAX+(INCOME-50000)*0.1
 . IF INCOME>200000 DO
 . . IF DEPENDENTS>4 QUIT
 . . SET TAX=TAX+(INCOME-200000)*0.2
 WRITE "TAX=",TAX
 QUIT

Because the number of dependents is 3 (more than 0 or 2), the first two blocks (INCOME>5000 and INCOME>50000) have no effect. The third block adds (250000-200000*.02)=10000 to TAX (which still is 0), so that the amount written will be 10000.
The QUIT commands in the indented blocks with two dots at the start of the line only terminate the 'two dot' level, and return control to the 'one dot' level.

Addition in the 1995 ANSI M[UMPS] language standard.

Argument indirection is allowed to return a value from a function:
QUIT @ARGUMENT

FOR K=1:1:100 QUIT:condition VALUE DO something
An occurrence of a QUIT command with an argument in the scope of a FOR command will cause an error (M16).

Examples with naked references:

QUIT VALUE
SET ^ABC(1,2)="reset naked indicator"
; Naked indicator is now ^ABC(1,
QUIT ^(3,4)

; Naked indicator is now: ^ABC(1,3,
; Actual reference is: ^ABC(1,3,4)


This document is © Ed de Moel, 1995-2005.
It is part of a book by Ed de Moel that is published under the title "M[UMPS] by Example" (ISBN 0-918118-42-5).
Printed copies of the book are no longer available.

This document describes the various commands that are defined in the M[UMPS] language standard (ANSI X11.1, ISO 11756).

The information in this document is NOT authoritative and subject to be modified at any moment.
Please consult the appropriate (draft) language standard for an authoritative definition.

In this document, information is included that will appear in future standards.
The MDC cannot guarantee that these 'next' standards will indeed appear.