IMP Core Environment Standard Section 15: New include Facility *** WILL BE SHIFTED OUT OF STANDARD AS OF NEXT EDITION *** This section defines the extended include facility now becoming available on 3L-IMP compilers. This section, like the "language implications" section, will be removed elsewhere when we have a proper place in which IMP language definitions can reside. 15.1 Availability The facilities described in this document are available on all systems which use version 9.10 or above of the IMP first pass. Currently these are: Imp/Ns (NS32000 Panos) Imp/Ns/SysV (NS32000 Unix System V, eg Opus5) Imp/Mg (NS32000 Genix) Imp/42nix (NS32000 42nix) Imp/PeOs (PE3200 Os/32) Imp/PeUnix (PE3200 Unix Edition VII) Imp/New (VAX-11 VAX/VMS) Imp/New/Unix (VAX-11 UNIX 4.2BSD) Imp/Apollo (M68000 Aegis) Imp/Sun (M68000 Unix 4.2BSD) The extended facilities are neither available or planned for the following implementations, which are regarded as obsolescent and will be replaced with conforming implementations in due course: Vax IMP (version 6 or 8) Apollo (Dewar compiler) IBM (old compiler) 15.2 Rationale These new facilities have been introduced in order to make it easier to use include files for all the well-known reasons without making source programs system-dependent. The existing include statement has the problem that it requires a literal file name string. Inevitably this string becomes system-dependent which means that porting the program will necessitate a source change. The extension to include solves this problem by using symbolic names for the files which are to be included. On particular systems a small system-dependent module in the compiler translates these symbolic names into the appropriate actual file names. 15.3 Definition IMP include statements come in three forms: (i) "include" string constant [ "list" ] ; (ii) "from" module id "include" item list [ "list" ] ; (iii) "include" item list [ "list" ] ; Examples: (i) include "specs.inc" endoflist include "SYS$LIBRARY:nasty.inc" (ii) from LL include COMMON, FIXEDRULES from IMP include ASCII, EBCDIC endoflist (iii) include FRED, JIM include FORMATS, ROUTE endoflist Form (i) is also available in previous implementations. Forms (ii) and (iii) are new. In (ii), "module-id" is an IMP identifier and "item-list" is a list of items separated by commas where each item is an IMP identifier. Form (iii) is a version of (ii) where the module-id is a private one meaning "in the current place". This would normally be taken to mean the currently selected (default) directory on systems which support such a concept. Apart from their uses in the include statement the identifiers are ignored, in particular they will not clash with other local identifiers. 15.4 Scope The new forms of include statement are considered to have a scope in the same way that identifiers have a scope. This scope is used to inhibit the multiple inclusion of files. An include statement, or part of it, will be ignored if a previous include which is still in scope caused the inclusion of a file identified by the same module-id and item-id. Note that as the old form of include statement does not include a module-id or item-id, they will be included each time they are encountered in the source. For example assume that the files identified by A, B and C (in a manner as yet unspecified) have the following contents: File A: recordformat F(integer x, y, z) endoffile File B: include A externalroutinespec Print Record(record (F) name R) endoffile File C: include A externalroutinespec Read Record(record (F) name R) endoffile The following sample program is then quite valid: begin routine Process include B include C {this will not include A again} include B {this will do nothing} end routine Analyse include B {this will cause A and the spec of} {Print Record to be included} end endofprogram 15.5 Implementation The mapping between the pair (module-id, item-id) and the external object to which the pair corresponds is implementation defined (DEF0008; mapping of include facility). Note that the external object need not be an operating system file; it may, for example, be an element in a text library or internal to the compiler itself. The two module-ids IMP and SYSTEM are reserved over all systems to have special meaning. The module-id IMP is reserved for use by the core environment standard. The module-id SYSTEM is reserved for use by individual implementors, for example to provide interfaces to operating system facilities. 15.6 Example On the Vax/VMS implementation the following two complete programs would be identical. begin begin from IMP include MATHS, include "IMP_INCLUDE:MATHS.INC" ASCII include "IMP_INCLUDE:ASCII.INC" <text of program> <text of program> end of program end of program For form (ii), the VAX/VMS implementation generates a filename of the form: module-id _INCLUDE: item-id .INC For form (iii), the VAX/VMS implementation generates a filename of the form: item-id .INC The above rule for form (ii) may be overridden by means of an environment definition file. The Lattice installations use this to separate the IMP include files for the VAX compiler from those of other target implementations. 15.7 Error Conditions For implementation reasons the following two errors could be generated: 1. Include files nested too deeply. Currently the limit of nesting of include files is 5. This limitation is imposed by the "old" style of non-nesting OPEN in the VAX run-time system. This limitation will be lifted when no such run-time systems remain available. 2. File <file-id> has not been included. This is caused by an include statement with a list of items where after the processing of one member of the list the scope (textual level) has changed from that of the whole include statement. This is caused by including files which contain unmatched BEGIN, END or procedure statements. If this effect is really wanted it can be achieved by splitting the include statement into two or more. That is, instead of writing: from LL include GATEBITS, ROUTEBITS, DRAWBITS write: from LL include GATEBITS from LL include ROUTEBITS from LL include DRAWBITS