7 .. image:: /images/picA.png
14 lmost as rarely as an alchemist producing gold from base metal, the
15 compilation process turns your source file into a story file (though the
16 more usual outcome is a reproachful explanation of why -- *again* --
17 that hasn't happened). The magic is performed by the compiler program,
18 which takes your more or less comprehensible code and translates it into
19 a binary file: a collection of numbers following a specific format
20 understood only by Z-code interpreters.
22 On the surface, compilation is a very simple trick. You just run the
23 compiler program, indicating which is the source file from which you
24 wish to generate a game and presto! The magic is done.
26 However, the ingredients for the spell must be carefully prepared. The
27 compiler "reads" your source code, but not as flexibly as a human would.
28 It needs the syntax to follow some very precise rules, or it will
29 complain that it cannot do its job under these conditions. The compiler
30 cares little for meaning, and a lot about orthography, like a most
31 inflexible teacher; no moist Bambi eyes are going to save you here.
33 Although the spell made by the compiler is always the same one, you can
34 indicate up to a point how you want the magic to happen. There are a few
35 options to affect the process of compilation; some you define in the
36 source code, some with *switches* and certain commands when you run
37 the program. The compiler will work with some default options if you
38 don’t define any, but you may change these if you need to. Many of these
39 options are provided "just in case" special conditions apply; others are
40 meant for use of experienced designers with advanced and complex
41 requirements, and are best left (for now) to those proficient in the
47 If the source file is not written correctly the compiler will protest,
48 issuing either a *warning* message or an *error* message. Warnings are
49 there to tell you that there may be a mistake that could affect the
50 behaviour of the game at run-time; that won't stop the compiler from
51 finishing the process and producing a story file. Errors, on the other
52 hand, reflect mistakes that make it impossible for the compiler to
53 output such a file. Of these, *fatal* errors stop compilation
54 immediately, while *non-fatal* errors allow the compiler to continue
55 reading the source file. (As you’ll see in a minute, this is perhaps a
56 mixed blessing: while it can be useful to have the compiler tell you
57 about as many non-fatal errors as it can, you'll often find that many of
58 them are caused by the one simple slip-up.)
60 .. rubric:: Fatal errors
62 It's difficult – but not impossible – to cause a fatal error. If you
64 file name as source file, the compiler won’t even be able to start,
67 :samp:`Couldn't open source file {filename}`
69 If the compiler detects a large number of non-fatal errors, it may
70 abandon the whole process with:
72 :samp:`Too many errors: giving up`
74 Otherwise, fatal errors most commonly occur when the compiler runs out
75 of memory or disk space; with today's computers, that's pretty unusual.
76 However, you may hit problems if the story file, which must fit within
77 the fairly limited resources specified by the Z-machine, becomes too
78 large. Normally, Inform compiles your source code into a Version 5 file
79 (that’s what the ``.z5`` extension you see in the output file
80 indicates), with a maximum size of 256 Kbytes. If your game is larger
81 than this, you’ll have to compile into Version 8 file (``.z8``), which
82 can grow up to 512 Kbytes (and you do this very simply by setting the
83 :option:`-v8` switch; more on that in a minute). It takes a surprising amount
84 of code to exceed these limits; you won’t have to worry about game size
85 for the next few months, if ever.
87 .. rubric:: Non-fatal errors
89 Non-fatal errors are much more common. You'll learn to be friends with:
91 :samp:`Expected {something} but found {something else}`
93 This is the standard way of reporting a punctuation or syntax mistake.
94 If you type a comma instead of a semicolon, Inform will be looking for
95 something in vain. The good news is that you are pointed to the
96 offending line of code::
98 Tell.inf(76): Error: Expected directive, '[' or class name but found found_in
100 Compiled with 1 error (no output)
102 You see the line number (76) and what was found there, so you run to the
103 source file and take a look; any decent editor will display numbers
104 alongside your lines if you wish, and will usually let you jump to a
105 given line number. In this case, the error was caused by a semicolon
106 after the description string, instead of a comma:
108 .. code-block:: inform
110 Prop "assorted stalls"
111 with name 'assorted' 'stalls',
112 description "Food, clothing, mountain gear; the usual stuff.";
113 found_in street below_square,
116 Here's a rather misleading message which maybe suggests that things in
117 our source file are in the wrong order, or that some expected
118 punctuation is missing::
120 Fate.inf(459): Error: Expected name for new object or its textual short name
123 Compiled with 1 error (no output)
125 In fact, there's nothing wrong with the ordering or punctuation. The
126 problem is actually that we've tried to define a new object with an
127 internal ID of ``door`` -- reasonably enough, you might think, since the
128 object *is* a door -- but Inform already knows the word (it's the name
129 of a library attribute). Unfortunately, the error message provides only
130 the vaguest hint that you just need to choose another name: we used
131 ``toilet_door`` instead.
133 Once the compiler is off track and can't find what was expected, it's
134 common for the following lines to be misinterpreted, even if there's
135 nothing wrong with them. Imagine a metronome ticking away in time with a
136 playing record. If the record has a scratch and the stylus jumps, it may
137 seem that the rest of the song is out of sync, when it's merely a bit
138 "displaced" because of that single incident. This also happens with
139 Inform, which at times will give you an enormous list of things Expected
140 but not Found. The rule here is: correct the first mistake on the list
141 and recompile. It may be that the rest of the song was perfect.
143 It would be pointless for us to provide a comprehensive list of errors,
144 because mistakes are numerous and, anyhow, the explanatory text usually
145 indicates what was amiss. You'll get errors if you forget a comma or a
146 semicolon. You'll get errors if your quotes or brackets don't pair up
147 properly. You'll get errors if you use the same name for two things.
148 You'll get errors -- for many reasons. Just read the message, go to the
149 line it mentions (and maybe check those just before and after it as
150 well), and make whatever seems a sensible correction.
154 Warnings are not immediately catastrophic, but you should get rid of them
155 to ensure a good start at finding run-time mistakes (see :doc:`16`). You
156 may declare a variable and then not use it; you may mistake assignment and
157 arithmetic operators (``=`` instead of ``==``); you may forget the comma
158 that separates properties, etc. For all these and many other warnings,
159 Inform has found something which is legal but doubtful.
161 One common incident is to return in the middle of a statement block,
162 before the rest of statements can be reached. This is not always as
163 evident as it looks, for instance in a case like this:
165 .. code-block:: inform
167 if (steel_door has open) {
168 print_ret "The breeze blows out your lit match.";
172 In the above example, the ``print_ret`` statement returns true after the
173 string has been printed, and the ``give match ~light`` line will never
174 happen. Inform detects the fault and warns you. Probably the designer's
177 .. code-block:: inform
179 if (steel_door has open) {
181 print_ret "The breeze blows out your lit match.";
184 Compiling *à la carte*
185 ======================
187 One of the advantages of Inform is its portability between different
188 systems and machines. Specific usage of the compiler varies accordingly,
189 but some features should be in all environments. To obtain precise
190 information about any particular version, run the compiler with the
191 :option:`-h1` switch -- see :ref:`switches`.
193 Often the compiler is run with the name of your source file as its only
194 parameter. This tells the compiler to "read this file using Strict mode and
195 from it generate a Version 5 story file of the same name". The source file
196 is mostly full of statements which define how the game is to behave at
197 run-time, but will also include compile-time instructions directed at the
198 compiler itself (although such an instruction looks a lot like a
199 :term:`statement`, it's actually quite different in what it does, and is
200 known as a :term:`directive`). We have already seen the ``Include``
203 :samp:`Include "{filename}";`
205 When the compiler reaches a line like this, it looks for
206 :samp:`{filename}` -- another file also containing Inform code -- and
207 processes it as if the statements and directives included in
208 :samp:`{filename}` were in that precise spot where the ``Include``
211 .. image:: /images/includes.png
214 In every Inform game we Include the library files ``Parser``,
215 ``VerbLib`` and ``Grammar``, but we may Include other files. For
216 example, this is the way to incorporate library extensions contributed
217 by other people, as you saw when we incorporated ``pname.h`` into our
222 On some machines, a library file is actually called -- for example --
223 ``Parser.h``, on others just ``Parser``. The compiler automatically
224 deals with such differences; you can *always* type simply ``Include
225 "Parser";`` in your source file.
227 As you grow experienced in Inform, and your games become more complex,
228 you may find that the source file becomes unmanageably large. One useful
229 technique is then to divide it into a number of sections, each stored in
230 a separate file, which you Include into a short master game file. For
233 .. code-block:: inform
235 !============================================================================
236 Constant Story "War and Peace";
238 "^An extended Inform example
239 ^by me and Leo Tolstoy.^";
254 !============================================================================
261 When you run the compiler you can set some optional controls; these are
262 called *switches* because most of them are either on or off (although a
263 few accept a numeric value 0–9). Switches affect compilation in a
264 variety of ways, often just by changing the information displayed by the
265 compiler when it’s running. A typical command line (although this may
266 vary between machines) would be:
268 :samp:`inform {source_file story_file switches}`
270 where "``inform``" is the name of the compiler, the :samp:`{story_file}` is
271 optional (so that you can specify a different name from the
272 :samp:`{source_file}`) and the switches are also optional. Note that
273 switches must be preceded by a hyphen ``-``; if you want to set, for
274 instance, Strict mode, you'd write :option:`-S` , while if you want to
275 deactivate it, you’d write :option:`-~S`. The tilde sign can, as elsewhere,
276 be understood as "not". If you wish to set many switches, just write them
277 one after another separated by spaces and each with its own hyphen, or
278 merge them with one hyphen and no spaces::
280 inform MyGame.inf -S -s -X
282 inform MyGame.inf -Ssx
284 Although there's nothing wrong with this method, it isn't awfully
285 convenient should you need to change the switch settings. A more
286 flexible method is to define the switches at the very start of your
287 source file, again in either format::
293 Normally, all switches are off by default, except Strict mode
294 (:option:`-S`), which is on and checks the code for additional
295 mistakes. It's well worth adding Debug mode (:option:`-D`), thus making the
296 debugging verbs available at run time. This is the ideal setting while
297 coding, but you should turn Debug mode off (just remove the :option:`-D`)
298 when you release your game to the public. This is fortunately very easy to
299 check, since the game banner ends with the letter "D" if the game was
300 compiled in Debug mode:
302 .. code-block:: transcript
305 A simple Inform example
306 by Roger Firth and Sonja Kesserich.
307 Release 3 / Serial number 040804 / Inform v6.30 Library 6/11 SD
309 Switches are case sensitive, so you get different effects from ``-x``
310 and ``-X``. Some of the more useful switches are:
315 Set compiler Strict mode on or off, respectively. Strict mode activates
316 some additional error checking features when it reads your source file.
317 Strict mode is on by default.
322 Compile to this version of story file. Versions 5 (on by default) and
323 8 are the only ones you should ever care about; they produce,
324 respectively, story files with the extensions .z5 and .z8. Version 5
325 was the Advanced Infocom design, and is the default produced by
326 Inform. This is the version you'll normally be using, which allows
327 file sizes up to 256 Kbytes. If your game grows beyond that size,
328 you'll need to compile to the Version 8 story file, which is very
329 similar to Version 5 but allows a 512 Kbytes file size.
334 Include respectively the debugging verbs and the Infix debugger in the
335 story file (see :doc:`16`).
340 Display help information about the compiler. :option:`-h1` produces
341 innformation about file naming, and :option:`-h2` about the available
347 :option:`-n` displays the number of declared attributes, properties and
348 actions. :option:`-j` lists objects as they are being read and constructed
354 Offer game statistics (or not). This provides a lot of information about
355 your game, including the number of objects, verbs, dictionary entries,
356 memory usage, etc., while at the same time indicating the maximum
357 allowed for each entry. This can be useful to check whether you are
358 nearing the limits of Inform.
362 Record all the text of the game into a temporary file, useful to check
363 all your descriptions and messages by running them through a spelling
366 If you run the compiler with the :option:`-h2` switch, you’ll find that
367 there are many more switches than these, offering mostly advanced or
368 obscure features which we consider to be of little interest to beginners.
369 However, feel free to try whatever switches catch your eye; nothing you try
370 here will affect your source file, which is strictly read-only as far as
371 the compiler is concerned.