M-FAQ HTML version prepared by Dan Baer
Archive-name: m-technology-faq/part1 Last-modified: 1997/08/01 Version: 1.6 Posting-Frequency: monthly M Technology and MUMPS Language FAQ
This FAQ is copyright ©1997 by Gardner S. Trask III. All rights reserved. Permission is granted for this FAQ to be redistributed provided:
Post comments or suggestions to comp.lang.mumps or email to trask@world.std.com .
Editors
Appendix 1: List of M Vendors
Appendix 2: The M Technology Association
Appendix 3. USA Local M Users Groups
Appendix 4: Is the official name of the language
"M" or "MUMPS?"
Appendix 5: A "secret decoder ring:" highlights
of the M language
Appendix 6: An example of "textbook" M coding
style
Appendix 7: An example of "traditional" M coding
style
Appendix 8: Mumps, A Solution Looking For A Problem
By Chris Richardson
Appendix 9: Tributes, Accolades and Honorable Mentions
outside the M Community
Appendix 10: Contact information: e-mail and URL's
Appendix 11: FAQ Change history
[1/08/95] InterSystems has acquired Digital's DSM product line. Digital Equipment Corporation was formerly listed first (alphabetically) in this section. According to material published by InterSystems corporation on 1/2/95, specifically the files dsmpr.txt, dsmqam.txt, and dsmlet.txt in their public FTP area, "Digital Equipment Corporation and InterSystems have formed a strategic partnership to expand the worldwide use of M Technology, particularly in the enterprise client/server arena. Simultaneously, InterSystems has acquired the DSM software product line, Digital's implementation of M." "DSM will be marketed and sold by InterSystems' world-wide network of direct sales staff and distributors. In addition, Digital will continue to sell DSM in Japan and to certain customers under existing multi-year contracts." dsmqam.txt lists the following contacts for more information:
InterSystems Corporation
One Memorial Drive Cambridge, MA 02142 USA
Telephone: 617-621-0600 Fax: 617-494-1631
Paul Schaut
Internet: schaut@intersys.com
Contact: Maureen Flaherty
Also: Offices in UK, Germany
Micronetics Design
Corporation
1375 Piccard Drive Rockville, MD 20850, USA
Phone: +1 301-258-2605 Fax: +1 301-840-8943
Contact: Bob Mappes, Dave Lenhart
Also: Offices in UK, Germany, Switzerland
Extensao Informatica e Tecnologia
Rua da Gloria 290/10 andar 20241 Rio de Janeiro RJ, Brazil
Phone: +55-21-224-9321 Fax: +55-21-224-6044
Contact: Luiz Carlos Lobo Filho
Greystone Technology Corporation
100 Unicorn Park Drave Woburn, MA 01801-6707, USA
Phone: +1 617-637-9000 Fax: +1 617-937-9022
Contact: Chris Neikam
Digital Equipment Corporation
151 Taylor Street TAY1-1/B6 Littleton, MA 01460-1407 USA
Telephone: 508-952-4119
Gerry Sunderland
International Business Machines
1701 North St. Mail Drop G98G Bldg 017 Endicott, NY 13760, USA
Phone: +1 607-752-5179
Contact: Frank Samuel Also: Offices in most countries
MGlobal International, Inc.
P.O. Box 459 Orange, TX 77631
Phone: +1 409-883-8537 Fax: +1 409-883-3721
Contact: David Brown
MUMPS Systems Laboratory
39-15 Daikan-cho Higashi-ku, Nagoya, Japan
Phone: +81-52-936-5660 Fax: +81-52-935-5435
Contact: Ichiro Wakai, M.D
Patterson, Gray and Associates
1701 E. Woodfield Road Suite 850 Schaumburg, IL 60173, USA
Phone: +1 708-619-7500 Fax: +1 708-619-7530
Contact: Jeffrey Shirk
PFCS Corporation
Post Office Box 1806 Manchester, MO 63011-8806, USA
Phone: +1 314-230-8847 Fax: +1 314-230-9897
Contact: Harlan Stenn
VISO-DATA Computer
AG Rainergasse 1 A-1040 Vienna, Austria
Phone: +43-1-5055734 Fax: +43-1-5055734-34
Contact: Sandy R. Schorr
For current pricing information, please contact the relevant group.
Membership for almost all MTAs includes:
MTA-North America also provides
Other MTAs provide additional services. For example M Professional (technical journal from MTA-Europe).
M Technology Association
1738 Elton Road, Suite 205
Silver Spring, MD USA 20903-1725
Phone: +1 301-431-4070 Phone: +1 322 772 9247
Fax: +1 301-431-0017 Fax +1 322 772 7237
MTA-Europe: Association Headquarters
83 Avenue Mounier B-1200 Brussels, Belgium
There are also MTAs in Belgium, Brazil, Bulgaria, China, Czech/Slovak Republics, Finland, France, Germany, Great Britain, Ireland, Israel, Italy, Japan, Netherlands, Russia, Spain, Switzerland. Please contact either of the above addresses for current information.
You can get a list of MTA's around the World at the MTRC website.
A current list of M User Groups in the US can be found at the MUMPS of Georgia website.
If you need to add or change your User Group info, please fill out the form or email mga@mindspring.com
This is the M community's very own little religious war. Not everyone prefers the name M. Many feel strongly about the issue. Ed de Moel says that "within the M[UMPS] community, there is a strong sentiment that MUMPS is not the right name for the language; there is an (equally?) strong sentiment that MUMPS is a better name than any of the proposed alternatives." All of the following opinions can and have been supported:
The following samples show the diversity of opinions. I have given Ed de Moel, a member of the MUMPS Development Committee, the last word. (However, it is possible to find other views within the MDC membership). [DPBS]
I'm curious as to how long it will take "M" to fully replace "MUMPS". I was disappointed that [comp.lang.mumps] wasn't created with that name. [Russell Haddleton, rfh2y@uvacs.cs.Virginia.EDU]
The name of the language is MUMPS. 'M Technology' is a marketing ploy that ignores the language; what it's called doesn't change what it IS. (The MDC has NOT changed the name of the language as far as I know -- they permitted M as an alternate name) [Ben Bishop, aci@world.std.com]
The name of the group should be comp.lang.m. I understand the issue of "grep'ing" on M prohibitive, but I can't see throwing out all the hard work of the MTA. M is the name. [Gardner Trask, trask@world.std.com]
DSM stands for Digital Standard M now. In recent advertising DataTree refers to their product as DataTree M. I thought the official name of the language was M too, but this is not the case. The primary name for the language is still MUMPS. The ANSI standard refers to the language as MUMPS with M as an alternate name. The M Technology Association decided to use M as the primary _reference_ to the language MUMPS. [Doug Preiser, preiser@cancer.unm.edu]
Can anyone think of something you can do in some other language that you can't do in MUMPS ? Well, let's try using 'M' instead of MUMPS for a start, before any XJ-11 people start flaming. [Richard Nason, rick@rnason.demon.co.uk]
M is a well-accepted nickname for a programming language called MUMPS. MUMPS, in turn, is an acronym that stands for Massachusetts (General Hospital) Utility Multi Programming System. MUMPS is a language that goes by many names. Since a number of years, there has been a strong movement to change the name of the language to something else than MUMPS, countered by an equally strong movement to keep the name as is was. The first official request to change the name of the language to "M" was in 1980, when Terry Ragon (now president of InterSystems) wrote a letter to the MUMPS Development Committee, requesting this change. At that moment in time, it was decided to keep the name MUMPS, but the movement to change the name did not disappear. Over the years, there has been a number of informal requests to change the name of the language, but, oddly, there never was a formal proposal to do this before the MUMPS Development Committee (the only body that can change the name of the language). The only thing that happened officially was that the nickname "M" became accepted as an alternate name. The language is still officially called MUMPS. Other official designations are ANSI X11.1 (1990) and ISO 11756 (1991). Several of the user's groups have adopted the nickname, and changed their name to reflect that adoption, so we now have a MTA (USA), MTA-Japan, MTA- Europe, but Germany uses MUG-Deutschland (M Users Group) and Soyuz-DIAMS in Russia. The most recent formal resolution that was passed by the MUMPS Development Committee regarding the name was to use the nickname throughout the document that is currently being circulated through the canvass process as the new draft ANSI standard. Evidently, this strongly promotes the use of the nickname over the 'real' name, but it still doesn't change the name of the language. Maybe one day, someone will submit a formal proposal to the MUMPS Development Committee, but until such a proposal is submitted and favourably voted upon, "M" will remain a (well accepted) nickname for MUMPS. [Ed de Moel, demoel@saltmine.radix.net]
This incomplete, informal sketch seeks to give programmers familiar with other languages a feeling for what M is like. It doesn't tell you enough to write M code; it may help you to read it. Neither the language description and the descriptions of each feature are complete, and many very significant features have been omitted for brevity.
COMMANDS:
may be abbreviated to one letter, case-insensitive.
OPERATORS:
No precedence, executed left to right, parenthesize as desired. 2+3*10 yields
50.
INTRINSIC (built-in) FUNCTIONS:
Important structural components of the language (not commonly found in other
languages):
Convenience functions similar to library functions in other languages:
[DPBS]
This is based on an example from a well-known M textbook, "The Complete MUMPS" by John Lewkowicz. It shows how M can support a "modern" appearance and coding style. See notes below for more detail.
1 zsample ;dpb;09:18 PM 6 Aug 1994
2
3 ;Test the Stats routine:
4 ;Calculate 1000 points w. approx. Gaussian distribution,
5 ;then call Stats on the result
6 ;Execution time: 5 seconds with DTM on a 33 MHz 386DX
7
8 New Data,i,j,output
9 For i=1:1:1000 Set Data(i)=$$Normal
10 Do Stats("Data",.output)
11 Write !,output
12 Quit
13
14 ;----------------------------------------
15 ;Based on Lewkowicz, "The Complete MUMPS," examples 9.15-9.17
16 ;Modified slightly:
17 ;Used argumentless Do instead of two If's for Num>1 block
18 ;Corrected calculation of the standard error
19 ;----------------------------------------
20
21 Stats(Ref,Results) ; Calculate simple Statistics on Array nodes
22 New High,i,Low,Mean,Num,StdDev,StdErr,s,Sum,SumSQ,Var
23 Set High=-1E25,Low=1E25,(Sum,SumSQ,Num)=0,s=""
24 For Set s=$O(@Ref@(s)) Q:s="" Do StatsV(@Ref@(s))
25 If 'Num Set Results="" Goto StatsX
26 Set Mean=Sum/Num
27 Set (StdDev,StdErr,Var)=""
28 If Num>1 Do
29 . Set Var=-Num*Mean*Mean+SumSQ/(Num-1)
30 . Set StdDev=$$SQroot(Var)
31 . Set StdErr=StdDev/$$SQroot(Num)
32 Set Results=Num_";"_Low_";"_High_";"_Mean
33 Set Results=Results_";"_Var_";"_StdDev_";"_StdErr
34 Goto StatsX
35 StatsV(Val) ;Process an individual value
36 Set Val=$$NumChk(Val) Quit:Val=""
37 Set Num=Num+1,Sum=Sum+Val,SumSQ=Val*Val+SumSQ
38 Set:Val"<"Low Low=Val Set:Val">"High High=Val
39 Quit
40 StatsX Quit
41
42 SQroot(Num) ;Return the SQUARE ROOT of abs(Num)
43 New prec,Root Set Root=0 Goto SQrootX:Num=0
44 Set:Num<0 Num=-Num Set Root=$S(Num>1:Num\1,1:1/Num)
45 Set Root=$E(Root,1,$L(Root)+1\2) Set:Num'>1 Root=1/Root
46 For prec=1:1:6 Set Root=Num/Root+Root*.5
47 SQrootX Quit Root
48
49 NumChk(Data,Range,Dec) ;Check for valid NUMBER
50 Set Data=$TR(Data,"+ $,")
51 Goto NumChkE:Data'?.E1N.E,NumChkE:Data'?."-".N.".".N
52 If $D(Dec),Dec?1N.N g NumChkE:$L($P(Data,".",2))>Dec
53 Set:'$D(Range) Range="" Set:Range="" Range="-1E25:1E25"
54 If $P(Range,":")'="" Goto NumChkE:Data<$P(Range,":")
55 If $P(Range,":",2)'="" Goto NumChkE:Data>$P(Range,":",2)
56 Set Data=+Data Goto NumChkX
57 NumChkE Set Data=""
58 NumChkX Quit Data
59 ;
60 ;----------------------------------------
61 ;
62 ;Part of demo/test code, Dan Smith, 8/26/94
63 Normal() ;Return random # with approximately Gaussian distribution
64 New i,x,n ;n=# iterations
65 Set x=0,n=3 ;Higher n = slower, better Gaussian approximation
66 ;$random(1201) has approx. mean=600, variance=120000
67 For i=1:1:n*n Set x=x+$random(1201)-600
68 Set x=x/(346.4101615*n) ;variance now 1
69 Quit x
[Lines 21-58 are from Examples 9.15, 9.17 and 9.18 of "The Complete MUMPS," by John Lewkowicz, ISBN 0-13-162141-6, 1989, Prentice-Hall, Englewood Cliff, New Jersey and are copyright 1989 by Prentice-Hall, Inc. Permission to use these examples has been solicited from Prentice-Hall, but no reply has been received. This Appendix may be modified or omitted in future versions if Prentice-Hall objects to its inclusion] .
Notes: Line 8: Command names: Command names in M are case-insensitive, and may either be spelled out in full or abbreviated to a single character. Thus, the NEW command could be written as "NEW" or "New" or "new" or "N" or "n". Lewkowicz consistently spells them out in full, with mixed case. NEW command: This is not a declaration, but an executable command. In M, this is the way you effectively make a variable private to a subroutine. On entry to zsample, the variables Data, i, j, and output may or may not have values. The New command stacks the old identity of these variables, which now become undefined. zsample may freely use the variables. On Quit-ing from the subroutine, any values the subroutine established for them are discarded and the old values restored. It is good practice to New the variables used for temporary storage within a subroutine, and some programmers do this systematically. Lewkowicz does it, and alphabetizes the order of the names in the New list to make maintenance easier.
Lines 8, 10, and 21: Passing an array reference as an argument. "Stats" is a subroutine which takes a parameter list. It is designed to work generally using any array, local or global, or array reference. The argument that is passed is a string; here, the string "Data", which names a local array. Within the subroutine, the "subscript indirection" mechanism is used; i.e. because Ref has been set equal to the string "Data", the expression @Ref@(s) refers to Data(s). If Ref were set to "^Permanent", the expression @Ref@(s) would refer to ^Permanent(s). Ref could also be set to an array subnode.
Line 28: An "argumentless DO." This structure causes the set of lines beginning with periods to be executed. Argumentless "DO's" can be nested. They stack and restore the value of $T. Using these tools it is possible to write nested "If-Else" structures that behave as expected.
If condition1 Do
. If condition2 Do
. . <code> ;executes if condition1 and 2 are both true
. . <code>
. . <code>
. Else Do
. . <code> ;executes if condition1 is true but not condition2
. . <code>
. . <code>
Else Do
. <code> ;executes if condition1 is false
. <code>
. <code>
%DTC
%DTC ; SF/XAK - DATE/TIME OPERATIONS ;1/16/92 11:36 AM
;;19.0;VA FileMan;;Jul 14, 1992
D I 'X1!'X2 S X="" Q
S X=X1 D H S X1=%H,X=X2,X2=%Y+1 D H S X=X1-%H,%Y=%Y+1&X2; K %H,X1,X2 Q
;
C S X=X1 Q:'X D H S %H=%H+X2 D YMD S:$P(X1,".",2) X=X_"."_$P(X1,".",2) K X1,X2 Q
S S %=%#60/100+(%#3600\60)/100+(%\3600)/100 Q
;
H I X<1410000 S %H=0,%Y=-1 Q
S %Y=$E(X,1,3),%M=$E(X,4,5),%D=$E(X,6,7)
S %T=$E(X_0,9,10)*60+$E(X_"000",11,12)*60+$E(X_"00000",13,14)
TOH S %H=%M>2&'(%Y#4)+$P("^31^59^90^120^151^181^212^243^273^304^334","^",%M)+%D
S %='%M!'%D,%Y=%Y-141,%H=%H+(%Y*365)+(%Y\4)-(%Y>59)+%,%Y=$S(%:-1,1:%H+4#7)
K %M,%D,% Q
;
DOW D H S Y=%Y K %H,%Y Q
DW D H S Y=%Y,X=$P("SUN^MON^TUES^WEDNES^THURS^FRI^SATUR","^",Y+1)_"DAY"
S:Y<0 X="" Q
7 S %=%H>21608+%H-.1,%Y=%\365.25+141,%=%#365.25\1
S %D=%+306#(%Y#4=0+365)#153#61#31+1,%M=%-%D\29+1
S X=%Y_"00"+%M_"00"+%D Q
;
YX D YMD S Y=X_% G DD^%DT
YMD D 7 S %=$P(%H,",",2) D S K %D,%M,%Y Q
T F %=1:1 S Y=$E(X,%) Q:"+-"[Y G 1^%DT:$E("TODAY",%)'=Y
S X=$E(X,%+1,99) G PM:Y="" I +X'=X D DMW S X=%
G:'X 1^%DT
PM S @("%H=$H"_Y_X) D TT G 1^%DT:%I(3)'?3N,D^%DT
N F %=2:1 S Y=$E(X,%) Q:"+-"[Y G 1^%DT:$E("NOW",%)'=Y
I Y="" S %H=$H G RT
S X=$E(X,%+1,99)
I X?1.N1"H" S X=X*3600,%H=$H,@("X=$P(%H,"","",2)"_Y_X),%=$S(X<0:-1,1:0)+(X\86400),X=X#86400,%H=$P(%H,",")+%_","_X G RT
D DMW G 1^%DT:'% S @("%H=$H"_Y_%),%H=%H_","_$P($H,",",2)
RT D TT S %=$P(%H,",",2) D S S %=X_% I %DT'["S" S %=+$E(%,1,12)
Q:'$D(%(0)) S Y=% G E^%DT
PF S %H=$H D YMD S %(9)=X,X=%DT["F"*2-1 I @("%I(1)*100+%I(2)"_$E("><",X+2)_"$E(%(9),4,7)") S %I(3)=%I(3)+X
Q
TT D 7 S %I(1)=%M,%I(2)=%D,%I(3)=%Y K %M,%D,%Y Q
NOW S %H=$H,%H=$S($P(%H,",",2):%H,1:%H-1)
D TT S %=$P(%H,",",2) D S S %=X_$S(%:%,1:.24) Q
DMW S %=$S(X?1.N1"D":+X,X?1.N1"W":X*7,X?1.N1"M":X*30,+X=X:X,1:0)
Q
COMMA ;
S %D=X<0 S:%D X=-X S %=$S($D(X2):+X2,1:2),X=$J(X,1,%),%=$L(X)-3-$E(23456789,%),%L=$S($D(X3):X3,1:12)
F %=%:-3 Q:$E(X,%)="" S X=$E(X,1,%)_","_$E(X,%+1,99)
S:$D(X2) X=$E("$",X2["$")_X S X=$J($E("(",%D)_X_$E(")",%D+1),%L) K %,%D,%L
Q
HELP S DDH=$S($D(DDH):DDH,1:0),A1="Examples of Valid Dates:" D %
S A1=" JAN 20 1957 or 20 JAN 57 or 1/20/57"_$S(%DT'["N":" or 012057",1:"") D %
S A1=" T (for TODAY), T+1 (for TOMORROW), T+2, T+7, etc." D %
S A1=" T-1 (for YESTERDAY), T-3W (for 3 WEEKS AGO), etc." D %
S A1="If the year is omitted, the computer "_$S(%DT["P":"assumes a date in the PAST.",1:"uses the CURRENT YEAR.") D %
I %DT'["X" S A1="You may omit the precise day, as: JAN, 1957" D %
I %DT'["T",%DT'["R" G 0
S A1="If the date is omitted, the current date is assumed." D %
S A1="Follow the date with a time, such as JAN 20@10, T@10AM, 10:30, etc." D %
S A1="You may enter a time, such as NOON, MIDNIGHT or NOW." D %
I %DT["S" S A1="Seconds may be entered as 10:30:30 or 103030AM." D %
I %DT["R" S A1="Time is REQUIRED in this response." D %
0 Q:'$D(%DT(0))
S A1=" " D % S A1="Enter a date which is "_$S(%DT(0)["-":"less",1:"greater")_" than or equal to " D %
S Y=$S(%DT(0)["-":$P(%DT(0),"-",2),1:%DT(0)) D DD^%DT:Y'["NOW"
I '$D(DDS) W Y,"." K A1 Q
S DDH(DDH,"T")=DDH(DDH,"T")_Y_"." K A1 Q
;
% I '$D(DDS) W !," ",A1 Q
S DDH=DDH+1,DDH(DDH,"T")=" "_A1 Q
[NOTE: this example is extracted from VA FileMan Version 19.0. There is no copyright notice in the text of the source code or any of the accompanying documents; FMANPROG.TXT and FMANUSER.TXT each specifically contain the statement "VA FileMan is a public domain software package that is developed and maintained by the Department of Veterans Affairs." I therefore believe no permission is required to reproduce this passage.--Daniel P. B. Smith]
Practices 1 and 2 make it difficult to understand which variables are used for input, which for output, and which are for temporary local processing (and could just as well be private to the routine). They also make it difficult to add new code to a project because of the possibility of variable name conflicts.
Practices 3, 4, and 5 make the code difficult to read for novices, but are much less of a problem for experienced M programmers. It can be argued practice 3 is beneficial because it aids in visual identification of "argumentless" commands. In M, "argumentless" commands ("Do", "Quit", "For") are semantically different from same commands with arguments ("Do REPORT","Quit retvalue", "For I=1:1:100"). Unfortunately, the M whitespace rules say that a command and its arguments must be separated by precisely one space, and an "argumentless" command is identified by being followed by two or more spaces.
I X?1.N1"H" S
X=X*3600,%H=$H,@("X=$P(%H,"","",2)"_Y_X),%=$S(X<0:-
1,1:0)+(X\86400),X=X#86400,%H=$P(%H,",")+%_","_X G RT
can be rewritten as
If X?1.N1"H" Do Go RT
. Set X=X*3600,%H=$H,@("X=$P(%H,"","",2)"_Y_X)
. Set %=$S(X<0:1,1:0)+(X\86400)
. Set X=X#86400,%H=$P(%H,",")+%_","_X
However, some programmers see no need for this, and just as there are syntax
purists, there are efficiency purists who will point out that the rewritten
version must take at least some additional execution time and must consume at
least some additional program space.
This article on MUMPS appeared in an old issue of a computer newsletter
Mumps, A Solution Looking For A Problem By Chris Richardson
(Copyright (c) 1993 Personal Systems, the monthly journal of the San Diego Computer Society; all rights reserved. Permission to reproduce this article is granted to other non-profit organizations such as computer user groups for non-commercial use as long as credit to the author and group is given and provided a copy of the newsletter is sent to us at: San Diego Computer Society, ATTN: Editor, Personal Systems; 5694 Mission Center Road; Suite 602, Box 350; San Diego, CA 92108)
What is MUMPS? Is it a programming language that thinks it is a database,
or is it a database that thinks it is a programming language?
Actually, it is both. And it is an ANSI Standard Language to boot.
What does that mean to anyone who is knocking out little applications on a home PC or Apple? Well, the nice thing about an ANSI Standard language is that the code you write on the Apple in standard MUMPS transports nicely to the IBM PC without any change. And if that other system is a mainframe, like a Vax or a large IBM system, your application will work there also.
Where did MUMPS come from and what does MUMPS stand for?
MUMPS was originally developed in the middle 60's on a National Institute of
Health Grant at Massachusetts General Hospital. It was originally designed to
run on a large machine (at that time...) 4K of memory (that is 4,000 bytes, not
megabytes) and 100 megabyte disk storage.
If it was written by a hospital, does it only do hospital problems? It was designed to solve the problem of tracking patient data. How does patient data differ from auto supply inventory or a check book? A patient can have many attributes that describe each encounter. For instance, suppose a patient gets admitted to a hospital with a traditional square record database, and is known to have six allergies, but there is only room for five allergies in the record.
Which allergy will you elect not to record? If this patient dies because of that one allergy that you did not record, your hospital may change ownership in settling his estate. For the majority of patients, the space reserved for the five allergies will not be used and is wasted space. That means that your hospital will be buying more disk space a lot sooner.
In the MUMPS environment, the database disk space is not allocated until it is needed (run-time). This means that the patient record expands to fit the amount of data required for that patient. If the space is not used, it is not allocated. If you have 12 patients in your database, you have only the space for these 12 records allocated.
In most traditional databases, you must allocate as many records as you expect before the first record is allocated. With MUMPS, many databases can be described but they will not take up any space until actual records are created. There is no theoretic maximum number of records that a specific database can contain. It is only bound by the actual amount of disk space that is available to be assigned. Talk about getting 10 pounds in a 5 pound sack.
Many database environments already exist for the PC, why should you be interested in another? MUMPS is unlike most other databases in that it is also a special type of programming language called an interpreter. OK, we hear the moans from the BASIC programming crowd. And did you think you got rid of interpreters when BASIC compilers came out. Well, you didn't. Interpreters don't have to be slow and most database environments actually do go interpretive when they service user queries. Anyway, even if the MUMPS interpreter was slow (which it isn't) the levels of run-time and error-time support is worth the difference.
When a MUMPS application stops for some reason, the symbol table remains intact at the line of code being executed when the error occurred. In the event of an error, control may be passed to another routine to capture the conditions of the failure or even attempt to recover from the error condition. Traditionally, MUMPS database applications have a short mean-time-to-repair (MTTR) of just a few minutes and a long up-time record. Also, in many cases, the application that blew up can be re-started from where it left off.
What does MUMPS look like?
MUMPS has only a single data type, strings (of characters). This makes the
conversion from one data type to another easier.
Most MUMPS commands may be abbreviated to a single character. Or spell them out if you choose. Code generation is quick.
MUMPS commands can be easily combined to form more complex and complicated structures. Each line of code is a block of code.
MUMPS makes little distinction between data and code. Code can be created and executed from a database or the symbol table at run-time. Data can be stored in a routine and accessed at run-time.
MUMPS is a sparse matrix array processor. This means that arrays are allocated at run-time; the arrays may be created in any order. Array element 1000000 can be created and then element 2 can be created and yet the array only has 2 elements in it.
Because there are only string data types, the subscripts of a MUMPS array are strings. What a concept! You can subscript an array by "APPLES" and "ORANGES", and "AVOCADOS". Now for the good news, when those subscripts are created, they are sorted alphabetically. MUMPS means never having to say you're sorting.
The language is still growing. Every ANSI Standard has a built-in sunset of seven years. That means that if nothing is done with a standard in seven years, it ceases to be a standard. Well, MUMPS has had an ANSI standard for 1977, 1984, 1990, and the MUMPS Development Committee is attempting to release a 1993 standard. Additional standards for WINDOWING, Networking, and Transaction Processing are currently in process.
MUMPS is transportable. It doesn't matter if MUMPS code is running under MS-DOS, Windows NT, UNIX, VMS, VM, or nearly any operating system you might mention, the code and database will still run. In fact, in some implementations MUMPS is also the operating system.
Who uses MUMPS?
Probably a lot more than you might think. How about the Veteran's
Administration. Well, the VA did such a good job of putting a Fourth Generation
Language together in MUMPS that the Indian Health Service decided to use it,
then the U. S. Public Health Service, and finally the Department of Defense for
the Army, Navy, and Air Force hospitals and clinics around the world. By the
way, the VA's 4GL, File Manager is in the public domain. If you can find a
source, you can get it free! Another advantage is that the package is
distributed as source code because MUMPS is an interpreter.
Is it just for hospitals? No, MUMPS is an excellent choice for nearly any database operation, especially if not every aspect of the situation is known. MUMPS is being used by banks and credit unions. Do you travel on airlines? You have probably been scheduled on a MUMPS system. All of the postage stamp sales for the U.S. Postal Service are tallied on a MUMPS system each evening. Auto parts houses keep track of their inventories with MUMPS systems. Language translators have been implemented in MUMPS and it also works well with artificial intelligence projects.
If MUMPS was developed here, is it only used in this country?
The national health services of Finland and England, as well as a few other
countries are currently using MUMPS. Ever gamble in the gambling houses in
London? They use MUMPS to track high rollers from one gambling house to the
next. The British Stock Exchange also uses MUMPS. The largest department store
chain in Spain uses MUMPS. The Russians acquired a copy of MUMPS and modified
it to run their national health services and track containerized freight.
If MUMPS is so good, why haven't I heard of it?
This is an interesting point. The computer industry lives on some very simple
rules, 1) sell products with follow-on (things that need other things to work
properly or better) and 2) sell items that make it difficult to migrate to
another vendor's hardware or software (also known as product loyalty). MUMPS
provides the programming language, the database, the screen handler, and soon,
windows of any platform that will have a MUMPS interpreter (which is just about
any platform). MUMPS code is extremely transportable. Standard MUMPS code works
fine on whatever platform you run it on.
When a MUMPS implementation is installed to replace an existing traditional system, usually there are sufficient resources for the MUMPS environment, with plenty of resources left for future expansion.
Alright, I'm sold. Where can I get MUMPS for my system?
Now for some good news, there is an evaluation version of MUMPS for MS-DOS that
is free, especially if you happen to be a student. The vendor only asks that
you register your use of the product.
By the way, there is extensive documentation available for this product.
There is a MUMPS Users' Group (now called the M Technology Association) which
can be contacted at:
MUMPS Users' Group of North America
1738 Elton Road, Suite 205
Silver Spring, MD 20903
Phone: (301)-431-4070 Fax: (301)-431-0017
The free MUMPS evaluation copy is available by calling Tati Goodnough, the
product manager for DataTree's DT-Student at (617)-890-2082 (She is a nice
lady. Don't pass up the opportunity to talk to her.) or write her at:
DataTree Inc.
c/o Tati Goodnough
300 Fifth Avenue
Waltham, Massachusetts 02154
[Editors Note: Old Address - see other sections of this FAQ]
(Author Profile: Chris Richardson is a Software Engineer with Science Applications International Corporation in San Diego and is a member of the MUMPS Development Committee, the ANSI Standards writing organization for the MUMPS language. He has worked for NASA, the U. S. Public Health Service, the U. S. Navy, Army, and the Air Force as well as Computer Sciences Corporation and Singer-Link in Houston. He has taught Real-time FORTRAN and MUMPS to professionals in the industry and government).
This section is dedicated to mentioning articles, white papers, research, et al that is no produced by the M Community, but by someone in the "Real World". I will accept submissions of articles, pointers, etc. for published matertials (electronic or physical) as of 1/1/96 on. Older submissions may be included if they are of a unique, or highly informative nature.
I. Computer Language Rating Table:
Source: Newsgroups: comp.lang.mumps
Date: Mon, 7 Oct 1996 09:06:20 -0500
Try looking at http://www.spr.com/library/langtbl.htm. It contains a language ranking, based on the amount of effort required to code a function point and M ranks very well.
This document contains url's and addresses that were acurate at the time of the original inclusion. URL's and e-mail addresses change however, and will (when notified) be reflected in Appendix 10. So, if you wish to reach a contributor, confirm addresses there.
Ellis A. Bauman, <ellis.bauman@AUP.WISC.EDU> Ben Bishop, aci@shore.net Dennis J Brevik, <dbrevik@ix.netcom.com> Etienne Cherdlu, <gz64@cityscape.co.uk> Floyd Dennis, <fbdennis@mindspring.com> Jon Diamond, jon.diamond@capemini.co.uk Rod Dorman, <rodd@panix.com> John D. Godfrey, Godfrey@msmail.vet.cornell.edu Gavin Greig, ggreig@mcs.dundee.ac.uk Russell Haddleton, rfh2y@uvacs.cs.Virginia.EDU Lev Jacob, <lev@TRENDLINE.CO.IL> Scott P. Jones, scott@INTERSYS.COM John E. Kemker, III, kemker.j@atlanta.va.gov Mark Komarinski, komarimf@craft.camp.clarkson.edu Monika Kratzmann, <monika@INTERSYS.COM> Jeff Loeb, LOEB.JEFFREY_L@san-diego.va.gov Keith F. Lynch, kfl@access.digex.net Jim McIntosh, <jim@american.edu> Ed de Moel, DEMOEL@saltmine.radix.net Steve J. Morris, sjm2@shore.net Kevin O'Gorman, kevin@kosman.uucp Paul Perrin, <Admin@admatic.com> Doug Preiser, preiser@cancer.unm.edu Harold Pritchett, <harold@UGA.CC.UGA.EDU> Aaron Seidman, seidman@world.std.com Kate Schell, cschell@radix.net Tilman Schmidt, ts@gb1.sema.de Arthur B. Smith, ART@vets.vetmed.missouri.edu Daniel P. B. Smith, <dpbsmith@world.std.com> Richard J. Tomlinson, Richard@rtsysgen.demon.co.uk Gardner Trask, trask@world.std.com David Whitten, whitten@netcom.com
Changes since version 1.3: 10/1/96
Changes since Version 1.2: 07/01/96:
Changes since Version 1.1: 01/01/95: