MUMPS FAQ/Version 1.9
The copy of version 1.9 of the MUMPS FAQ was retrieved from http://71.174.62.16/MDC/faq.htm
Contents
- 1 M Technology and MUMPS Language FAQ
- 1.1 Updates
- 1.2 Editors:
- 1.3 Changes since version 1.8: 2 Jan 1998
- 1.4 Sources/contributors/reviewers/participants:
- 1.5 Indirect Contributors:
- 1.6 Table of contents
- 1.6.1 1. What is M?
- 1.6.2 2. Where can I get a no-cost version of M?
- 1.6.3 3. What is comp.lang.mumps? How can I subscribe to it?
- 1.6.4 4. What are some books about M?
- 1.6.4.1 Introductions and Tutorials
- 1.6.4.1.1 M Programming: A Comprehensive Guide
- 1.6.4.1.2 M[UMPS] by Example
- 1.6.4.1.3 ABC's of MUMPS
- 1.6.4.1.4 The Complete MUMPS
- 1.6.4.1.5 Introduction to Standard MUMPS
- 1.6.4.1.6 The MUMPS Handbook of Efficiency Techniques
- 1.6.4.1.7 Standard M Pocket Guide
- 1.6.4.1.8 M Programming Language Standard ANSI/MDC X11.1-1995
- 1.6.4.1.9 How To Make A Computer Work For You -- An Introduction to the File Manager System
- 1.6.4.1.10 FileMan Database Management -- System User's Technical Manual
- 1.6.4.1.11 FileMan: Database Manager User Manual Volume II
- 1.6.4.1.12 MDC Type A's
- 1.6.4.1 Introductions and Tutorials
- 1.6.5 5. What do M programmers love about M?
- 1.6.6 6. What things about M are generally disliked?
- 1.6.7 7. Why is M called a "database language?"
- 1.6.8 8. Is M an RDBMS?
- 1.6.9 9. Is M compiled or interpreted?
- 1.6.10 10. How fast is M?
- 1.6.11 11. Does M support MicroSoft Windows and other GUIs?
- 1.6.12 18. Is M suitable for multiuser systems?
- 1.6.13 19. Does M work on LANs?
- 1.6.14 20. Is M standard?
- 1.6.15 21. Is M portable?
- 1.6.16 22. How does M compare to SQL?
- 1.6.17 23. How does M compare to BASIC?
- 1.6.18 24. How does X-base compare to M?
- 1.6.19 25. Are there M-based 4GLs and application generators? =
- 1.6.20 26. Are there M bulletin boards? M FTP sites? M Web Pages? M Newsgroups?
- 1.6.21 27. "What happened in 1841?"
- 1.6.22 28. How do I list a global directory on this unfamiliar M system?
- 1.6.23 29. Do comments really affect efficiency?
- 1.6.24 30. What is the MDC?
- 1.6.25 31. A Brief History of M
- 1.6.26 33. M[UMPS] as a first computer language.
- 1.7 = 34. M as a web scripting language
- 1.7.1 Appendix 1:
- 1.7.2 Extensao MUMPS
- 1.7.3 GT.M
- 1.7.4 IBM MUMPS
- 1.7.5 ISM or Cache or Open/M
- 1.7.6 MGlobal or CCSM
- 1.7.7 MUMPS Systems Laboratory
- 1.7.8 PGA MUMPS
- 1.7.9 Unix MUMPS
- 1.7.10 VISO DATA MUMPS
- 1.7.11 Appendix 2:
- 1.7.12 Appendix 3
- 1.7.13 COSTAR Users' Group =
- 1.7.13.1 Chicago Area LUG
- 1.7.13.2 DECUS MUMPS SIG
- 1.7.13.3 Central Florida MUG (Orlando-Tampa)
- 1.7.13.4 Delaware Valley MUG
- 1.7.13.5 MUMPS of Georgia (MGA)
- 1.7.13.6 LA MUG (Los Angeles)
- 1.7.13.7 Minnesota M Users' Group (Minneapolis-St. Paul)
- 1.7.13.8 New England MUG (Boston)
- 1.7.13.9 Pacific Northwest MUG (Seattle)
- 1.7.13.10 Pittsburgh Regional MUG
- 1.7.13.11 San Francisco Area MUG
- 1.7.13.12 Southwest MUG (Dallas-Fort Worth)
- 1.7.13.13 Sunshine MUG (Southern Florida)
- 1.7.13.14 Tri-State LUG (New York)
- 1.7.14 Appendix 4
- 1.7.15 Appendix 5
- 1.7.15.1 Data types:
- 1.7.15.2 Booleans:
- 1.7.15.3 Declarations:
- 1.7.15.4 Lines:
- 1.7.15.5 Case sensitivity:
- 1.7.15.6 Postconditionals:
- 1.7.15.7 Arrays:
- 1.7.15.8 Local arrays:
- 1.7.15.9 Global arrays:
- 1.7.15.10 Indirection:
- 1.7.15.11 Piece function:
- 1.7.15.12 Order function:
- 1.7.15.13 Commands:
- 1.7.15.14 Intrinsic (built-in) functions:
- 1.7.15.15 Convenience functions similar to library functions in other languages:
- 1.7.16 Appendix 6
- 1.7.17 Appendix 7
- 1.7.18 Appendix 8
- 1.7.19 Appendix 9
- 1.7.20 Appendix 10
- 1.7.21 Appendix 11
- 1.7.22 Changes since version 1.6: 1 Aug 1997 =
M Technology and MUMPS Language FAQ
This version of the <nowik>M[UMPS] FAQ</nowiki> has been copied from the most recent monthly distribution through "comp.lang.mumps". It was last updated on 1 March 1997. The only differences between this version of the FAQ and the version in the repository is that this version has been reformatted for a HTML processor. (Ed de Moel also ran the text through a spell-checker and applied some minor spelling replacement suggestions.)
For the most recent version, follow the hyper text link mentioned in section 25. Last-modified: 6-Apr-1998 Version: 1.9 Posting-Frequency: monthly This FAQ is copyright 1996-1998 by Gardner S. Trask III. All rights reserved. Permission is granted for this FAQ to be redistributed provided:
- the redistribution is free, at no cost to the recipient;
- the redistribution includes the complete FAQ, without modification, including this notice;
- this FAQ is current, as determined by any of the following: it is less than 60 days old; or, it has been obtained directly from newsgroup comp.lang.mumps; or, you have queried the editor.
Updates
Post comments or suggestions to comp.lang.mumps or email to Daniel P.B. Smith. NOTE: This document contains URLs and addresses that were accurate at the time of the original inclusion. URLs 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.
Editors:
Jon Diamond, |
== Questions that need answers:
- Hierarchtical / Relational / Post-relational: Where does M fit?
- Brief descriptions of specific, real-world, non-hospital applications;
- More information on performance/speed/benchmarks
- Concise descriptions or capsule commentaries on major M products, strengths/weaknesses, as seen by users (not vendors).
- Should we include vendor white papers in the FAQ?
- What do we do to add to the FAQ?
- New Web Sites
- Notable Mentions for FULLPAGENAME:Appendix 9
- Anything about OMEGA
Changes since version 1.8: 2 Jan 1998
- Some e-mail changes in Part II
- Mondo typos
- Addition of new section 34 - M as a web scripting language
Sources/contributors/reviewers/participants:
- Ben Bishop
- Jon Diamond
- John D. Godfrey
- Gavin Greig
- Russell Haddleton
- Brett Hunt
- Scott P. Jones
- John E. Kemker, III
- Mark Komarinski
- Jeff Loeb
- Keith F. Lynch
- Ed de Moel
- Steve J. Morris
- Kevin O'Gorman
- Doug Preiser
- Aaron Seidman
- Kate Schell
- Tilman Schmidt
- Arthur B. Smith
- Daniel P.B. Smith
- Richard J. Tomlinson
- Gardner Trask
- David Whitten
Indirect Contributors:
Those for whom postings and approved e-mail was included.
- Ellis A. Bauman
- Dennis J. Brevik
- Etienne Cherdlu
- Floyd Dennis
- Rod Dorman
- Lev Jacob
- Monika Kratzmann
- Paul Perrin
Table of contents
- 1. What is M?
- 2. Where can I get a no-cost version of M?
- 3. What is comp.lang.mumps? How can I subscribe to it?
- 4. What are some books about M?
- 5. What do M programmers love about M?
- 6. What things about M are generally disliked?
- 7. Why is M called a "database language?"
- 8. Is M an RDBMS?
- 9. Is M compiled or interpreted?
| 10. How fast is M?
- 11. Does M support MicroSoft Windows and other GUIUs?
- 12. Are there any M magazines or journals?
- 13. Which is the "official" name, M or MUMPS?
- 14. Is M a mainstream language?
- 15. Is M useful for non-medical applications?
- 16. Is M object-oriented?
- 17. Is M structured?
- 18. Is M suitable for multiuser systems?
- 19. Does M work on LANs?
- 20. Is M standard?
- 21. Is M portable?
- 22. How does M compare to SQL?
- 23. How does M compare to BASIC?
- 24. How does M compare to X-Base?
- 25. Are there M-based 4GLs and application generators?
- 26. Are there M bulletin boards? M FTP sites? M WEB sites? M Newsgroups?
- 27. "What happened in 1841?"
- 28. How do I list a global directory on this unfamiliar M system?
- 29. Do comments really affect efficiency?
- 30. What is the MDC?
- 31. A Brief History of M
- 32. How exactly does $ORDER work?
- 33. M as a first computer language
- 34. M as a web scripting language
- 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
- Appendix 9: Testimonials, Accolades, and Articles from outside the community
- Appendix 10: Contact information: e-mail and URLs
- Appendix 11: FAQ Change history
1. What is M?
answer 1a
M is a procedural, interpreted general-purpose programming language oriented towards database applications. Its characteristic features are:
- untyped variables, converted automatically between numeric and string;
- multi-dimensional associative arrays;
- persistent variables ("globals")
- good string handling capabilities: better than BASIC, not as good as SNOBOL4 (e.g. no full regular expressions;)
- indirection:" can use strings computed at runtime as part of M program text;
- built-in multiuser/multitasking support.
Tilman Schmidt, ed. Daniel P.B. Smith
answer 1b
Though M historically was a character-based, closed environment (it seems to me that this phrase could apply to nearly every programming environment that is more than ten years old), this can no longer be said of more recent M implementations. With the advent of ODBC, all competitive implementations of M can now be accessed from tools that are commonly available on PC workstations. In addition, with the release of MSM-Workstation in 1996, by Micronetics Design Corporation, M is now fully OLE compliant. Previously, MSM could be accessed as an OLE object via the MSM-API. Now, M can also act as an OLE controller through MSM-Workstation. The same product allows the developer to create M-based applications for MS Windows and MS Windows NT that can be distributed royalty free. M-based applications can now be distributed as shareware. The MSM suite of products from Micronetics continues to evolve with the technology. In 1997, MSM-PDQ/Web was released, providing easy access to M-data via the Web. Later the same year, access to MSM databases via Java was made available as well. In sum, M is no longer a character-based, closed technology. To the end-user, there is no visible distinction between an M-based application, and a non-M application. M is a powerful, dynamic aaaa technology which is now easily accessible to the most common workstation and server environments in use today.
Brett Hunt, Micronetics, 29 October 1997
answer 1c
M has many good points: high productivity, low hardware requirements, good scalability. But M also has some weaknesses: low transaction reliability, character-based screens, poor integration with other environments, and few development tools. Thomas C. Salander, M Computing, June 1994, p.74
answer 1d
M is a lousy language with one great data type. Steve J. Morris
answer 1e
MUMPS (Or "M") Massachusetts General Hospital Utility Multi-Programming System. A programming language with extensive tools for the support of database management systems. MUMPS was originally used for medical records and is now widely used where multiple users access the same databases simultaneously, e.g. banks, stock exchanges, travel agencies, hospitals. Early MUMPS implementations for PDP-11 and IBM PC were complete operating systems, as well as programming languages, but current-day implementations usually run under a normal host operating system. A MUMPS program hardly ever explicitly performs low-level operations such as opening a file - there are programming constructs in the language that will do so implicitly, and most MUMPS programmers are not even aware of the operating system activity that MUMPS performs. Syntactically MUMPS has only one data-type: strings. Semantically, the language has many data-types: Text strings, binary strings, floating point values, integer values, Boolean values. Interpretation of strings is done inside functions, or implicitly while applying mathematical operators. Since many operations involve only moving data from one location to another, it is faster to just move uninterpreted strings. Of course, when a value is used multiple times in the context of arithmetical operations, optimized implementations will typically save the numerical value of the string. MUMPS was designed for portability. Currently, it is possible to share the same MUMPS database between radically different architectures, because all values are stored as text strings. The worst an implementation may have to do is swap pairs of bytes. Such multi-CPU databases are actually in use, some offices share databases between VAX, DEC Alpha, SUN, IBM PC and HP workstations. Versions of MUMPS are available on practically all hardware, from the smallest (IBM PC, Apple Macintosh, Acorn Archimedes), to the largest mainframe. MSM (Micronetics Standard MUMPS) runs on IBM PC RT and R6000; DSM (Digital Standard Mumps) on the PDP-11, VAX, DEC Alpha, and Windows-NT; Datatree MUMPS from InterSystems runs on IBM PC; and MGlobal MUMPS on the Macintosh. Multi-platform versions include M/SQL, available from InterSystems, PFCS and MSM. Greystone Technologies' GT/M runs on VAX and DEC Alpha. This is a compiler whereas the others are interpreters. GT/SQL is their SQL pre-processor. ISO standard 11756 (1991). ANSI standard: "MUMPS Language Standard", X11.1 (1977, 1984, 1990, 1995?). The MUMPS User's Group is known as the M Technology Association. Mailing list: MUMPS-L@UGA.BITNET. Usenet newsgroups: comp.lang.mumps, comp.std.mumps. (10 Jan 1995) Submitted by: Daniel P.B. Smith, Original Author unknown
2. Where can I get a no-cost version of M?
InterSystems DT-Student
MS-DOS implementation of M with capacity restrictions and a licensing agreement prohibiting commercial use. Documentation is on-disk and includes both an M language manual and a programmer's manual. Requests for copies should be made in writing by mail or fax to Tommy Smith, InterSystems Corporation, One Memorial Drive, Cambridge, MA 02042. Phone 617 621-0600, Fax 617 494-1631. DT-Student can also be obtained via anonymous FTP from /pub/dtstudent at openmsql.intersys.com; in URL format, ftp://openmsql.intersys.com//pub/dtstudent/ As of 8/94, it also appears to be available for downloading from the InterSystems BBS +1 617-225-0475, the NEMUG BBS +1 508-921-6681, and the MTA-NA BBS +1 301-942-5359.
[10/97] The ftp site listed for InterSystems DT-Student is no longer current. openmsql.intersys.com site has moved to ftp.intersys.com, but the student version seems not to be there. per email from
Micronetics MSM-Explorer
Call the MTA-NA office (not Micronetics) at +1 301-431-4070 to order a complimentary copy and to get information on other student versions. The address for Micronetics Design Corporation itself is: 1375 Piccard Drive, Rockville, MD 20850, 301-258-2605, fax +1 301-840-8943. [10/97] Micronetics MSM-Explorer is available by anonymous ftp from ftp.micronetics.com in /misc/MSM/Explorer in files: EXP1.EXE, EXP2.EXE, LICENSE.MSM (needed beyond 10/31/97) and README.TXT. (move files to c:\exp and unpack) per email from
UCD MicroMUMPS
True public domain version. (8/94) Available for downloading from the NEMUG BBS +1 508-921-6681, and the MTA-NA BBS +1 301-942-5359 Also available for $xx from D-M Information Systems, 1403 Fifth Street, Box 1918, Davis, CA 95617, +1 916-753-0362. There is no support. D-M describes the documentation as consisting of two READ.ME files. According to the author, this is not a full implementation of the current M, but is specifically intended for novices and is easier to use than the versions derived from commercial systems. It is best used in conjunction with the book, "ABCs of MUMPS: An Introduction for Novice and Intermediate Programmers," by Richard F. Walters, Digital Press, 1989, ISBN 1-55558-017-3. This book can be ordered from MTA-NA (see below).
3. What is comp.lang.mumps? How can I subscribe to it?
(11/94)
- comp.lang.mumps is a "USENET newsgroup."
- It was created in July, 1994.
- It is an unmoderated newsgroup; anyone can post messages to it and anyone can read all the messages posted to it.
- The newsgroup's charter is given below.
- The charter is what was voted on by the USENET community when the group was created.
- As with all unmoderated newsgroups, the health of the newsgroup depends on goodwill, courtesy, and voluntary adherence to the spirit of the charter.
- Since its inception, comp.lang.mumps has been a friendly newsgroup with a comfortable volume, typically one to five messages per day.
- Recent topics have included:
- M coding standards/practices/conventions;
- rumors about possible M vendor mergers;
- job postings;
- and inquiries about specific problems with particular M implementations.
CHARTER of comp.lang.mumps
The proposed unmoderated newsgroup comp.lang.mumps will be open to discussions on almost all topics related to versions of the M technology and the M language (also known as MUMPS). Appropriate topics would include, but not be limited to,
- advocacy
- bindings to GUI platforms (M Windowing API)
- discussions of commercial products
- object-oriented extensions
- PC networking issues
- programming techniques
- tools
- etc.
The only topic that is excluded is:
- discussion of the standard for the M (MUMPS) language, ANSI X11.1 which should be discussed in the existing group comp.std.mumps.
Subsequent custom has established that informal discussions of standards- related issues are very welcome in this newsgroup. MDC members have suggested that they welcome informal discussions be conducted in comp.lang.mumps, while formal proposals should be posted to comp.std.mumps. It is also clear that the membership welcomes job postings and job information.
Subscribing to comp.lang.mumps
There are different kinds of Internet access. One common situation is a company that "has Internet access" via their internal e-mail system. Such arrangements often are e-mail only; if so, you must use the "MUMPS-L gateway" access method described below. Other sites have direct access to the USENET newsgroups. This is common for academic and government sites, and commercial services. Find out whether your site has direct access to the newsgroups. If you have it, this is the best way to read and post to comp.lang.mumps.
If you are on a typical UNIX host at an academic or government institution, one way to check is to type the names of the most popular "newsreaders" -- rn, trn, tin, and nn -- at the command prompt and see if any of them are installed. If not, you probably do not have USENET access and should use the MUMPS-L gateway. If you find that a newsreader is installed, consult an Internet-savvy colleague, system administrator or help desk for more information.
(11/94)
- Most of the commercial services, including America On-Line, CompuServe, DELPHI, and Prodigy now offer direct newsgroup access. Details for CompuServe are noted below.
The MUMPS-L gateway
(8/94)
- Anybody with Internet E-mail can participate in comp.lang.mumps by making use of a gateway and mailing list provided by American University and BITnet. Out of courtesy to the host organization, please use this method only if you cannot get access to comp.lang.mumps in any other way.
For those who cannot get comp.lang.mumps in any other way:
To receive MUMPS-L and comp.lang.mumps:
Send an e-mail message To: LISTSERV@uga.cc.uga.edu The subject line doesn't matter. The message text should consist of the single line: SUBSCRIBE MUMPS-L
Within a short time, you'll get an automated acknowledgement from the list server confirming your subscription and giving other information, and you'll start getting the comp.lang.mumps and MUMPS-L posts.
To post a message to MUMPS-L and comp.lang.mumps: Send an e-mail message To: MUMPS-L@uga.cc.uga.edu
Important: Notice the difference in the addresses. To start and stop subscriptions, you address the request to LISTSERV.
Thanks to:
- American University, for hosting and operating the gateway;
- Jim McIntosh, , for administering it;
- Harold Pritchett, , owner and administrator of the MUMPS-L list;
- and the BITnet organization generally.
Compuserve
(1/95)
- Some users have advised making sure that you understand CompuServe's rates, terms, and conditions before using CompuServe to access comp.lang.mumps, as the charges may be higher than anticipated. As of 11/28/94, according to a CompuServe representative (Julie Borders), Newsgroup access is an "extended service" charged by the hour at the same rate as other extended services. "To send Internet e-mail it is $.15 for the first 7500 characters and $.05 for each additional 2500 characters. It is the same rate to receive Internet e-mail." -- [Daniel P.B. Smith]
(11/94)
- CompuServe now offers direct newsreader access to the Usenet newsgroups. CompuServe subscribers may already using the MUMPS-L gateway, as described above. If you are doing this now and are satisfied with this system, there's no need to change.
Here are the steps I took to read comp.lang.mumps on CIS. Depending on exactly how you're set up (for example, whether you're using CIM), the details may be different for you, but everything should be clear once you GO USENET.
For me: the steps were
- I typed "GO USENET"
- I chose #6, "USENET Newsreader"
- I read some pages of warnings, disclaimers, and advice
- I chose #3, "Subscribe to newsgroups"
- I chose #1, "Subscribe to one known newsgroup"
- I typed "comp.lang.mumps" in response to the prompt "Newsgroup name"
- I typed "m" to return to the previous menu
- I chose #1, "Access your USENET newsgroups."
- It listed "comp.lang.mumps (18 articles) " as the only newsgroup I'm subscribed to, then offered choices.
- I chose #3, "Read articles"
4. What are some books about M?
A review of Richard F. Walters' new book, M Programming: A Comprehensive Guide (Digital Press, ISBN 1-55558-167-6) to http://www.amazon.com: The book I've been waiting for. M is a delightful applications language. Recently I've been struggling with C++ STL, trying to use the "map" container to get perhaps a tenth of the functionality you get from an ordinary M variable, and, believe me, I miss M. This is the M book we've all been waiting for, and it delivers exactly what it promises. It is, as the blurb says, "the only source M programmers at all levels need." The style and presentation reminds me a little of Stoustrup's book on C++: the organization and style are tutorial, but not elementary. It is up-to-date with the current standard. What I particularly admire about it, and what is all too rare in computer books (especially those written by professors of computer science) is that it displays an intelligent awareness of real-world commercial implementations of M. Too many books either describe a pure-standards abstraction on the one hand, or a specific vendor extension on the other. Walters identifies popular M implementations by name and calls attention to variations where appropriate. Like M itself, Walters' book is directed at real programmers trying to solve real problems in the real world. There are a few places where one can see that the book is an (extensive) rewrite of his older book, rather than a completely new work. I thought it was harder to locate the "argumentless DO" than it should have been, and I felt there should have been a coherent discussion in one place explaining the (historically weird) relations between the various forms of DO, and when $T is and isn't stacked. Similarly, it is disconcerting to see on page 199 that the "NEW" command is described as a "recent extension... not yet formally included in the standard." These are cosmetic problems that do not seriously mar the book I've been waiting for. Daniel P. B. Smith
The following books can be ordered from any M Technology Association. Contact them for prices. In the USA, contact: M Technology Association, 1738 Elton Road, Suite 205, Silver Spring, MD 20903. Telephone +1-301-431-4070.
- MUMPS POCKET GUIDE - 1990 by Joel Achtenberg, revised by Thomas C. Salander (MTA item #2018)
- A COOKBOOK OF MUMPS by David B. Brown & Donald H. Glaeser, D.Sc.(MTA item #2024)
Introductions and Tutorials
M Programming: A Comprehensive Guide
M Programming: A Comprehensive Guide is a complete update to ABC's of MUMPS While ABC's of MUMPS was an introduction for novice and intermediate M programmers, M Programming: A Comprehensive Guide, has a new section containing advanced material. This new section addresses features such as transaction processing, networking, structured system variables, and interfaces to other standards. Five new chapters have been added, covering an overview of M for readers familiar with other languages; M and the Windows environment; interaction between M and the underlying system; transaction processing; interfacing M with other standards; and error handling. Sections on interactive programming and futures have been extensively updated. M Programming: A Comprehensive Guide is an invaluable resource for everyone who is learning or using M.
M[UMPS] by Example
Need to know how M can be used? Need lots of examples to show you how? M[UMPS] by Example is your answer!! This book can be used as a first step to explain the language elements, including the most current additions. Here you'll find out how to use the language and take advantage of its strong points. You will also be shown the spectrum of M -- from the very beginnings to the latest -- as well as developments that are currently being formulated. Created by Ed de Moel, past Chair of the MUMPS Development Committee (MDC), this book is up-to-date Information.
ABC's of MUMPS
This book is no longer available. See the new title, M Programming: A Comprehensive Guide to order.
The Complete MUMPS
This excellent book is both a learning tool and a reference manual. It explores the basics of M's unique file structure, using examples and exercises to demonstrate specific functions. The well organized appendices and index provide rapid access to specific information needed to develop complex applications. The text includes functions of the 1990 standard.
Introduction to Standard MUMPS
Subtitled: A Guide for the Novice, this work introduces beginning programmers to key aspects to M as a programming language and an operating system. Each chapter leads users through a series of exercises and follows with review questions based on the new material. Appendices include additional review questions and solutions to each chapter's mini-tutorials. This is an important starter' volume for anyone interested in the M language.
The MUMPS Handbook of Efficiency Techniques
This handbook contains 125 ways to make M applications run faster, based on actual case studies of M installations over an 11 year period. Plus, this book contains code for a software package called ANALYZER that determines which M code is slowing down the programs within an application. If you need to finetune an existing application or create a new one, this book's for you!
Standard M Pocket Guide
This is the must have pocket reference for any M programmer! Use this pocket-sized booklet covering the 1995 standard for a quick reference, or use it to refresh your understanding of the elements of the language. It's a practical guide for beginning and experienced programmers alike. And inexpensive enough to afford a copy for everyone!
M Programming Language Standard ANSI/MDC X11.1-1995
This 1995 reference work contains a three section description of various aspects of the M computer programming language. Section 1, the M Language Specification, consists of a stylized English narrative of the M language. Section 2, the M Portability Requirements, identifies constraints on the implementation and use of the language for the benefit of parties interested in achieving M portability. Section 3 is a binding to ANSI X3.64 (Terminal Device Control Mnemonics).
How To Make A Computer Work For You -- An Introduction to the File Manager System
Learn how to computerize your own information management needs with the power of VA FileMan. This introductory volume is especially well-suited for non-programmers who can learn how to design, edit, and retrieve database information. It's the perfect supplement to your VA FileMan documentation!
FileMan Database Management -- System User's Technical Manual
Discover the uses and features that make VA FileMan today's database management system of choice. You'll learn the basics and advanced concepts about data input and retrieval options, database setup, programmer tools, and the data dictionary.
FileMan: Database Manager User Manual Volume II
The VA FileMan manual introduces two different groups of people to the VA FileMan database manager: those with newly acquired interest in learning about advanced database managers; and experienced database managers. Volume II covers advanced database theory and practice to provide a comprehensive reference for the non-programmer user of VA FileMan.
MDC Type A's
MDC Type A Document Collection: Extensions to ANSI/MDC X11.1-1995 Aren't you wondering how the NEXT ANSI Standard will be different from the 1995 Standard? Well, the answer is Now Available. The documents in this collection are approved by the MDC as proposed enhancements and extensions to the current ANSI Standard, ANSI/MDC X11.1-1995 M Programming Language. They are part of the current MDC Standard. Also included in this collection are the documents that are approved by the MDC as proposed enhancements and extensions to the current ANSI Standards, ANSI/MDC X11.2-1995 Open MUMPS Interconnect and ANSI/MDC X11.6-1994 M Windowing API. They are all part of the current MDC Standards.
5. What do M programmers love about M?
answer 5a
High productivity, low hardware requirements, good scalability. Thomas C. Salander in M Computing, June 1994, p.74
answer 5b
I still program with other languages (Pascal, C, APL, LISP, and so on), but almost always find myself saying, 'but it's so much easier in MUMPS!' ... it's just plain quicker to implement most applications MUMPS. MUMPS is a powerful computing language designed to solve real-world problems. John Lewkowicz, The Complete MUMPS, p. xii
answer 5c
When I was first at the VA, Greg here gave me a 1 page batch of M code and asked if I could do it any faster in C. Two weeks, a lot of aspirin, and two compilers later, I had 'barely' working code (it would only run *once*). Mark Komarinski
answer 5d
M is powerful and succinct. It's excellent for general hacking. If I suddenly get a hankering for the first thousand digits of pi, or for all the order 4 magic squares, or for a table of word frequencies in a document, I don't know of any language I can accomplish this in faster. Keith F. Lynch f p=2,3:2 s q=1 x "f f=3:2 q:f*f>p!'q s q=p#f" w:q p,?$x\8+1*8 [part of Keith Lynch's .signature; it prints a table of primes, including code to format it neatly into columns -- Daniel P.B. Smith
answer 5e
I really like the way that the global tree is "just there" without any file opening, record declarations, and the like. Kevin O'Gorman
answer 5f
Indirection. Execute strings. String subscripts. Enormously valuable. No other language has all of them. Ricardo Garcia
answer 5g
I haven't touched MUMPS since the late 70's. I`ve been missing globals ever since. While I was using MUMPS I implemented a simple programming tool couple of pages of MUMPS code. I've missed that tool ever since, as well as how easy it was to implement. Steve J. Morris
6. What things about M are generally disliked?
answer 6a
Low transaction reliability, character-based screens, poor integration with other environments, and few development tools. Thomas C. Salander in M Computing, June 1994, p.74
answer 6b
Are all vendors utilities crap? Having worked with DTM, DSM, MSM it seems lots of effort went into the M and no thought went into the programmer utilities.
answer 6c
When I look back on my Fortran code from school I am a little embarrassed but I understand it. When I look back on my MUMPS I can't even read it without slow token by token translation. It's amazing to me how fluent I was when I wrote it and how fluent I'm not when I read it. Steve J. Morris ==== answer 6d ==== It's possible to write completely obfuscated MUMPS code, and too many MUMPS programmers do it. Some even brag about nobody else being able to read their code. Fortunately for those of us in the VA who have to maintain that code, they are becoming a minority. John E. Kemker, III
7. Why is M called a "database language?"
answer 7a
M[UMPS] is a programming language with a strong emphasis on text handling and database management. However, M[UMPS] is not a data base management system. The disadvantage of being a programming language is that it takes more expertise to apply the language to create a working data base, but the advantage of not being a dedicated database management system is that it is infinitely more flexible. Ed de Moel
8. Is M an RDBMS?
answer 8a
The so-called DBMS component of M is another name for the feature of persistent associative array variables, i.e. arrays that can be indexed by strings, on an arbitrary number of levels, and that survive the termination of the program, being transparently stored on a permanent medium (hard disk). This feature is comparable to what ISAM (Indexed Sequential Access Method) packages offer for other languages, but it is more powerful than ISAM and it is seamlessly integrated into the language. It is *not* a relational database system, although it can serve as a basis for implementing one and does so in several commercial products. Tilman Schmidt
answer 8b
Databases that have a lot of many-to-many relations, and/or a lot of sparse information (fields that are more often empty than filled in) do not fit the relational model well. While a relational database can represent this data, it does it with great complexity or inefficiency. The sparse hierarchical array structure assumed by M is a much more natural fit for this type of data. Arthur B. Smith
answer 8c
The M standards suite includes a standard for embedded SQL, and embedded SQL is provided in commercial products such as InterSystems' M/SQL and KBase's KB/SQL. David Whitten
answer 8d
Initial development of the "relational model" of databases appeared to place MUMPS at a disadvantage, but recent advances in so-called non-first-normal form, a reference to hierarchical structures characteristic of MUMPS, open the door for MUMPS to take a leadership role in current research in that field. Richard F. Walters, "The ABCs of MUMPS"
9. Is M compiled or interpreted?
answer 9a
M was designed to be interpreted. Real compilation of an M program into a machine program for the target machine is not feasible due to the following of M's features:
- The XECUTE verb allows execution of a runtime string value as an M program, and indirection allows substitution of runtime string values into the executed source code. Therefore a complete M interpreter must be present at runtime, anyway.
- Indirection allows variable names and labels to be taken from string variables, so all names of variables and labels in the source text must be available at runtime, i.e. stored within the compiled program.
- The $TEXT function allows access to the program source text at runtime, so in principle the whole source must be kept together with the compiled program.
In practice, most M interpreters precompile programs into an intermediate, binary form that is more compact to store, and more efficient to execute. The requirement of keeping the source text around is relaxed by conventions limiting the use of $TEXT to comment lines, or to comments starting with two semicolons, and M interpreters often offer the option of keeping just these parts of the source (which of course breaks programs not respecting the convention). Tilman Schmidt
answer 9b
Greystone has a product that compiles to .EXE files that are comparable in size to C source .EXEs. David Whitten
answer 9c
Most of the versions of MUMPS these days are pre-compilers; a tokenized version of the routine is actually stored separately and usually runs faster. Ben Bishop
answer 9d
The reasons to use a pseudo-code approach instead of trying to generate machine code has a lot to do with memory efficiency - M has a well deserved reputation for requiring very little in the way of hardware resources, such as RAM. It also has a lot to do with what people do in M. If you do profiles on M applications, you find that much of the time they are doing things that wouldn't be helped by trying to compile to assembly code anyway (they are accessing globals, doing I/O, etc.). Also, with a good C implementation of M, I can port to a new Unix platform in a day or so (and then take a few weeks more if we want to assembly optimize the most commonly executed simple tokens - which I have done for most of the current architectures (Intel, Alpha, Mips, RS/6000-PowerPC, Motorola 68K, Motorola 88K, and Sparc). That would not be possible with an implementation that actually compiled to machine code. (Look at the delays of moving VC++ 2.0 to non-Intel architectures). Finally, with pseudo-code (we call ours m-code), you can share a compiled routine across all platforms (as we do with our M/SQL code). Scott P. Jones
10. How fast is M?
answer 10a
One company developing heavily in MUMPS ran tests to determine performance characteristics of MUMPS vs. Oracle. MUMPS ran approximately six times faster. Digital's DSM (Digital Standard MUMPS) consistently sets benchmark records for transaction processing. John E. Kemker, III
answer 10b
In benchmarking MUMPS and alternatives such as RPG, BASIC, COBOL and FORTRAN, Casimir Alonso reports that "A user choosing MUMPS for interactive data base applications can expect up to five times more power from a given computer" and that "the applications development took about one-third the amount of time forecast for the use of other languages...." with the MUMPS database occupying "only one-half to one-quarter of the disk space required by others. Casimir Alonso, A Case for MUMPS, Computerworld, January 9, 1984, as cited by William J. Harvey and Frederick G. Kohun in the article "MUMPS," from Encyclopedia of Microcomputers, 1993.
answer 10c
Very rough tests suggest that DTM is about twice as fast as Visual BASIC's implementation of the BASIC language. These tests involve simple code, coded similarly in each language, that exercise fundamental operations that are common to, and natural in, both languages (FOR loops involving arithmetic and fundamental string operations). On a 33MHz 386DX, Visual BASIC runs at very roughly 1000-2000 commands/second, DTM about twice that. Double that for a 486 DX2, quadruple that for a Pentium. Daniel P.B. Smith
11. Does M support MicroSoft Windows and other GUIs?
MWAPI
A 1994 addition to the M standard, the M Windowing API (MWAPI), defines an interface between the M language and windowing systems. InterSystems and Micronetics offer versions of M that implement the MWAPI in a MicroSoft Windows environment. Digital has an implementation [is it commercially released? Details?] for Windows NT. The M Windowing API and its commercial implementations are relatively new and have rough edges. The MWAPI has the advantage of portability and platform-independence, but has some limitations associated with the "least-common-denominator" approach. A unique feature of the MWAPI is that this "API" does not consist of subroutine calls (except for a few incidental functions). MWAPI programming consists mainly of performing sets and kills into a "structured system variable," which looks like a standard M global. For example, to set the title of a window to "M Technology Demonstration," you write <wiki>s ^$WINDOW("main","TITLE")="M Technology Demonstration" </wiki> To make its dimensions 300 by 200, you write <wiki>s ^$WINDOW("main","SIZE")="300,200" </wiki> The MWAPI is currently offered for MicroSoft Windows by InterSystems and Micronetics, and for Windows NT by Digital Equipment Corporation. It is often presented as the windowing future for M technology.
Visual-Basic-like approaches
InterSystems' "Visual M" is a set of tools which link M with MicroSoft Visual Basic, creating an integrated dual-language environment. M code can be accessed and edited from within the VB design environment, can access VB control properties, and can be triggered by VB events. Micronetics' MSM-Workstation product provides a Visual-Basic-like environment entirely based on M and the MWAPI.
"WRITE-slash" approaches
InterSystems' "DT-Windows," MGlobal's MGM-PC (for MS-Windows) and MGM-Mac (for the Macintosh) use a feature of the M standard that allows the language to be extended for device-specific purposes by means of the "write-slash" syntax. In DT-Windows and MGM, the windowing system is treated as a "device" with an unusually rich repertoire of device-specific commands. Although DT-Windows and MGM are conceptually similar, they are incompatible with each other. They are ad-hoc language extensions. Neither seems to have set a de facto standard. Why do these products (DT-Windows and MGM) provide a nonstandard approach? The answer, in part, is that they were introduced prior to the finalization of the MWAPI standard. Why do they still exist? Because they are closer to their underlying windowing platform than the MWAPI, they arguably provide better performance and broader access to the GUI system's functionality. Examples from the DT-Windows manual and MGM product literature, respectively, show how an "OK" button is added to a dialog box:
DT-Windows: w /waddbutton(2,65,40,10,20,1,1,1,0,0,0,"OK",1) MGM: W /DBUTTON("OK",2,9) <nowiki> === 12. Are there any M magazines or journals? === The M Technology Association publishes "M Computing," a technical journal. Members receive it free. See Appendix 2. MTA-Europe publishes "M Professional" a news/technical journal in English 3 times a year. MTA-Europe members receive it free. Non-members can order a subscription. Other MTAs also produce newsletters, mostly in local languages. Contact them directly for more information. === 13. Which is the "official" name, M or MUMPS? === This topic seems to be the M community's very own little religious war. The following represents the editor's opinion. Other views, including one from a member of the MUMPS Development Committee, are represented in Appendix 4. M and MUMPS are alternate names for the same language. M, the newer name, is now very widely accepted in the M community. The name change was introduced to address long-standing problems with the name MUMPS. The name MUMPS gave many the impression that the language was specifically for hospitals and health care applications. Many also felt it was undignified. M/MUMPS has evolved rapidly, with new ANSI standards being successfully issued in 1977, 1984, 1990, and a new standard now in canvass, which will probably issue in 1995. It is not the same language that it was in 1967. [[Daniel P.B. Smith]] === 14. Is M a mainstream language? === 1991 worldwide revenue in the M marketplace was estimated at $1 billion, projected to grow to $2 billion by 1996. Approximately 2,000 individuals/organizations belong to M Technology Association-North America, with approximately another 1,000 belonging to other MTAs. Versions of the M language are available from twelve vendors on every significant hardware platform. Some versions provide direct support for non- English languages, for example German, Russian, Japanese. But: "The national meeting of the MTA draws fewer attendees than the northeast regional meeting of the SAS Users' Group." [[Thomas C. Salander]], M Computing, June 1994, p. 72. === 15. Is M useful for non-medical applications? === Although it originated in a medical environment, nothing in the language is specific to medical applications. Non-medical applications can be, and have been, implemented successfully in M. The Gartner Group report, "1992 MUMPS Assessment and Opportunity," notes: "[M-based trust software from NCS] is used by several of the top 200 U.S. banks to control more than 375 accounts totaling $600 billion in trust assets. Lloyds of London, Barclays, and Bank of Bermuda ... use M systems... M moved into communication, shipping and transportation, law enforcement and other areas in the 1970s and 1980s. The Veteran's Administration, Discovery Channel, Coca-Cola and Schweppes, Ltd. Star Shipping, and the Law School Admission Service are among the M users." A recent M Technology Association press release describes how M Systems Plus won a contract with American Express's Travel Related Service Division (AMEX) in Atlanta contract to convert 2,000 cruise bookings acquired from a West Coast firm. It is said that the M System was designed and developed within two and a half weeks, and was up and running on schedule, processing over 500 telephone booking inquiries the first day. It has since been expanded to include brochure fulfillment, customer service, word processing, questionnaires that gauge customer reaction, and agent telephone activity tracking. [[Daniel P.B. Smith]] === 16. Is M object-oriented? === No. ==== answer 16a ==== A working group within MDC (the MUMPS development committee) is, however, actively considering object-oriented extensions. One vendor, ESI is marketing a development system, ESIObjects, that allows fully object-oriented programming in M. ESI, 5 Commonwealth Road, Natick, MA 01760, +1-508-651-1400, FAX +1-508-651-0708 [[Daniel P.B. Smith]] ==== answer 16b ==== However, M has many of the characteristics of newer OO languages. For example: dynamic memory usage, late-binding, encapsulation possibilities. [[Jon Diamond]] === 17. Is M structured? === Yes, no, maybe, sort of. M syntax is not for purists or academicians. ==== answer 17a ==== If you want to code in a structured style: * you may not love M's syntax, but you can live with it; * the necessary features are there; * they do, however, have an "add-on" or "makeshift" flavor. M does not enforce a structured style. And because the features that support structured programming were absent from the MUMPS of the early eighties, there is a substantial body of unstructured legacy code still in use, and a substantial number of M programmers comfortable with what might be called the "traditional" coding style. The M "ELSE" statement is a simple executable statement. It is not syntactically paired with an IF. The semantics are, approximately: a special system value, $TEST, is reminiscent of the "condition bits" in some processor. An IF statement sets the value of $TEST according to whether the condition was true or false. An ELSE statement is equivalent to <nowiki> IF '$TEST (the apostrophe is the "not" operator). Unfortunately, the traditional MUMPS subroutine does not push and pop the state of $TEST. Thus,
If a>b Write !,"a is greater." Else Write !,"b is greater."
performs as expected, but
If a>b Do REPORT1 Else Do REPORT2
may not, particularly if the REPORT1 subroutine itself contains If statements of its own.
This problem is solved by a feature called the "argumentless Do." Actually the argumentless Do plays three separate roles in M programming:
- It can do the job performed by continuation lines in other languages;
- It provides a mechanism for multiline IF's and FOR's;
- because an argumentless Do, unlike a standard Do (!), does stack and pop the value of $TEST, it can be used to write structures that look and act like nested IF-THEN-ELSE statements in other languages.
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>
Daniel P.B. Smith
answer 17b
Is MUMPS structured? I think it is. We haven't outlawed the GOTO true, but we have named subroutines, controlled loops (while loop is the same as argumentless FOR with a QUIT), iterated loops (FOR), Parameter Passing to subroutines, functions with return values... We also have line scoping on IFs, ELSEs and FORs. What else do you need to be structured? David Whitten
answer 17c
What about declaration of variables? What about scope of variables aside from line scope? I'm not convinced that the "while" exactly counts as a feature of MUMPS - in fact, an argumentless FOR with a QUIT is a "repeat...until", for a "while" you would need to perform an initial IF. Do such composite statements really count as proper controlled loops? Even if MUMPS is technically structured, it goes (IMHO) against the spirit of structured programming with commands reduced to a single letter whenever possible, short variable names encouraged, and no white space. The significance of the space character (in argumentless commands) is completely counter intuitive. I can't say that technically you're not correct in mentioning the above features but one of the primary aims of structured programming is to make support of existing code easier. In my experience, MUMPS encourages hacking and badly designed code. Gavin Greig
18. Is M suitable for multiuser systems?
Yes. An important feature of the M language is that the standard language core includes multiuser and multitasking features. These facilitate writing portable distributed-processing applications. A "JOB" command allows one process to initiate other, independent processes. Processes can arbitrate access to resources with each other via a "LOCK" command. There is no specific formal interprocess communication. Interprocess communication is achieved via the LOCK mechanism and shared use of "global" data (which are available to all processes) Daniel P.B. Smith
19. Does M work on LANs?
Yes. The primary method of implementation might be termed "remote global access." Globals residing on a remote system can be accessed and locked simply by using extended syntax to refer to them. For example, ^HERE(name,address) refers to a piece of data on my local system, while ^|DENVER|THERE(name,address) might refer to a piece of data on a remove system. Thus, the same programming techniques used to build multiuser and multiprocess applications on a single system can be used to build distributed network systems. In addition to this explicit networking most vendors allow for implicit network referencing, allowing system managers to choose the location of data independent of the application programs. A networking protocol standard, "Open MUMPS Interconnect," provides least-common-denominator capability so that systems from different vendors can participate on the same network. In addition, for competitive reasons, most vendors support the major protocols of their competitors.
An M-based LAN system in use at Brigham and Women's hospital, with 3,000 PC clients and over 100 servers, is a well-known and very successful application of the technology.
There are also a number of systems with M operating in more complex client/server situations, with M acting as a front-end to other systems and also a back-end via RPC etc to applications created using other tools, for example Visual Basic, C++ and so on.
20. Is M standard?
1977: | accepted as an ANSI standard, ANSI/MDC X11.1 | revised ANSI standard ANSI/MDC X11.1-1984 | 1986: | approved as a Federal Information Processing Standard (FIPS) | 1990: | revised ANSI standard ANSI/MDC X11.1-1990 | 1992: | accepted as an international standard, ISO/IEC 11756-1992 | 1993: | revised FIPS 125-1 | 1995: | revised standard in ANSI canvass procedure for approval as ANSI/MDC X11.1-1994 (or maybe 1995) and distributed for comments in ISO as ISO/IEC 11756-1995. | 1995: | M Standard: December 1995, ANSI approved X11.1 (1995 Programming Language) and X11.2 (Open MUMPS Interconnect) |
Daniel P.B. Smith, compiled from others' comments
21. Is M portable?
answer 21a
As a standardized language, M is portable as long as only the features defined in the standard are used. In practice, the portability of M programs is typically as good as or better than that of C, and much better than BASIC, because, unlike BASIC for example, standard MUMPS is sufficiently rich to implement real-world applications mostly without resorting to vendor-specific extensions. Tilman Schmidt
answer 21b
The contents of the ISO standard is IDENTICAL to the contents of the ANSI standard. This is another thing that makes M[UMPS] special: it is not uncommon that nationally accepted versions of standards differ in details from their internationally accepted counterparts. Ed de Moel
answer 21c
MUMPS has better portability than C or any other language I'm aware of. The VA has successfully run the same 15000 routine system on almost every platform imaginable. VA Kernel and FileMan, the core of Decentralized Hospital Computer Program (DHCP) and CHCS (The DoD version of DHCP) and IHS (Indian Health Services) has been run, with very few changes, on machines ranging from PC's (over 80 VA Medical Centers running on 486's) to VAXen (other VA's running VMS) to Alpha AXP's (the replacement for the VAXen and some 486 sites) to IBM RS/6000's running AIX (DoD with CHCS from SAIC). John E. Kemker, III
answer 21d
MUMPS is available for at least the following platforms:
- MSDOS v2.0+ (single-user or multi-user)
- Unix - Altos, AT&T 3B2, Bull XPS and DPX/2, Control Data 4000, Data General AViiON, Digital Equipment VAX/Alpha, Hewlett Packard 9000, IBM RS/6000, ICL DRS 6000, Motorola Delta, Phillips P9000, MIPS, Nixdorf Targon 31, NCR Tower, Pyramid, Sequent, Siemens, Sun, Texas Instruments 1500, Unisys 5000 and 6000
- Apple Macintosh OS
- VMS - Digital Equipment VAX/Alpha
- VM - IBM mainframe
- Netware
- Windows 3.1
- Windows NT
22. How does M compare to SQL?
M is a full-featured procedural general-purpose programming language. SQL is a declarative language for relational database queries only, and must be embedded in a general-purpose programming language in order to achieve Turing completeness. M accesses its database at low level, almost like programming in ISAM level. SQL works on the relational level, a higher level of abstraction.
23. How does M compare to BASIC?
Both are procedural, interpreted applications languages. Both have a line-oriented, verb-object type syntax. M has additional features: better string handling, multidimensional string-indexed arrays, persistent variables, multitasking, multi-user support, dynamic code. M offers greater standardization and portability. Although there is an ANSI standard for BASIC, it is of little practical importance because few vendors conform to it, it is not rich enough to permit development of real-world applications within the standard, and there is a tradition of non-standard vendor extensions. The state of M standardization is superior. The Veterans' Administration, in particular, took a leadership role in writing validation suites that assure vendor conformance to the standard. Vendor choice: BASIC is currently dominated by a single company, MicroSoft. There are other vendors but few have any practical importance. M is available from a wider range of vendors.
24. How does X-base compare to M?
Compare M with the Xbase languages
Answering complex questions is one of the biggest reasons we invest in the time and expense of using a database management system. Several types of graphical products exist today to help you query your database. Of these, dedicated front-end query and reporting tools such as Borland ReportSmith for Windows and Intersolve Q+E are probably the best-known in corporate environments. Such tools are typically client applications designed to query data from corporate databases residing on client servers. Typically, these products have no built-in data-management capabilities; many require you to have a detailed knowledge of your database and the workings of relational databases in general. PC-based database management systems let you construct queries and produce reports. You need a fair amount of database savvy to construct a query that produces the right result. Fortunately, the products are getting better at making this process easier. The two leading PC-based database management systems are Microsoft Access 2.0 and Borland Paradox for Windows 5.0. A query is a request for information from a database. Methods for specifying a query have improved over time. Traditionally, one would have used SQL, or structured query language. In the late 1970s, IBM Research developed a new query technique called QBE, or query by example. In QBE, one supplies query details by filling in a table with values. For instance, to locate rows where the state value is New York, one would move to the State column and enter NY. To find salaries greater than $40000, one would enter > 40000. The basic idea of QBE is to make the dialogue easy to learn and reduce any reliance on keywords or language syntax. It is possible to set up a database in M using a tool such as the VA Fileman package. Reports can be generated by means of the Report Writer feature of VA Fileman. Related records in a database are organized together to form a file, or in MUMPS terms a global. A field is a unique observation or data element. A record is comprised of one or more fields, a file (or global in M) is a collection of records and a database is the collection of all files comprising an application. Jeff Loeb
25. Are there M-based 4GLs and application generators? =
answer 25a
DASL (DSM Application Software Library). Based on DSM (Digital Standard M), it allows one to build database applications by defining data items and interactively designing screen placement. DASL runs on VMS and Unix platforms.
"I used to build applications with DASL... One of the things I really liked about DASL is that it handled a lot of routine stuff, allowing me to build applications in about 30% of the time that it would have taken with straight M coding -- which, in turn, is considerably faster than coding in most other languages :^) Because DASL is written in M it was easy to modify to add special features." Aaron Seidman
answer 25b
Others include:
- InterSystems Open M/SQL.
- Micronetics ViEW.
- Hoskyns MDM.
- Cybertools CyberM.
- Veterans Administration Kernel (public-domain).
Jon Diamond
26. Are there M bulletin boards? M FTP sites? M Web Pages? M Newsgroups?
M FTP
(01/95) [Arthur B. Smith], has recently launched what is probably the first general-purpose public M FTP site. You can reach it by anonymous ftp. The location, in URL format, is: ftp://vets.vetmed.missouri.edu//mumps/ For conventional ftp access, issue the command ftp vets.vetmed.missouri.edu. The beginning of a session looks like this:
ftp vets.vetmed.missouri.edu Connected to vets.vetmed.missouri.edu. Name (vets.vetmed.missouri.edu:dpbsmith): anonymous 331 Anonymous Login OK, send id as password. Password: [type in your e-mail address here] 230-User logged in 230- Welcome to the University of Missouri-Columbia Department of 230- Veterinary Medicine and Surgery FTP Server. As of 1/95, this location appears to contain everything from the NEMUG BBS, as well as DT-STUDENT and the M FAQ. See the description of the NEMUG BBS, below. -- Daniel P.B. Smith (7/94) Approximately 150 M-related files available for download. Examples:
MUGLIB1.LZH | Part 1 of MUGLIB Disk 11. Use LHA to extract (06-20-92) | XPORT.RO | Short M routine to change globals (06-27-93) | UTILS.EXE | Various MUMPS utilities (08-17-92) | CALC.EXE | M CALCULATOR - VER 3.00 - PKZIP EXE (11-14-92) | COWRITER.EXE | This is a Free CoWriter Demo. (03-18-92) | DSRECOV.ZIP | Recover crashed DataTree %dsbackups (09-09-92) | DTM-EDTR.LZH | Full-Screen editor for DataTree MUMPS. Use LH (06-19-92) | HASEDIT.EXE | MUMPS Editor from High Altitude. (10-19-90) | KERM-MGB.LZH | KERMIT-M for CCSM MUMPS. Use LHA to extract f (06-19-92) | MSMSHELL.UTL | MSM's Programmer Shell Utility (12-30-91) | MUMPS53.LZH | UC Davis MicroMUMPS Ver 5.23 ($H Fix). (06-11-92) | NOUS134.LZH | NOUS is a MUMPS Interpreter which contains Pr (09-23-92) | STUDENT.EXE | DT-STUDENT. FREE MUMPS System. Auto Pkunzip. (09-15-92) | TMM.LZH | TURBO-MicroMUMPS is a MUMPS Interpreter. (10-19-92) | FMV20.ZIP | VA FileMan Verion 20 (09-23-93) | FMPRO.LZH | VA FileMan Programmer Manual. Use LHA210.EXE (06-15-92) | XMTECH32.LZH | MailMan 3.2 Technical Manual. Use LHA210.EXE (06-15-92) | HURST.ZIP | MUMPS games and files for ISC's M/VX. (09-16-91) | IDEAFACT.EXE | The Idea Factory by C. Volkstorf (03-23-92) | MBBS792.TXT | Other known MUMPS BBS Boards as of 7/92 (07-24-92) | POSTNET.ZIP | print USPS POSTNET barcodes using M (06-01-93) | SSVN.TXT | Guy Gardner's paper on SSVN's for Windowing (03-04-92) |
(All of the BBS'es listed here are in the USA. -- Daniel P.B. Smith) ==== DHCP BBS ==== DHCP BBS: (801)583-0135 Focussed on the VA's Distributed Hospital Computer Program (DHCP); not a general-use M BBS.
InterSystems BBS
InterSystems BBS: General Users 617 225-0475 VARS 617 494-0867
Micronetics on CompuServe
Micronetics on CompuServe: GO PCVENH, Section 8 and DL 8 (7/94) CompuServe forum "PC Vendors (H)" is shared by a number of vendors; Micronetics occupies section 8 for messages, and DL 8 for files. The forum has received about five postings in the last two weeks, and is basically an extension of Micronetics' support services. Most threads begin as customer questions addressed to Micronetics support, and most files are product patches press releases, etc.
Micronetics Customer Support BBS
Micronetics Customer Support BBS: (301) 948-6825 (7/94) Content similar to Micronetics section on CompuServe. Primarily a customer support mechanism. [Micronetics Explorer, a student version of MSM, appears to be available for downloading from this BBS as EXP1.ZIP and EXP2.ZIP]. Some examples of files available for downloading:
%ZAB.RTN | MUMPS | 624 05/94 Display $ZA bit settings for device... | 3C507.COM | MAIN | 5.4K 03/91 3COM 3C507 Packet Driver | 408H.NOT | MUMPS | 7.9K 05/94 Release notes for Version 4.0.8H | MUMPS | 24K 09/91 MSM COURSE DESCRIPTIONS | BISMMARK.RTN | MUMPS | 8.3K 04/94 Benchmark routines... | COLOR.RTN | MUMPS | 1.8K 02/94 COLOR DEMO -- GUI | EXP1.ZIP | MUMPS | 1.3M 12/93 Explorer File (Database) 1 of 2... | EXP2.ZIP | MUMPS | 1.0M 12/93 Explorer File (Executables) 2 of 2... | GBMAINT1.RTN | MUMPS | 7.0K 05/94 GLB Compression fix for PC/Plus ver 4.0.9 only |
(8/94) 150 files for downloading, including VA FileMan 20.0 and no less than five versions of M:
- MUMPS Interpreters located in file area "MUMPS Programs & Utilities"
- MSM-EXPLORER Version 1.0 - File names for downloading are MSMEXP_1.EXE, MSMEXP_2.EXE and MSM_INST.HLP.
- DT Student Version 1.1 - File names for downloading are STUDENT1.LZH (DT Student part 1) and STUDENT2.LZH (VA FileMan 19 and Documentation part 2)
- NOUS Version 1.34 - File name for downloading is NOUS134.LZH
- TURBO-MicroMUMPS - Filename for downloading TMM.LZH
- UC Davis MicroMUMPS Version 5.23 - File name for downloading is MUMPS53.LZH
New England MUG BBS
Discontinued due to the popularity of the Internet. Sysop: Gardner Trask Baud: 300, 1200, 2400 and 9600 8 bits, no parity, one stop bit MNP5 error correction protocol 2400/9600 baud 24 hours, free The New England M BBS was the largest and longest running BBS dedicated to the M community. It served as a communication point at a time when the Internet was still not available to the public. The popularity and explosion of the net made the BBS mute.
M Newsgroups?
Currently, there is one newsgroup dedicated to M on the internet. It is: comp.lang.mumps Previously, a moderated newsgroup dealing with M standards was abandoned when c.l.m.'s popularity grew.
M Web Pages:
This list is never quite complete, and subject to old links. Please inform Gardner of any new, deleted, or modified Web Addresses (in no particular order):
Vendors
www.intersys.com | InterSystems Corp. | www.riosoft.softex.br/~x10tech/ | Extensao Software Corporation | M Language technical resources and enhancement projects | www.vmth.ucdavis.edu/M/mhttp.htm | Jim Self's MHTTP Server | www.mcenter.com/mtrc | M Technology Resource Center | ftp://vets.vetmed.missouri.edu/mumps | FTP site for M files | MDC, MTA, User Groups, and Standards Bodies | http://71.174.62.16/MDC/index.html | Mumps Development Committee | www.members.aol.com/mta1994/mta.htm | M Technology Association | www.mindspring.com/~mga | Mumps of Georgia Users Group | www.mtauki.co.uk/ | MTA - UK & I | www.ua.ac.be/mta/ | MTA - Europe | www.klinik.uni-frankfurt.de/mug-d | MUG of Deutschland | www.uku.fi/jarjestot/myhdistys/ | MUG - Finland | www.montagar.com/~swmug | The Southwest Mumps Users Group | www.itl.nist.gov/ | Computer Information Laboratory | www.mcis.duke.edu/standards/guide.htm | Healthcare Informatics Standards | www.itl.nist.gov/div897/ | Software Diagnostics & Conformance Testing Division of NIST | M publications, e-zines, software, etc. | www.geocities.com/SiliconValley/7041/mwm.html | MWM: an electronic e-zine on M | www.members.aol.com/mta1994/public.htm | Books on M Technology | www.mtauki.co.uk/mtapubs.htm | Books on M Technology from MTA-UK&I | www.members.aol.com/mta1994/softwar.htm | M Technology Software | www.mtauki.co.uk/mtasoftw.htm | M Technology Software from MTA-UK&I | ftp://vets.vetmed.missouri.edu/mumps | FTP site for miscellaneous M files | www.va.gov/dhcp/cdrom/software.htm | MUMPS programs on the VA server | www.mtechnology.org/mtapubs.html | M Publications from MTA-NA | Classes/Tutorials | www.isc.rit.edu/~nat4087/MUMPS/ | Rochester Institute of Technology | M people | www.geocities.com/SilliconValley/7041 | Chris Bonnici's M Home Page | www.cs.uni.edu/~okane | Kevin C. O'Kane | homepages.enterprise.net/andreww/ | Andrew Webb's Homepage | www.world.std.com/~seidman/aaron.html | Aaron Seidman's Homepage | www.i1.net/~jelkins/ | The Jim Elkins Home Page |
|+ | Other Companies related to, using, enhancing M |+ | www.atlasdev.com | Atlas Development |+ | www.connexsys.com | Connex Systems |+ | www.seasystems.com | Sea Change Systems |+ | www.cytools.com | Cybertools |+ | www.kbsystems.com | KB Systems |+ | www.sentientsystems.com | Sentient Systems |+ | www.tiac.net/users/kra/ | Kogan-Rose Associates |+ | www.hwsl.co.uk/mgw | M/Gateway Developments Ltd |+ | www.henryelliottandco.com/ | Henry Elliott & Company |+ | www.mcenter.com/tyler/ | The Tyler Group |+ | www.mindspring.com/~mga/corp-01.html#CPU | Career Professionals Unlimited |+ | www.techassociates.com/ | Tech Associates |+ | www.megaforceusa.com/ | MegaForce |+ | www.dice.com/prc/ | Professional Recruiting Consultants |+ | www.members.gnn.com/Emergent/et-top.htm | Emergent Technologies |+ | www.beaconpartners.com/red.html | Beacon Partners Consultants |+ | www.eskimo.com/~lci/ | LCI Homepage |+ | www.yonder.com/ | Yonder Technologies |+ | www.cyberspy.com/~kaycom/ | Kay Communications |+ | www.fthill.com/ | Foothill Solutions |+ | www.esitechnology.com | ESI Technology |+ | www.arnet.com/ | Digi International |+ | www.dht.com/ | Dynamic Healthcare |+ | www.idx.com/ | IDX Systems |+ | www.partners.org/bwh/home.html | Brigham and Women's Hospital |+ | www.hboc.com | HBO&Company |+ | www.kaiperm.org | Kaiser Permanente |+ | www.consult.hsc.wvu.edu/ | WV Consult |+ | www.va.gov/vama.htm#DHCP | Department of Veterans Affairs |+ | www.omegalegal.com/ | Omega Legal System |+ | www.isg-us.com/ | International Software Group |+ | www.georgejames.com/marina/ | George James Software |+ | www.srcorp.com | System Resources Corporation |+ | www.bender.brooks.af.mil/www/ | MEDSITE |+ | www.corningbesselaar.co.uk/ | Corning Pharmaceutical Services |+ | www.labcorp.com/ | LabCorp |+ | www.hogan1.atiin.com/uniband/ | UniBand |+ | www.epic.net/asianterminals/ | Asian Terminals |+ | www.ultranet.com/~scision/strate.html | StrateCision |+ | www.ctg.com/ | Computer Task Group |+ | www.intraco.com/ | Intraco Systems |+ | www.epicsys.com/ | Epic Systems |+ | www.jacquardsystems.com/jsr.html | Jacquard Systems Research |+ | www.partners.org | Partners Healthcare System, |+ | www.sunquest.com | Sunquest Information Systems, Inc. |}
27. "What happened in 1841?"
In M, the current date and time is contained in a special system variable, $H (for "HOROLOG"). The format is a pair of integers separated by a comma, e.g. "54321,12345" The first number is the number of days since December 31st, 1840, i.e. day number 1 is January 1st, 1841; the second is the number of seconds since midnight.
But why 1841? According to Steve Clay, , the following answer appeared in the "Just Ask!" column of the September 1993 issue of "M Computing," a publication of the M Technology Association, Silver Spring, MD 20903 (Phone: 301-431-4070), in the form of a letter from James M. Poitras: "Starting in early 1969, our group created the Chemistry Lab application at Massachusetts General Hospital (MGH), which was the first package in the MGH MUMPS with Global Data Storage and many of the features of the language today... "When we started programming, there were no utility programs of any type. We had to write them all: time, date, verify database, global tally, print routine, etc. I ended up writing initial versions of most of these. "When I decided on specifications for the date routine, I remembered reading of the oldest (one of the oldest?) U.S. citizen, a Civil War veteran, who was 121 years old at the time. Since I wanted to be able to represent dates in a Julian-type form so that age could be easily calculated and to be able to represent any birth date in the numeric range selected, I decided that a starting date in the early 1840s would be 'safe.' Since my algorithm worked most logically when every fourth year was a leap year, the first year was taken as 1841. The zero point was then December 30, 1840...
"That's the origin of December 31, 1840 or January 1, 1841. I wasn't party to the MDC negotiations, but I did explain the logic of my choice to members of the Committee."
28. How do I list a global directory on this unfamiliar M system?
Although the M language itself is standardized, the operating environment and utilities, alas, are not. And they are nonstandardized in the worst way: the actual functionality doesn't vary much across vendors, but the details do. Gardner Trask has provided the following guide:
Function | MSM | DSM | MVX/MSQL | DTM | Utility Menu | %UTL | %UTL | UTIL | zzu | Routine Directory | %RD/%ROU | %RD/%RDX | %RD/%RDISP | %rd | Routine Print | %RP | %RS/%ZTPP | %RO/ZP | %rsave | Routine Change | %RCHANGE | %RCE | %RCHANGE | %rsearch | Routine COmpare | %RCMP | %RCMP | %RCMP | %rloadcompare | Global Directory | %GD/%GLO | %GD | %GD/%GDISP | %gd | Global List | %GL | %G | %G | %g | Global Edit | %GEDIT | %GEDT | %GED | %gedit | Global Change | %GCHANGE | %ZGE | %GCHANGE | %gedit | Global Transfer | %GCOPY | %GC | %GOQ/%GIQ |
Gardner Trask
29. Do comments really affect efficiency?
In case anyone is not familiar with Scott Jones, let me say, in a offhand, understated way, that he knows what he is talking about -- Daniel P.B. Smith A number of people have talked about the performance/maintenance issues with comments, so I thought I'd clear things up a bit, at least for the implementations that I deal with (ISM, DTM). Double semi-colon comments are placed in-line into the object code, so it is best (from a maintenance view as well) to have a separate label for each logical section of data, followed by lines of ;; data, that is not in any path of execution. For normal comments, if they are at the end of a line that already has code on it - there is absolutely NO effect at all on performance, so comment to your hearts content. If the comment is all that is on the line, there is still a beginning of line token - which can be expensive, especially in frequently executed loops. The reason is that the BOL token does a lot of work after every so many lines, such as allow the next process to run (on systems like DTM), or check for ^C, ^RESJOB, or other inter-process communication.
For long runs of comments, such as the maintenance section at the top of a well written routine, if you have M/SQL (for ISM, DTM, DSM or MSM), you can simply use the macro pre-processor and bracket the code in
#if 0 ... #endif
This technique totally eliminates the overhead, but it does mean that the maintenance section is not present in the M source, only in the macro source (this can be an advantage if you ship M source to customers, but don't want them to see all of your descriptions of bug fixes). Alternatively, try not to start execution on the first line, but use a label after the comment section. (i.e. DO entry^foobar instead of DO ^foobar) Scott P. Jones
30. What is the MDC?
The MUMPS Development Committee (MDC) is responsible for defining the M Standard. Unlike other language standards bodies (such as ANSI and ISO), the MDC is dominated by users - systems developers, rather than implementors. Anyone with an interest in the M language can join the MDC and all members have a single vote. MTA-North America acts as the MDC Secretariat and publishes all documents pertaining to ANSI X11.1, including the Standard, bindings specifications (for example, X Windows, SQL and GKS) and MDC proceedings. There are also counterparts to the MDC in Europe, Brazil and Japan (MDCCs) which feed in non-US contributions and have voting rights at the MDC. Jon Diamond
31. A Brief History of M
As told in a series of e-mail exchanges in comp.lang.mumps in Sept/Oct 1996. Accuracy is not ensured. From: Monika Kratzmann We are looking for some historical information on the evolution of M to be published in an article. It seems natural to turn to the members of this newsgroup inviting you to provide any information on this you may have. Your consideration in providing us with your knowledge about the history of M is deeply appreciated. Thank you one and all. Monika Kratzmann InterSystems Corporation From: Ellis A. Bauman, 608-829-5334 It's not clear what specific kinds of info you're looking for, but here's a brief note on the beginnings, at least as far as I recall: The language was developed at Massachusetts General Hospital in a lab run by Dr. Octo Barnett. It was developed with federal grant money --- hence was in the public domain, and the name MUMPS stems from M'assachusetts General Hospital Utility Multi-Programming System Among the chief developers was Neil Pappilardo who later left Mass Gen, and started Meditech, adding some proprietary features to MUMPS and calling the result MIIS (Meditech Interactive Information System) --- marketing medical records systems to hospitals, clinics, medical labs, etc. At Mass Gen, the language was used to deal with clinical medical data --- hence its strengths in string handling (lots of text data), sparse arrays (not every patient undergoes every possible lab test), and other such features. The original platform was (at least I think it was) a PDP-15. It was later ported to the PDP-11 and other similar "minis" such as the Data General machines like Novas and Eclipses. As the idea spread among other medical researchers, people began adding other features, and there soon developed a whole bunch of "dialects" which frustrated the researchers because they couldn't exchange software very easily. To solve that problem, the MUMPS Users' Group was formed and efforts to standardize the language began. Dr. Barnett was among those who was most forceful in arguing for the creation of MUG and the standardization effort. I do not remember who first proposed that ANSI approval be pursued. The current MTA organization is what MUG has evolved into, via the name change. I believe Joan Zimmerman was the first MUG staff member, and she wrote (or edited?) some of the first MUMPS tutorial materials published by MUG. There is probably lots more material, and details, available from the MTA "archives", and other people who were involved in those early days. Perhaps some of the other newsgroup members will know how to contact some of the people I've mentioned. For example, there is a short history in Chapter 1 of "The Complete MUMPS" by John Lewkowitz. There are also some historical notes in the MUMPS FAQ (for example, "What happened in 1841?"). I hope the above is both accurate and helpful. From: Rod Dorman As I recall it, the original platform was the PDP-9. From: Lev Jacob I think the original plarform was a PDP-8. When the language was adopted by DEC it was a stand-alone OS called MUMPS-11 on PDP's. I can't remember MUMPS for Novas but I can remember MUMPS for Tandem Main Frames with a Multi-Cpu built in functionality. Good luck. Jacob Lev. From: Dennis J. Brevik The original platform was a PDP-9. When the MGH version was picked up by DEC it was productized onto the PDP-15. A couple years later it was rewritten by DEC for the PDP-11. The systems were standalone. The date that DEC officially picked up a magtape of MUMPS (PDP-9) from LCS at MGH was October 3, 1970. It was a pleasant fall day. The PDP-15 MUMPS system was installed at its first site (Health Data Management Systems of Denver) in May 1971. It took two hours to install, amazing everybody on the site, who were expecting a week or two effort. Dr. Octo Barnett was in charge at the Laboratory of Computer Science at MGH. Neil Papalardo and Bob Greenes were major contributors. Neil went on to form Medical Information Technology (Meditech), Greenes was a medical doctor as well as holding a PhD in computer science - both degrees awarded simultaneously from Harvard. Bob went on to be President of Automated Health Systems of Wakefield MA and Burlingame CA. In a Boston meeting in Fall 1972 Bruce Waxman of NIH told the audience in no uncertain terms that if they wanted to get NIH money for their computer projects they damned well better be using MUMPS, that NIH was not interested in reinventing THAT wheel, thank you. MUMPS took off. I was the original product line and technical leader on MUMPS-15 at DEC. Paul Stylos was the technical leader for MUMPS-11. Evelyn Dow was the original Marketing representative. And let us not forget Dave Ensor of Scotland, who made significant technical contributions. The DEC executive who originally saw the value in MUMPS was Stan Olsen. Sam Moulton was also on the technical side. Respecfully, Dan Brevik From: Ellis A. Bauman, 608-829-5334 Well, Jacob, all I can say is that when I first encountered MUMPS (in the early to mid 1970s), it was MIIS on a PDP-15, and I later worked on a Data General machine, also MIIS. Both of those were stand-alone systems, dedicated to MUMPS (or at least a MUMPS-like, derivative, language).
From: Daniel P.B. Smith Hi, Monika... There is a 16-page article, "History of the Development of Medical Information Systems at the Laboratory of Computer Science at Massachusetts General Hospital" by G. Octo Barnett, MD, in "A History of Medical Informatics," edited by Bruce I Blum and Karen Duncan, published by the ACM Press (Addison-Wesley), 1990, ISBN 0-201-50128-7. I bought it on sale for five bucks at Quantum. It's almost certainly out of print but it couldn't hurt to ask Quantum if they have any more copies kicking around. According to the article, the first implementation, of a language called MUMPS, by Neil Pappalardo, was on a PDP-7. Not a PDP-15 or a PDP-9, a PDP-7. He traces its origins from JOSS through BBN's Telecomp and StringComp.
Richard Walters' "An ABC of MUMPS" contains a "Brief History of MUMPS" on pp. 20-22 with a family tree showing the root in Rand Corporation JOSS, through BBN JOSS, via TELCOMP and STRINGCOMP to MGH MUMPS. Daniel P.B. Smith
From: Etienne Cherdlu Now this brings back some memories. I remember using TELCOMP back in 1969 (27 years ago). We used it, via a dial up line, on a PDP-7 (TELCOMP II) and later on a PDP-10 (TELCOMP III). I don't remember much about the machines that we used other than that we leased time from a company called Time Sharing Limited of Great Portland Street, London. I also have a note from that time about on-line storage charges. It cost 30p (about 45 cents) per 640 byte block per month! The family resemblance between TELCOMP and M is just about recognizable especially if you were familiar with MUMPS-11.
The following is a fragment of TELCOMP code that was written on 12 December 1971: 1.04 TYPE #,"ENTER ONE OF THE FOLLOWING:-";MENU 1.05 TYPE FORM X FOR X=1:1:4 FOR END=10^15 1.06 READ GRNO IN FORM 15 1.065 DONE IF GRNO=END 1.07 TO STEP 1.06 IF GRNO>4 1.08 TO PART GRNO+1 2.01 DO PART 50 2.02 READ N,K 2.03 DO PART 51 2.04 TO PART 15 .. 15.01 LINE FOR X=1:1:3 15.02 TYPE MINPL,MAXPL IN FORM 17 15.03 TYPE FORM 17 15.04 DO PART GRNO+15 FOR X=MNPL:STPL:MXPL 16.01 Y=(X^N)+K 16.02 Y1[X]=(((Y-MNPL)/(MXPL-MNPL))*2)-1 .. FORM 15 ITEM NUMBER? ##### FORM 17 MINIMUM ##### MAXIMUM ###### Comparison with M: # No variable declaration. No data typing (String support in TELCOMP III?) # Sparse local arrays. No globals. File I/O was conventional, I think. # For loop construct. # TYPE command identical to MUMPS-11 # Part/Step numbering identical to MUMPS-11 # Form Input/Output feature was unique to TELCOMP. # Do label+offset still exists in M today. Clearly some of the origins of M can be seen in TELCOMP. Does anyone know where the idea for globals originated? What elements did other languages, such as JOSS bring to M ? Regards [[Etienne Cherdlu]] From: [[Jon Diamond]] This takes me back too! Oh for the good old days - when programmers were really programmers, disks were 2.5Mb in size and part numbers ranged from 0.01 to 327.67 (or some such obvious number)!!!! Well, the comment is not totally accurate - line numbers only had 2 decimal places if you're being really picky. BTW I used to know magic numbers - 84, 84*84 84*84*84 etc FWIW. I've now forgotten what they were, but I'm sure some of you MUMPS-11 people must remember? I do know why I needed to know them, but that's another story... [[Jon Diamond]], Cap Gemini UK Go Proverb: "On the second line 6 die, 8 live" === 32. How Exactly does $ORDER work? === The first thing to be aware of is "arrays" as they work in other languages: when you have a "set" of components (like the states in the USA) you want to use a method of reference that allows you to manipulate the "set" as a unit when that is convenient, and its members when you are dealing with the properties of the individual members of that set. <pre> Now, in languages like Pascal and C, you would create an array with 50 members, and you would build a table: State[0] = (pointer to string) "Alabama" State[1] = "Alaska" ... State[49] = "Wyoming" and probably some associated tables: Capital[0] = "Montgomery"; Abbrev[0] = "AL"; Capital[1] = "Juneau"; Abbrev[1] = "AK"; ... Capital[49] = "Cheyenne"; Abbrev[49] = "WY";
If you want to loop through these arrays, you don't need any special functions: there are 50 elements in each, and "for i = 0 to 49" or for (i = 0; i < 50; i++) will do just fine.
In M[UMPS], arrays can be done in the same fashion, in which case For i=0:1:49 would do just fine to loop through all states, but it is much more common to use a different method of indexing the array(s), using a string as an index.
You could store the array as: State["AL"] = "Alabama/Montgomery" State["AK"] = "Alaska/Juneau" ... State["WY"] = "Wyoming/Cheyenne"
(or, if your method of usage would make that more convenient you could use State["Alaska"]="AK/Juneau" or State["Juneau"] = "AK/Alaska" for that matter). However you "index" the array, the addressing will not be as simple and straightforward as in traditional languages:
Your language processor will need to build an internal table to link storage positions to defined indexes.
This table will typically be invisible to the programmer, but you will want to query it with questions like: "I am at element "xxx", what is the next one that you have?"
Or, a simple loop across all states would look like: Set index="" For Set index=$order(State(index)) Quit:index="" do... The function $order looks at this internal table, and tells you what the next index is after the one that you specify. So... At the first call, the specified index is "" (empty string), and $order will look for the first entry in the table. Currently this is "AK". After "AK", $order would find "AL", "AR", "AZ", etcetera, up to "WY". When called with the "last" index ("WY"), $order would return the value "" (empty string) to signal that it could find no more members. Now, that seems fair for an array like this, and we'll always have the same 50 members, and always find the same ones in the same order, so why go through all this bother? Well, that will become clear when you're dealing with sets that are more dynamic in nature. Suppose that Good Old Fidel finally steps down and Cuba requests membership as a state, there would be a storm of protests, but let's assume that the request would be approved. In most other languages, we would have to do a lot of recoding to insert Cuba in the "proper" place in the new array of states.
In M[UMPS], all we have to do is Set State("CU")="Cuba/Havana"
$order(State("CT")) currently returns "DE", but after this insertion, it would suddenly return "CU", and $order(State("CU")) would return "DE": by the way of indexing that M[UMPS] does for you "behind the scenes", indexes are always stored in alphabetic order, and you won't have to worry where things are, or how to get them into the proper sequence. Of course, this is where it starts to matter what value you use for an index:
- quite often, you won't store a value "as it is entered" For instance, converting a proper name to "all upper case" (or all lower case for that matter). In this example, I used upper case only abbreviations, but if the full name of the state were the index, there is no predicting whether an end-user would type Alaska, alaska, ALASKA, or (very popular typo:) ALaska.
- it matters which "property" you use for an index. If the input to your program is "the abbreviation", you'll be fine with this set-up, but if you're doing taxes, and the input to your program is the city to which the forms are to be sent (which is not even always the capital), you may very well want to build a support-table that has your "search" data as a subscript, and the essential index into the "real" table as a value
In this example, I also used another "idiosyncracy" of M[UMPS]: I stored "State/Capital" into one single value. You would use the function $Piece to separate out these values. Whether you would use a set-up like I depicted above, or
State(abbreviation,"Cap")=capital State(abbreviation,"Name")=name is up to the needs of your application.
Of course (and I don't want to say that M[UMPS] is an object oriented language, it's 30 years old now, and definitely showing its age), this is a feature that you see a lot nowadays in object oriented programming as well: you pass the complete object, and leave it to the recipient-software to figure out which properties of the object are interesting to it. Ed de Moel
33. M[UMPS] as a first computer language.
A lively debate concerning M as a first language for non computer types had varied and interesting opinions. Here are some of them; From: Paul Perrin I think M is a *perfect* language to learn about fundamental programming principles. Software engineering can come later - and is abusable in any language. A computer handles three types of execution - sequential, conditional and iterative. Each type can be demonstrated (and learned) in M with no messing about - no 'declarations', no 'introductions', no 'directives', no compiling etc... Experienced programmers forget how they learned to program - Ken Knecht's 1979 definition of a string in 'Microsoft Basic' from the dilithium Press as 'a group of alphanumeric characters surrounded by double quotes' left me blank for weeks - what did he mean by group?
Character mode M is (at least) as good as the original 'basic's were for discovering what computers can 'decide' and 'think' and 'store'. Don't listen to the experts -- they forget from whence they came. Show him M (and follow up with Java). Regards Paul Perrin From: (Floyd Dennis) Paul Perrin wrote:
>I think M is a *perfect* language to learn about fundamental programming >principles.
For some reason, it surprises me that I tend to agree. <g> Before a "beginner" can even begin to grasp such things as "structured programming", "top-down", etc., they have to get a good feel for the basics. Things like Control, ALU, I/O, and Storage. M brings you a lot closer to the basics than many higher(?)-level languages. Also - for educational purposes, interpreted languages are great. Nothing is going to give a better instant gratification kick than being able to type a command directly and get an immediate answer. <g>
><snip> >Show him M (and follow up with Java). >
THAT will send him running back to M in a hurry. :) Floyd Dennis
= 34. M as a web scripting language
M has been used quite sucessfully as a web server / web scripting language as of late. I look for more additions to the FAQ concerning this. First up is a description of the work done by Kevin O'Kane in this area: M-based Internet Extentions / languages http://www.cs.uni.edu/~okane/
Kevin C. O'Kane
Resume
Schedule and Contact Information
This site contains a research Mumps interpreter for medical informatics applications. This interpreter is for a subset dialect of Mumps and is designed to provide medical records access for Internet and Intranet Web servers. This system works directly through the Web Server Cgi-Bin interface without the need for intermediate programs or files, unlike other systems. Versions are available for download for several systems as listed below. The system is small, reliable, portable and extremely fast. A recent test of this system operating under Linux with the Apache web server on an unoptimized Pentium 120 gave data base response times in excess of 25 data base transactions per second. This result is scalable to larger processors and faster commercial servers. Due to the hierarchical nature of the data base, the data base is easily distributed among multiple servers. See the documentation links below for complete details including downloading a prototype medical records system written in MumpsVM.
Documentation: MumpsVM Language Manual Including Prototype Medical Record System Steve Graham, , January 26, 1998
Appendix 1:
Appendix 1: List of M Vendors
DSM
- [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:
Gerry Sunderland Digital Equipment Corporation 151 Taylor Street TAY1-1/B6 Littleton, MA 01460-1407 USA Telephone: 508-952-4119
Paul Schaut InterSystems Corporation One Memorial Drive Cambridge, MA 02142 USA Telephone: 617-621-0600 Fax: 617-494-1631 Internet:
Digital Equipment Corporation: see InterSystems corporation
Extensao MUMPS
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
GT.M
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
IBM MUMPS
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
ISM or Cache or Open/M
InterSystems Corporation One Memorial Drive Cambridge, MA 02142 Phone: +1 617-621-0600 Fax: +1 617-494-1631 Contact: Maureen Flaherty Also: Offices in UK, Germany
MGlobal or CCSM
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
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
PGA MUMPS
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
Unix MUMPS
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 MUMPS
VISO-DATA Computer AG Rainergasse 1 A-1040 Vienna, Austria Phone: +43-1-5055734 Fax: +43-1-5055734-34 Contact: Sandy R. Schorr
Appendix 2:
Appendix 2: The M Technology Association
For current pricing information, please contact the relevant group. Membership for almost all MTAs includes:
M Computing (technical journal) MTA's Annual Meeting (discount for members) The MTA Publications Library (discount for members) MTA-North America also provides MSources (member, vendor, and business directory) MTA's Job Referral Service M Resource File M Technology Association BBS 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 20903-1725 USA Phone: +1 301-431-4070 Fax: +1 301-431-0017 Home page: www.mtechnology.org E-mail: Publication: M Computing
MTA-Europe
c/o datika nv keerbergsesteenweg 19 B-3150 Haacht Belgium phone: + 32 16 60 61 12 fax: + 32 16 60 61 17 E-mail: Web page: http://www.mta-europe.org
There are official MTAs and MUGs associated with MTA-Europe in Belgium, the Netherlands and Finland. Spain and Italy have local groups who are not officially associated with MTA-Europe. And of course, UK+Ireland and Germany have there own, relatively large groups, which are no longer affiliated with MTA-E. There are also reported MTAs in Brazil, Bulgaria, China, Czech/Slovak Republics, Germany, Ireland, Israel, Italy, Japan, and Russia. Confirmation would be appreciated. Please contact either of the above addresses for current information.
Appendix 3
Appendix 3. USA Local M Users Groups
Baltimore-Washington MUG
Contact: Susan Schluederberg The Connections Group, Ltd. 1100 Sunsett Drive Bel Air, MD 21014 Phone #: 410-838-6062
COSTAR Users' Group =
Contact: COSTAR Users' Group 23715 W. Malibu Road, Suite 246 Malibu, CA 90265 Phone #: 310-456-9322 or 810-869-6301
Chicago Area LUG
Contact: John Campbell on BBS Phone #: 312-929-6793
DECUS MUMPS SIG
Contact: Mitch Bell 200 Rector Place, #9P New York, NY 10280 Phone #: 212-657-3321
Central Florida MUG (Orlando-Tampa)
213 East Bay Street Winter Gardens, FL 34787 Contact: Mike Minor or Mark Gerszewski Phone #: 407-656-4990 or 813-978-9181
Delaware Valley MUG
Contact: D-V MUG Coordinator P.O. Box 323 Reading, PA 19607-0323 Phone: 215-748-2145
MUMPS of Georgia (MGA)
8351 Roswell Road Suite 221 Atlanta, Georgia 30350 Secretary's phone: (770) 968-3715 e-mail and web-site
LA MUG (Los Angeles)
Make suggestions for topics/mtg.times Contact: Steve Atlas 5408 Rozie Avenue Woodland Hills, CA 91367 Phone #: 818-883-1206
Minnesota M Users' Group (Minneapolis-St. Paul)
Contact: Chris Hawkins P.O. Box 14486 Minneapolis, MN 55414 Phone #: 612-627-6166
New England MUG (Boston)
Contact: Gardner Trask 508-927-7637 7 Galloupe Avenue Beverly, MA. 01915
Pacific Northwest MUG (Seattle)
Contact: Arden Forrey Health Info. Admin. Program Dept. of Health Services School of Public Health and Community Medicine 1107 NE 45th St., #355 Seattle, WA 98105 Phone #: 206-543-8810
Pittsburgh Regional MUG
Contact: Valerie Harvey Computer Information Systems Robert Morris College 600 5th Avenue Pittsburgh, PA 15219-3099 Phone #: 412-262-8467
San Francisco Area MUG
Contact: Julie Dijailia 51 Ridgewood Avenue San Francisco, CA 94112 Phone #: 415-262-8467
Southwest MUG (Dallas-Fort Worth)
Contact: Sidney E. Dane 4070 Walnut Lane Midlothian, Texas 76065 Phone +1 (817) 652-6194 Home Page
Sunshine MUG (Southern Florida)
Contact: Mark Fedora Phone #: 305-882-5319 Eastern Financial Credit Union 700 South Poinciana Blvd. Miami Springs, FL 33166
Tri-State LUG (New York)
Contact: Mitch Bell 200 Rector Place, #9P New York, NY 10280 Phone #: 212-657-3321
Appendix 4
Appendix 4: Is the official name of the language "M" or "MUMPS?"
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 name became M in 1993. The name will become M when the new ANSI standard is adopted. Both M and MUMPS are officially accepted names. M is only an "alternate name" or "nickname" for the language. 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). Daniel P.B. Smith 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 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
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 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]
> 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
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 favorably voted upon, "M" will remain a (well accepted) nickname for MUMPS. Ed de Moel
Appendix 5
Appendix 5: A "secret decoder ring:" highlights of the M language 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.
Data types:
one universal datatype, interpreted/converted to string, integer, or floating-point number as context requires. Like Visual BASIC "variant" type.
Booleans:
In IF statements and other conditionals, any nonzero value is treated as True. a<b yields 1 if a is less than b, 0 otherwise.
Declarations:
none. Everything dynamically created on first reference.
Lines:
important syntactic entities. Multiple statements per line are idiomatic. Scope of IF and FOR is "remainder of current line."
Case sensitivity:
Commands and intrinsic functions are case-insensitive. Variable names and labels are case-sensitive. No specified meaning for upper vs. lower-case and no widely accepted conventions. Percent sign (%) is legal as first character of variables and labels.
Postconditionals:
Provides a conditional whose scope is less than the full line. SET:N<10 A="FOO" sets A to "FOO" if N is less than 10; DO:N>100 PRINTERR performs PRINTERR if N is greater than 100.
Arrays:
created dynamically, stored sparsely as B-trees, any number of subscripts, subscripts can be strings or integers. Always automatically stored in sorted order. $ORDER and $QUERY functions allow traversal. for I=10000:1:12345 set SQTABLE(I)=I*I set ADDRESS("Smith","Daniel")="dpbsmith@world.std.com"
Local arrays:
names not beginning with caret; stored in process space; private to your process; expire when process terminates; available storage depends on partition size but is typically small (32K)
Global arrays:
^ABC, ^DEF. Stored on disk, available to all processes, persist when process terminates. Very large globals (hundreds of megabytes) are practical and efficient. This is M's main "database" mechanism. Used instead of files for internal, machine-readable record keeping.
Indirection:
Operational equivalent of "pointers" in other languages. in many contexts, @VBL can be used and effectively substitutes the contents of VBL into the statement. SET XYZ="ABC" SET @XYZ=123 sets the variable ABC to 123. SET SUBROU="REPORT" DO @SUBROU performs the subroutine named REPORT.
Piece function:
Treats variables as broken into pieces by a separator. $PIECE(STRINGVAR,"^",3) means the "third caret-separated piece of STRINGVAR." Can appear as an assignment target. After SET X="dpbsmith@world.std.com" $PIECE("world.std.com",".",2) yields "std". SET $P(X,"@",1)="office" causes X to become "office@world.std.com".
Order function:
Set STUFF(6)="xyz",STUFF(10)=26,STUFF(15)="" $Order(STUFF("")) yields 6, $Order(STUFF(6)) yields 10, $Order(STUFF(8)) yields 10, $Order(STUFF(10)) yields 15, $Order(STUFF(15)) yields "". Set I="" For Set I=$O(STUFF(I)) Quit:I="" Write !,I,?10,STUFF(I) The argumentless For iterates until stopped by the Quit. Prints a table of I and STUFF(I) where I is successively 6, 10, and 15.
Commands:
may be abbreviated to one letter, case-insensitive.
DO XYZ | call subroutine at label XYZ | DO PQR(arg1,arg2,arg3) | call with parameter passing | ELSE stmnt1 stmnt2 stmnt3 | opposite of last IF | FOR stmnt1 stmnt2 stmnt3
repeat until a QUIT breaks you out |
FOR i=1:1:100 stmnt1 ... | iteration, i=1, 2, 3, ... 100 | GOTO | yes, there is one | IF cnd stmnt1 stmnt2 stmnt3 | conditionally execute rest of line | KILL vbl | return vbl to "undefined" state | NEW vbl1,vbl2,vbl3 | stack old values, create fresh "undefined" state. Pop on QUIT. | QUIT | return from subroutine | QUIT value | return from extrinsic function | READ "Prompt:",X | on current I/O stream, first write "Prompt:", then read line into variable X |
SET a=22,name="Dan",(c,d)=0 | variable assignment | USE 23 | switch I/O stream to device 23 | WRITE !,"x=",x | output to current I/O stream. ! means new line | XECUTE("set a=5 do xyz")<nowiki> | execute arbitrary data as M code |} ==== Operators: ==== No precedence, <BR> executed left to right, <br> parenthesize as desired. {| |+ | <nowiki>2+3*10 | yields 50. | + - * /<nowiki> | sum, difference, product, quotient |+ | <nowiki> \ <nowiki> | integer division,<br> | <nowiki>1234\10 yields 123 | # | modulo | _ | concatenation, | "nice"_2_"use" --> "nice2use" | & ! ' < > | and, or, not, less, greater, equal | [ | string contains. | "ABCD"["BC" --> 1 | ] | string lexically follows. </nowiki> | "Z"]"A" --> 1 |+ | <nowiki> ? | pattern match operator |
Intrinsic (built-in) functions:
Important structural components of the language (not commonly found in other languages):
$DATA(V) | tests if a variable V is defined (has data) or not | $ORDER, $QUERY | traverse arrays in sorted order | $ORDER(A("abc")) | value V is the next subscript, following "abc", <bre>according to the M collating sequence, such that a(V) is defined |
$PIECE | see above | $SELECT(c1:v1,c2:v2,1:v3) | if c1 is true yields v1, else if c2 is true yields v2, otherwise yields v3 |
$TEXT(FOO+3) | returns text of source code at line FOO+3 |
Convenience functions similar to library functions in other languages:
$ASCII, $CHAR | text-to-ASCII-code and inverse | $EXTRACT(STRING,5,10) | characters 5 through 10 of STRING; may be assignment target |
$FIND(string,find,from) | substring search | $FNUMBER | floating point formatting | $LENGTH(string) | just what you think | $RANDOM(100) | random # in range 0 to 99 inclusive | $TRANSLATE("abcd","ab","AB") | character substitution; yields "ABcd" |
Daniel P.B. Smith
Appendix 6
Appendix 6: An example of "textbook" M coding style 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. Lines are numbered for reference only; the line numbers are NOT part of the M code.
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:ValHigh 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>
Appendix 7
Appendix 7: An example of "traditional" M coding style
%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
- 1) The "New" command is not used; all variables are treated as universal in scope.
- 2) There is no use of the DO parameter passing mechanism, and no use of extrinsic functions. Information is passed in and out of subroutines by setting variables.
- 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.
- 3) M commands are uniformly abbreviated to a single character.
- 4) Variable names are short, frequently a single character. The single percent sign is used as a variable name, and also as an array.
- 5) Labels are short. Some label consist of single characters or even single numerals. The percent sign is used as a label.
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 white space 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.
- 6) Some lines are considerably in excess of 80 characters and wrap when displayed or printed.
- Line scope is significant in M;
- "For" and "If" operate on the rest of the current line.
- Multistatement lines are natural to M, and M permits lines to be up to 255 characters long.
- When the natural logic of a statement calls for more than eighty characters, the programmer can choose to write a long line, or rework the logic to avoid this. The argumentless DO and block structure make this easy to do;
- for example
- 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.
- 7) There are eleven goto (G) statements. Note that six of them transfer control to labels in routines other than %DTC itself.
- 8) The only uses of comments are the two heading lines, and in blank lines used to separate subroutines for readability.
Appendix 8
Appendix 8: MUMPS, A Solution Looking For A Problem by Chris Richardson
This article on MUMPS appeared in an old issue of a computer newsletter. (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.
- How does patient data differ from auto supply inventory or a check book?
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 (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).
Appendix 9
Appendix 9: Testimonials, Accolades, and Articles from outside the community
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. 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.
- ?
Appendix 10
Appendix 10: Contact information: E-mail and URL addresses
This document contains URLs and addresses that were acurate at the time of the original inclusion. URLs and e-mail addresses change however, and will (when notified) be reflected in this appendix. So, if you wish to reach a contributor, confirm addresses there.
- Ellis A. Bauman:
- Ben Bishop:
- Dennis J. Brevik:
- Steve Clay:
- Etienne Cherdlu:
- Floyd Dennis:
- Jon Diamond:
- Rod Dorman:
- John D. Godfrey:
- Gavin Greig:
- Russell Haddleton:
- Brett Hunt:
- Lev Jacob:
- Scott P. Jones:
- John E. Kemker, III:
- Mark Komarinski:
- Monika Kratzmann:
- Jeff Loeb:
- Keith F. Lynch:
- Jim McIntosh:
- Ed de Moel:
- Steve J. Morris:
- Kevin O'Gorman:
- Paul Perrin:
- Doug Preiser:
- Harold Pritchett:
- Aaron Seidman:
- Kate Schell: , http://jacquardsystems.com
- Tilman Schmidt:
- Arthur B. Smith:
- Daniel P.B. Smith:
- Richard J. Tomlinson:
- Gardner Trask:
- David Whitten:
Appendix 11
Appendix 11: FAQ Change History
Changes since version 1.7: 1 Nov 1997
- Addition of Brett Hunt's comments to question 1 and 11
- Rogue typos
- Email changes in part II
Changes since version 1.6: 1 Aug 1997 =
- Typos, edits, new URLs and e-mail addresses submitted by you, the viewing audience.
- Addition of a review by Daniel P.B. Smith for the books section. READ IT !!
- Move section 30 up to FULLPAGENAME#Section 24 and renumber for a more logical flow.
categorized and cleaned up of web references in FULLPAGENAME#Section 26.
Changes since version 1.5: 1 May 1997
- Typo's, edits, and new e-mail addresses. Keep those cards and letters coming.
- New FULLPAGENAME#Section 32 on how $ORDER really works.
- New FULLPAGENAME#Section 33 on M as a Learning Language.
- Redo of FULLPAGENAME#Section 4 to include new books available.
- Some more URL edits and additions to section.
- Implementation of a great idea from Dan Baer about an e-mail and URL appendix.
- Basically, I will now refer to people and companies by name, and add an appendix of e-mail and URL addresses. A
- One-Stop-shop for contact information.
- Changes to all sections to remove 'hard-coded' e-mail addresses.
- Change history moved to FULLPAGENAME#Appendix 11. Only current changes will appear at top of FAQ.
Changes since version 1.4: 1 Jan 1997
- Typo's, edits, and new e-mail addresses. Keep those cards and letters coming.
- Additional (author unknown) definition to FULLPAGENAME#section 1. what is M?
Changes since version 1.3: 1 Oct 1996
- Expansion of FULLPAGENAME#Section 25 to include M Web addresses and Newsgroups
- Additon of FULLPAGENAME#Section 31: A Brief History of M
- Addition of FULLPAGENAME#Appendix 9: Testimonials and Articles
- Minor editorial changes and spelling corrections.
- Removed Editorial History prior to 1995
Changes since Version 1.2: 1 Jul 1996:
- Addition of X-base vs. M answer - Question 30
- Addition of FULLPAGENAME#Appendix 8 - Mumps, A Solution Looking For A Problem, By Chris Richardson
- Request for new blood
- Change to Mumps of GA address
- General cleanup and spellcheck.
Changes since Version 1.1: 1 Jan 1995:
- Change to the Connections Group address
- Request for thoughts on inclusion of MSM white papers.