Annotation of papers/freem_history/freem_history.ms, revision 1.21
1.2 snw 1: \"
1.21 ! snw 2: \" $Id: freem_history.ms,v 1.20 2025/04/28 12:34:14 snw Exp $
1.2 snw 3: \" History of FreeM
4: \"
5: \" Copyright (C) 2025 Serena Willis
6: \"
1.3 snw 7: \" $Log: freem_history.ms,v $
1.21 ! snw 8: \" Revision 1.20 2025/04/28 12:34:14 snw
! 9: \" Update access dates
! 10: \"
1.20 snw 11: \" Revision 1.19 2025/04/24 19:47:33 snw
12: \" Improve abstract
13: \"
1.19 snw 14: \" Revision 1.18 2025/04/24 18:54:56 snw
15: \" Updates
16: \"
1.18 snw 17: \" Revision 1.17 2025/04/24 18:46:33 snw
18: \" Clean up refs and add ackowledgments
19: \"
1.17 snw 20: \" Revision 1.16 2025/04/24 17:07:50 snw
21: \" Updates
22: \"
1.16 snw 23: \" Revision 1.15 2025/04/24 16:47:58 snw
24: \" Reorganize document, add MUMPS language overview
25: \"
1.15 snw 26: \" Revision 1.14 2025/04/24 15:33:29 snw
27: \" Add table of ISC-acquired M implementations
28: \"
1.14 snw 29: \" Revision 1.13 2025/04/24 01:31:13 snw
30: \" Add biblio checker
31: \"
1.13 snw 32: \" Revision 1.12 2025/04/23 18:59:53 snw
33: \" Refine wording
34: \"
1.12 snw 35: \" Revision 1.11 2025/04/23 18:58:31 snw
36: \" Refine awkward paragraphing
37: \"
1.11 snw 38: \" Revision 1.10 2025/04/23 18:44:26 snw
39: \" Correct capitalization error in abstract
40: \"
1.10 snw 41: \" Revision 1.9 2025/04/23 18:40:00 snw
42: \" Improve footnotes
43: \"
1.9 snw 44: \" Revision 1.8 2025/04/23 15:12:13 snw
45: \" Improve wording
46: \"
1.8 snw 47: \" Revision 1.7 2025/04/23 15:05:45 snw
48: \" Fix typographical problems
49: \"
1.7 snw 50: \" Revision 1.6 2025/04/23 13:32:34 snw
51: \" Fix copyright symbol
52: \"
1.6 snw 53: \" Revision 1.5 2025/04/23 13:29:37 snw
54: \" Add copyright and license, shorten URLs
55: \"
1.5 snw 56: \" Revision 1.4 2025/04/22 18:16:06 snw
57: \" Remove references to FreeM as a database
58: \"
1.4 snw 59: \" Revision 1.3 2025/04/22 17:54:09 snw
60: \" Initial draft of FreeM History paper
61: \"
1.3 snw 62: \" Revision 1.2 2025/04/22 14:56:22 snw
63: \" Add comment header to FreeM History
1.2 snw 64: \"
1.3 snw 65: \"
1.20 snw 66: \" .R1
67: \" database ../references.bib
68: \" move-punctuation
69: \" .R2
1.1 snw 70: .TL
71: The History of FreeM
72: .AU
73: Serena Willis
74: .AI
75: Coherent Logic Development
76: .AB
1.20 snw 77: The history of M, as well as the specifics of FreeM\(emthe implementation maintained by the author for the last decade\(emare extensive and complex topics. Here, we will present an overview of the M language and its history in general, proceeding thence specifically to the historical background and development of FreeM itself, as well as its current status and goals. Though publicly-available information is sparse, efforts have been made to cite as many sources\*{*\*} as possible.
78: .FS \*{*\*}
79: Note that all world wide web URLs have been shortened for readability. Following these URLs will automatically redirect the reader to the appropriate, original source. All such URLs were accessed by the author on 27 April 2025, unless otherwise specified.
1.17 snw 80: .FE
1.1 snw 81: .AE
1.17 snw 82: .NH
1.19 snw 83: M LANGUAGE OVERVIEW
1.1 snw 84: .PP
1.15 snw 85: \fIMUMPS\fR\(emnow generally referred to as \fIM\fR to distance it from the infectious disease\(emis an imperative, general-purpose, command-oriented programming language supporting persistent, hierarchical, sparse arrays. It includes high-level support for multi-user, multi-processing applications with flexible concurrency control.
1.1 snw 86: .PP
1.15 snw 87: MUMPS, being an acronym for \fIM\fRassachusetts General Hospital \fIU\fRtility \fIM\fRulti-\fIP\fRrogramming \fIS\fRystem, was developed by Neil Pappalardo, Robert A. Greenes, and Curt Marble of Dr. Octo Barnett's lab at Massachusetts General Hospital in 1966-1967.
1.3 snw 88: .[
1.15 snw 89: greenes1969
1.3 snw 90: .]
1.15 snw 91: Inspired by RAND Corporation's JOSS, and the TELCOMP and STRINGCOMP languages from Bolt, Beranek and Newman, MUMPS' earliest and most prominent use cases were in the field of health informatics.
1.3 snw 92: .[
1.15 snw 93: greenes1970
1.3 snw 94: .]
95: .[
1.15 snw 96: pendergrass1969
1.3 snw 97: .]
1.15 snw 98: .PP
99: MUMPS code is divided into program units referred to as \fIroutines\fR, which are roughly analagous to \fImodules\fR or \fIcompilation units\fR in more mainstream languages. Routines are then further divided into labels (or \fItags\fR in MUMPS parlance), which serve as entry points into the routine. Subroutines and functions (the latter known as \fIextrinsic functions\fR) are introduced as tags with an optional, parenthesized \fIformallist\fR, being a list of parameters expected by the subroutine or extrinsic function.
100: .PP
101: Perhaps the most unique feature of M, the \fIglobal\fR, is a persistent, hierarchical, sparse array allowing developers to easily implement database features directly in the application's primary development language:
102: .IP
103: .DS L
104: .ft C
105: ROUTINE ;
106: SET ^PEOPLE("Willis, Serena","DOB")="1980-12-01"
107: SET ^PEOPLE("Willis, Serena","SEX")="F"
108: SET ^PEOPLE("Willis, Serena","COUNTRY")="US"
109: .ft
110: .PP
111: The above routine would be called with \fIDO ^ROUTINE\fR, resulting in a data structure in fixed storage where the elements (known in M parlance as \fIsubscripts\fR), i.e., \fI"Willis, Serena"\fR, are automatically sorted on insertion, allowing for rapid retrieval. Rough analogues can be found in the \fIPICK\fR operating system, as well as BBN \fIFILECOMP\fR, the latter of which was a direct influence in the early development of M.
112: .KS
113: .PP
114: Early versions of M included \fIMGH MUMPS\fR from Massachusetts General Hospital, and \fIDigital Standard MUMPS\fR from Digital Equipment Corporation. Notably, early commercial versions of M were commercial software, somewhat limiting the language's spread outside of its ecological niche of health informatics.
1.16 snw 115: .TS
116: center tab(#);
117: Cb Cb
118: L L.
119: Vendor#Implementation
120: Mass. General Hospital#MGH MUMPS
121: Digital Equipment Corp.#Digital Standard MUMPS (DSM)
122: InterSystems Corp.#InterSystems Standard MUMPS (ISM), Open M, Cache, IRIS Data Platform
123: Data Tree#Data Tree MUMPS (DTM)
124: Micronetics#Micronetics Standard MUMPS (MSM)
125: Patterson & Gray#PSM-11, PSM-32, PSM-V
126: MGlobal International Inc.#CCSM, MacMUMPS, M Global MUMPS, M3 Lite
127: U.C. Davis#MicroMUMPS
128: Ray Newman#MUMPS V1
129: Fourth Watch Software LC#Reference Standard M (RSM)
130: Kevin O'Kane#Mumps-II, Open Mumps, GPL Mumps
131: M21 Ltd.#M21
132: Fidelity National Information Services#GT.M (Greystone Technology MUMPS)
133: YottaDB#YottaDB
134: Eugene Karataev#MiniM
135: .TE
136: .CD
137: .SM
138: \fIFigure 1. Partial list of M implementations.\fR
139: .NL
140: .LD
1.15 snw 141: .KE
1.17 snw 142: .NH
143: EARLY HISTORY OF FREEM
1.1 snw 144: .PP
1.3 snw 145: FreeM was developed in Germany in the mid-1990s by a developer who went by the pseudonym \fIShalom ha-Ashkenaz\fR, whose actual identity remains unknown,
146: .[
1.9 snw 147: walters99
148: %P 19
1.3 snw 149: .]
1.14 snw 150: though it is thought by some that they are a dentist who learned C and developed FreeM on their own time. Shalom developed FreeM at a time when InterSystems Corporation (the company that developed the ISM implementation of M) was acquiring the majority of its competitors and absorbing their technology into their \fIOpen M\fR product, which would later become \fIInterSystems Cache\fR.
1.3 snw 151: .[
1.9 snw 152: ibid
153: %P 18
1.3 snw 154: .]
1.14 snw 155: .KS
156: .TS
157: center tab(#);
158: Cb Cb
159: L L.
160: Implementation#Year
161: DataTree MUMPS (DTM)#1993
162: Digital Standard MUMPS (DSM)#1995
163: .[
164: dsmAcquisition
165: .]
166: Micronetics Standard MUMPS (MSM)#1998
167: .TE
168: .CD
169: .SM
1.16 snw 170: \fIFigure 2. M implementations absorbed by InterSystems Corp.\fR
1.14 snw 171: .NL
172: .LD
173: .KE
1.15 snw 174: .PP
1.13 snw 175: Shalom wished to provide a community-driven, open-source implementation of M as a bulwark against the growing threat of single-vendor hegemony over the M language. Its design\(emas well as some of the documentation included with the original sources\(emindicate that FreeM was originally targeted to the MS-DOS family of operating systems. It made use of a very limited subset of the C library, and included instructions for renaming the MS-DOS style 8.3 filenames in order to compile under UNIX.
1.3 snw 176: .[
177: freemREADME
178: .]
1.5 snw 179: .KS
1.3 snw 180: .PP
181: At one point in FreeM's early history, Shalom ported FreeM from MS-DOS to SCO UNIX, the UNIX System V Release III-derived descendant of Microsoft XENIX, now known as SCO OpenServer\(ema platform still supported by FreeM today.
182: .[
183: portSCO
184: .]
185: This port brought support for the \fIscoansi\fR terminal type, including colors and ANSI X3.64 control mnemonics.
1.5 snw 186: .KE
1.17 snw 187: .NH
188: INITIAL INVOLVEMENT
1.15 snw 189: .PP
190: The author's mentor in computer programming and UNIX was Lawrence Landis, who involved himself heavily in the M programming language ca. 1991. Mr. Landis promoted the M language to the author from 1991 forward, and first demonstrated FreeM to her in August 1998. In 2010, the author incorporated her company, Coherent Logic Development, learned M, and began doing contract work in M through Mr. Landis's company, Fourth Watch Software.
191: .PP
192: Mr. Landis was the owner of FreeM's SourceForge repository
193: .[
194: gumpSF
195: .]
196: , which had not been touched in a number of years, following Fidelity National Information Services' decision to release GT.M under a free software license. In August 2011, the author downloaded the source code for FreeM and did enough work on it to enable building and running under modern GNU/Linux systems and posted it to the \fImumpster.org\fR forums.
197: .[
198: freem014
199: .]
200: .PP
201: In 2014, Mr. Landis gave the author administrator access to the FreeM SourceForge repository and transferred maintainership of the project to her.
202: .[
203: gumpSF
204: .]
1.17 snw 205: .NH
206: GENERIC UNIVERSAL M PROJECT
1.1 snw 207: .PP
1.5 snw 208: The \fIGeneric Universal M Project\fR was conceived by Richard F. Walters, a professor from U.C. Davis. The GUMP, following the rising popularity of object-oriented programming in the 1990s, was intended to be a toolkit allowing M implementations to be built from discrete components with a well-defined and well-specified public interface among these components. These components included the global handler (supplying the functionality of persistent global storage), and the interpreter/compiler (responsible for implementing M language commands). The components would have been able to communicate over a network, or in-process on the same host, enabling distributed computing functionality.
1.3 snw 209: .[
210: c2m
211: .]
212: .PP
213: Although the specification for the GUM interface to global handlers attained a reasonably well-specified level of completeness,
214: .[
215: gumapi
216: .]
1.9 snw 217: and Lawrence Landis and others developed a mostly-complete implementation of a GUM global handler,
1.3 snw 218: .[
219: gumpsrc
220: .]
221: none of the other envisioned components were ever completed, and specifically, the interpreter component was missing.
1.17 snw 222: .NH
223: FREEM DONATED TO MUG DEUTSCHLAND
1.1 snw 224: .PP
1.5 snw 225: In July of 1998, Shalom ha-Ashkenaz donated the FreeM source code (then known as FreeMUMPS) to the M User's Group-Deutschland (MUG-D), hoping the community would take the nascent implementation from its infancy through to a state of production-ready completeness and robustness. Shalom also placed a few conditions on his gift: a public release could not be made until a substantial set of milestones were reached. Per his conditions, the FreeMUMPS project must:
1.3 snw 226: .[
227: freemREADME
228: .]
1.1 snw 229: .IP \(bu 2
230: Implement the entirety of \fIANSI X11.1-1995\fR
231: .IP \(bu 2
232: Use Structured System Variables instead of \fIVIEW\fR commands and \fI$VIEW\fR functions
233: .IP \(bu 2
234: Raise the string size limits
235: .IP \(bu 2
236: Implement MWAPI, OMI, X11 bindings, and GKS bindings
237: .IP \(bu 2
238: Be substantially free of major bugs
239: .PP
240: Although MUG-D readily accepted the contribution of FreeMUMPS, the organization itself lacked the manpower and expertise to complete the implementation. Just as it is now, the intersection of M community members who know enough of the M language and C language to work on a project this ambitious was quite small.
1.17 snw 241: .NH
242: MERGING GUMP AND FREEM
1.1 snw 243: .PP
1.5 snw 244: Very shortly after the contribution of FreeMUMPS to MUG-D, Richard F. Walters and a small team of developers and administrative staff who had been working on the GUMP assumed maintainership of the FreeMUMPS source code, with Lawrence Landis managing the development efforts.
1.3 snw 245: .[
1.9 snw 246: shortWalters99
247: %P 19
1.3 snw 248: .]
249: This included representatives from the \fIM Technology Association\fR (an M vendor association having several foreign branches), the \fIM Development Committee\fR (the M standards organization hosting the ANSI/ISO standards for the M language, then sponsored by the M Technology Association), and others.
250: .[
251: freemContributors
252: .]
253: The goals of this team were to:
1.1 snw 254: .IP \(bu 2
255: Meet Shalom's requirements for a public release of FreeMUMPS
256: .IP \(bu 2
257: Convert FreeMUMPS into the first interpreter component of the GUMP
258: .PP
1.5 snw 259: During this period, Ronald L. Fox of Diagnostic Laboratory Services in Honolulu, HI (who passed in 2010)
1.3 snw 260: .[
261: ronFoxGrave
262: .]
263: ported FreeMUMPS from SCO UNIX to Red Hat 5 and glibc-6.
264: .[
265: ronFoxPort
266: .]
267: Steve "Saintly" Zeck of the U.C. Davis Veterinary Medical Teaching Hospital
268: .[
269: saintlyBio
270: .]
271: also attempted to rewrite the symbol table code to lift string size limits,
272: .[
273: saintlySymtab
274: .]
1.8 snw 275: David Whitten enhanced some of the implementation-specific extensions, and Lawrence Landis integrated Zeck's symbol table work.
1.3 snw 276: .PP
1.5 snw 277: In FreeM 0.1.0, the name of the implementation was changed from FreeMUMPS to Public Standard M, and again to Free Standard MUMPS and then FreeM when it was discovered leading up to the FreeM 0.2.0 release that the PSM acronym was already in use for Patterson & Gray's
1.3 snw 278: .[
1.18 snw 279: m_implementations
1.3 snw 280: .]
281: M implementation.
282: .[
283: Changes.GUM
284: .]
285: Dr. Walters also received the implementation ID of 49 from then secretary of the M Development Committee, Don Piccone.
286: .[
1.9 snw 287: ibid
1.3 snw 288: .]
1.1 snw 289: .PP
1.5 snw 290: One of the contributors to FreeM at this stage\(emprimarily in the area of M vendor routines\(emwas Axel Trocha, who would later maintain a private fork of FreeM.
1.3 snw 291: .[
292: trochaFork
293: .]
1.17 snw 294: .NH
295: GT.M RELEASED AS FREE SOFTWARE
1.1 snw 296: .PP
297: GT.M, an acronym for \fIGreystone Technology MUMPS\fR, is an M implementation that was released by Greystone Technology in 1986. Greystone was later acquired by Sanchez Computer Associates, which was in turn acquired by Fidelity National Information Services.
1.3 snw 298: .[
299: fisSanchezAcquisition
300: .]
1.18 snw 301: .KS
1.3 snw 302: .PP
303: When GT.M was released under the GNU General Public License in 2000,
304: .[
305: gtmRelease
306: .]
1.21 ! snw 307: it seemed to many to obviate the \fIraison d'etre\fR for FreeM, as GT.M was a well-established, robust, and high-performance M implementation with which FreeM could not then compete. Unfortunately, at this time, the GUMP and FreeM projects lost all of their momentum, and new development along these lines rapidly ceased. The final GUMP team release of FreeM was 0.5.0.
1.3 snw 308: .[
309: freem050
310: .]
311: However, Axel Trocha's private port would continue to be developed for some years.
1.7 snw 312: .KE
1.17 snw 313: .NH
314: FORKED BY AXEL TROCHA
1.1 snw 315: .PP
1.11 snw 316: When the free software release of GT.M stalled the GUMP team's progress on the primary branch of development, Axel Trocha, an aforementioned contributor, continued development on the FreeM source code. Trocha added many interesting features to the FreeM codebase, including:
1.1 snw 317: .IP \(bu 2
318: A native port to Microsoft Windows
319: .IP \(bu 2
320: Compiling FreeM as an Apache web server module, allowing FreeM to be used easily for web development
321: .IP \(bu 2
322: The ability to output HTML code in a heredoc-style format, with any line of code beginning with a left angle bracket being interpreted as HTML with support for interpolated M locals and globals
323: .IP \(bu 2
324: Extensions allowing FreeM to be used as a command-line shell, along the lines of UNIX \fIbash\fR, Windows \fIcmd.exe\fR, etc.
325: .PP
1.5 snw 326: Trocha also maintains ownership of the \fIfreem.net\fR Internet domain,
1.3 snw 327: .[
328: trochaDomain
329: .]
1.21 ! snw 330: and continued issuing public releases of his FreeM port on that site until sometime after 2004, at which point this fork was made entirely private. Currently, freem.net is a blank page. However, Trocha's fork of FreeM continues to the present
! 331: .[
! 332: trochaEmail
! 333: .]
! 334: as the back-end storage engine and programming environment for the \fIElven Runes\fR website.
1.3 snw 335: .[
336: elvenRunes
337: .]
1.5 snw 338: The author has communicated with Mr. Trocha on occasion, and though he is supportive of the author's efforts, has chosen to remain in the background.
1.17 snw 339: .NH
340: RESUMING PRIMARY DEVELOPMENT
1.1 snw 341: .PP
342: In 2011, the author downloaded the FreeM source code from the GUM Project's SourceForge repository\(emdormant since 2000\(emand updated it just enough that it would compile and run on modern GNU/Linux systems. The author also quickly updated FreeM to support terminal sizes larger than 80x24.
1.17 snw 343: .NH
344: TAKING MAINTAINERSHIP
1.1 snw 345: .PP
1.5 snw 346: In 2014, Lawrence Landis transferred administrative access of the GUMP repository, conferring maintainership of the primary branch of FreeM development to the author. Since then, many features have been added and many bugs corrected, including:
1.3 snw 347: .IP \(bu 2
348: Adding support for proper namespaces, configured through a \fIfreem.conf\fR file, which standardizes routine and global storage locations
349: .IP \(bu 2
350: Adding support for Structured System Variables
351: .IP \(bu 2
352: Adding support for the asynchronous event specification from MDC Type A proposal \fIX11/1998-28\fR
353: .[
354: x119828
355: .]
356: .IP \(bu 2
357: Adding support for constants via the \fICONST\fR keyword
358: .IP \(bu 2
359: Adding a \fIWITH\fR command allowing the specification of an implicit prefix to all subsequent variable references
360: .IP \(bu 2
361: Adding a runtime \fIWATCH\fR command, tracking changes to specified local or global variables
362: .IP \(bu 2
363: Adding an \fIASSERT\fR command, which will fail with an error message if the following expression evaluates \fIfalse\fR
364: .IP \(bu 2
365: Removing the Steve Zeck symbol table implementation\(emwhich was unreliable\(emand reverting to the original implementation
366: .IP \(bu 2
367: Adding support for the GNU \fIreadline\fR library, with persistent command line history and editing
368: .IP \(bu 2
369: Adding REPL-like functionality (in direct mode, any M expression beginning with a number will be prepended with an implicit \fIWRITE\fR)
370: .IP \(bu 2
371: Adding transaction processing
372: .IP \(bu 2
373: Adding \fIKVALUE\fR and \fIKSUBSCRIPTS\fR
374: .IP \(bu 2
375: Preparing to support the \fIM Windowing API\fR (MWAPI)
376: .IP \(bu 2
377: Adding the \fIfmadm\fR command-line utility, for system administration functions
378: .IP \(bu 2
379: Adding support for after-image journaling and forward recovery of globals
1.5 snw 380: .KS
1.3 snw 381: .IP \(bu 2
382: Writing a \fItexinfo\fR manual, from which the HTML manual is derived
383: .IP \(bu 2
384: Porting to Solaris/SPARC, Solaris/x86, Linux/s390x, Linux/armv6l, Linux/armv7l, SCO OpenServer 5.0.7, Tru64 UNIX/alpha, AIX/ppc, Mac OS X/x86, GNU HURD, Cygwin, NetBSD, FreeBSD, OpenBSD, and WSL1/2
1.11 snw 385:
1.5 snw 386: In addition, the FreeM web site
1.3 snw 387: .[
388: freemWebsite
389: .]
390: was created, to distribute downloads and documentation.
1.5 snw 391: .KE
1.17 snw 392: .NH
393: FUTURE
1.3 snw 394: .PP
1.5 snw 395: FreeM is envisioned as a client-oriented desktop M implementation, for developing graphical user interfaces that will run on mobile and desktop devices.
1.3 snw 396: .PP
397: The author also intends to adopt the original vision of the GUMP team, dividing FreeM's functionality into discrete components having a well-specified public interface, with the ability to run in distributed computing environments over a network.
398: .PP
399: FreeM's mission is to advance the state-of-the-art in M implementations, and push the evolution of the language forward. Maintaining portability to as many vintage and modern UNIX systems as possible is held as a high priority, while portability of M routines and MDC standards compliance will be maintained through the use of the new \fI$ZDIALECT\fR intrinsic special variable to ensure that such compliance does not conflict with the primary goal of elegantly advancing the state-of-the-art and finding new audiences for the concepts originated by Neil Pappalardo and Octo Barnett in 1966.
400: .PP
401: The FreeM project is also strongly committed to free software principles, and is firmly aligned with the goals of the GNU Project and the Free Software Foundation, believing that the ethical concerns surrounding proprietary software are at least as important as the practical concerns espoused by the Open Source movement.
402: .[
403: whyFreeSoftware
404: .]
1.17 snw 405: .NH
406: CONCLUSION
1.5 snw 407: .PP
1.7 snw 408: FreeM has seen a colorful and turbulent history, touched by many capable hands. Though public development of any strain of the implementation was dormant for nearly a decade, fourteen years of almost continuous development have passed since the project resumed in 2011, and a decade since official maintainership passed in 2014, and great progress has been made.
409: .PP
410: FreeM\(emas is the case for all M projects\(empresses forward in a period where the future of the M programming language is uncertain. M Development Committee efforts concurrent with FreeM development have been sporadic and have missed many milestones, the community's most prominent members are aging, and many organizations have migrated from large M applications to what is perceived as more "modern" replacements.
411: .PP
412: It is the opinion of the author that the tight integration of an expressive and dynamic language with a robust and performant persistent storage engine makes M a natural candidate for many new and general applications. Modern application development is plagued by overwhelming bars to entry, requiring mastery of many languages and database management systems and the bulky interfaces connecting them.
413: .PP
1.11 snw 414: Though not without significant warts accreted over the years, M has no such overhead. Thus, FreeM seeks to press its philosophical advantages by mitigating the language's accumulated cruft, and adding clean interfaces addressing the needs of today. With these goals in mind, development proceeds apace.
1.18 snw 415: .KS
1.20 snw 416: \" .NH
417: \" ACKNOWLEDGMENTS
418: \" .PP
419: \" Certainly, the intellects responsible for giving us M are too numerous to mention by name, but their importance cannot be overstated. The author would like to especially credit Lawrence Landis for his early and innumerable contributions to her development, both generally as a practitioner of software development, and specifically for introducing her to the M programming language, and inculcating in her a love of exploration and innovation.
420: \" .PP
421: \" Thanks are due also to David Wicksell, for countless hours of collaboration on FreeM spanning more than a decade, and for providing ideas and inspiration.
422: \" .PP
423: \" I would also like to thank Ken McGlothlen of Vista Expertise Network for his efforts in editing multiple drafts of this paper.
424: \" .PP
425: \" Finally, to my wife, Miriam\(ema brilliant technologist in her own right\(emand daughters, without whose inestimable patience and understanding as the author buries herself in countless passion projects, such projects would not be possible.
426: \" .KE
1.7 snw 427: .KS
1.17 snw 428: .NH
429: COPYRIGHT AND LICENSE
1.5 snw 430: .LP
1.6 snw 431: This document is Copyright \[co] 2025 Serena Willis
1.5 snw 432: .LP
433: Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License,
434: .[
435: gfdl
436: .]
437: Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover texts, and with no Back-Cover Texts.
438: .LP
1.21 ! snw 439: \fI$Id: freem_history.ms,v 1.20 2025/04/28 12:34:14 snw Exp $\fR
1.7 snw 440: .KE
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>