ML/1 (Macro Language/One) is a powerful general-purpose macro processor. Typical uses of ML/1 include: editing, modifying, correcting, or reformatting text files translating source code from one programming language to another acting as a source-code preprocessor to allow the user to add new syntactic forms to an existing programming language supporting program source-code parameterization (e.g. a parameter might determine whether debugging statements are to be included in the program source code that is passed to the compiler) ML/1 was developed in 1966 by Peter J. Brown as part of PhD research at Cambridge University in England. In 1984, Robert D. Eager, one of Peter Brown's colleagues at the University of Kent, rewrote ML/I, first in BCPL in 1981, and later in C in 1984, which increased its portability. Note that Peter Brown's original name for the language was ML/I, where (as in IBM's PL/I) the last character is the Roman numeral "I", not the Arabic numeral "1". Most subsequent implementations however have been called ML/1 (where the last character is the Arabic numeral "1"). Since then, ML/1 has been ported to many platforms and operating systems, including VMS, MVS, MS-DOS, OS/2, and UNIX. In his implementations of ML/1, Bob Eager has added features and capabilities in addition to those originally specified in Peter Brown's thesis. That version is available for multiple platforms via the ML/1 web site, http://www.ml1.org.uk . The ML/1 web site provides further information about ML/1, as well as documentation (including a tutorial, simple introductory guide, and full user manual). Although the total number of ML/1 users in the world is small, there are ML/1 users all over the world, and Bob has corresponded with ML/1 users in the United States, Canada, Australia, New Zealand, Germany, Holland, and India. In a 1976 paper, Andrew S. Tanenbaum describes using ML/I as a compiler-compiler. Overview ML/I accepts input in completely free form, treating data as a stream of bytes rather than a series of lines or records. It does not require any particular flag to indicate a macro expansion, which makes it particularly useful for processing arbitrary text. Replacements of text can be simple (e.g. PIG is to be replaced by DOG) or complex (e.g. replace the item between the third and fourth commas after the last full stop, by the contents of some counter). ML/I was used to implement several items of portable software, including itself. It was originally written