1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-03 07:24:58 +03:00
inform7/docs/inter/M-dpiti.html

445 lines
37 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Data Packages in Textual Inter</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="index.html"><span class="selectedlink">inter</span></a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../pipeline-module/index.html">pipeline</a></li>
<li><a href="../final-module/index.html">final</a></li>
</ul><h2>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Data Packages in Textual Inter' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Compiler Tools</a></li><li><a href="index.html">inter</a></li><li><a href="index.html#M">Manual</a></li><li><b>Data Packages in Textual Inter</b></li></ul></div>
<p class="purpose">How static data, variables and constants are expressed in textual inter programs.</p>
<ul class="toc"><li><a href="M-dpiti.html#SP1">&#167;1. Data packages</a></li><li><a href="M-dpiti.html#SP2">&#167;2. Kinds and values</a></li><li><a href="M-dpiti.html#SP5">&#167;5. Enumerations and instances</a></li><li><a href="M-dpiti.html#SP6">&#167;6. Properties of instances</a></li><li><a href="M-dpiti.html#SP7">&#167;7. Constants</a></li><li><a href="M-dpiti.html#SP9">&#167;9. Global variables</a></li><li><a href="M-dpiti.html#SP10">&#167;10. Metadata</a></li><li><a href="M-dpiti.html#SP11">&#167;11. Append and Link</a></li><li><a href="M-dpiti.html#SP12">&#167;12. Nop</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Data packages. </b>To recap: a file of textual inter has a brief global section at the top, and
is then a hierarchiy of package definitions. Each package begins with a
symbols table, but then has contents which depend on its type. This section
covers the possible contents for a data package, that is, one whose type
is not <span class="extract"><span class="extract-syntax">_code</span></span>. Note that, in particular, the <span class="extract"><span class="extract-syntax">main</span></span> package is always a
data package, so there must be at least one in the program.
</p>
<p class="commentary">"Data" is a slightly loose phrase for what data packages contain: it
includes metadata, and indeed almost anything other than actual executable
code. Data packages, unlike code packages, can also contain other packages
(of either sort).
</p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Kinds and values. </b>Inter is a very loosely typed language, in the sense that it is possible
to require that values conform to particular data types. As in Inform, data
types are called "kinds" in this context (which usefully distinguishes them
from "types" of packages, a completely different concept).
</p>
<p class="commentary">No kinds are built in: all must be declared before use. However, these
declarations are able to say something about them, so they aren't entirely
abstract. The syntax is:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> NAME CONTENT</span>
</pre>
<p class="commentary">The <span class="extract"><span class="extract-syntax">NAME</span></span>, like all names, goes into the owning package's symbol table;
other packages wanting to use this kind will have to have an <span class="extract"><span class="extract-syntax">external</span></span>
symbol pointing to this definition.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">CONTENT</span></span> must be one of the following:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">unchecked</span></span>, meaning that absolutely any data can be referred to by this type;
</li><li>(b) <span class="extract"><span class="extract-syntax">int32</span></span>, <span class="extract"><span class="extract-syntax">int16</span></span>, <span class="extract"><span class="extract-syntax">int8</span></span>, <span class="extract"><span class="extract-syntax">int2</span></span>, for numerical data stored in these numbers
of bits (which the program may choose to treat as character values, as flags,
as signed or unsigned integers. and so on, as it pleases);
</li><li>(c) <span class="extract"><span class="extract-syntax">text</span></span>, meaning text;
</li><li>(d) <span class="extract"><span class="extract-syntax">enum</span></span>, meaning that data of this kind must be equal to one (and only one)
of the enumerated constants with this kind;
</li><li>(e) <span class="extract"><span class="extract-syntax">table</span></span>, a special sort of data referring to tables made up of columns each
of which has a different kind;
</li><li>(f) <span class="extract"><span class="extract-syntax">list of K</span></span>, meaning that data must be a list, each of whose terms is
data of kind <span class="extract"><span class="extract-syntax">K</span></span> &mdash; which must be a kind name known to the symbols table
of the package in which this definition occurs;
</li><li>(g) <span class="extract"><span class="extract-syntax">column of K</span></span>, similarly, but for a table column;
</li><li>(h) <span class="extract"><span class="extract-syntax">relation of K1 to K2</span></span>, meaning that data must be such a relation, in the
same sort of sense as in Inform;
</li><li>(i) <span class="extract"><span class="extract-syntax">description of K</span></span>, meaning that data must be a description which either
matches or does not match values of kind <span class="extract"><span class="extract-syntax">K</span></span>;
</li><li>(j) <span class="extract"><span class="extract-syntax">struct</span></span>, which is similar to <span class="extract"><span class="extract-syntax">list of K</span></span>, but which has entries which do
not all have to have the same kind;
</li><li>(k) and <span class="extract"><span class="extract-syntax">routine</span></span>, meaning that data must be references to functions.
</li></ul>
<p class="commentary">For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_egtable_col1</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_column_of_number</span><span class="plain-syntax"> = { </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">, </span><span class="constant-syntax">16</span><span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">k_list_of_bool</span><span class="plain-syntax"> </span><span class="reserved-syntax">list</span><span class="plain-syntax"> </span><span class="reserved-syntax">of</span><span class="plain-syntax"> </span><span class="identifier-syntax">k_boolean</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_grammatical_tense</span><span class="plain-syntax"> </span><span class="reserved-syntax">enum</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>In the remainder of this specification, <span class="extract"><span class="extract-syntax">VALUE</span></span> means either the name of
a defined <span class="extract"><span class="extract-syntax">constant</span></span> (see below), or else a literal.
</p>
<p class="commentary">A literal <span class="extract"><span class="extract-syntax">int32</span></span>, <span class="extract"><span class="extract-syntax">int16</span></span>, <span class="extract"><span class="extract-syntax">int8</span></span>, or <span class="extract"><span class="extract-syntax">int2</span></span> can be written as any of the
following:
</p>
<ul class="items"><li>(a) a decimal integer which may begin with a minus sign (and, if so, will be
interpreted as twos-complement signed);
</li><li>(b) a hexadecimal imteger prefixed with <span class="extract"><span class="extract-syntax">0x</span></span>, which can write the digits
<span class="extract"><span class="extract-syntax">A</span></span> to <span class="extract"><span class="extract-syntax">F</span></span> in either upper or lower case form, but cannot take a minus sign;
</li><li>(c) a binary integer prefixed with <span class="extract"><span class="extract-syntax">0b</span></span>, which cannot take a minus sign.
</li></ul>
<p class="commentary">For example, <span class="extract"><span class="extract-syntax">-231</span></span>, <span class="extract"><span class="extract-syntax">0x21BC</span></span> and <span class="extract"><span class="extract-syntax">0b1001001</span></span> are all valid. If the literal
supplied is too large to fit into the kind, an error is thrown.
</p>
<p class="commentary">A literal <span class="extract"><span class="extract-syntax">list</span></span> is writtem in braces: <span class="extract"><span class="extract-syntax">{ V1, V2, ..., Vn }</span></span>, where <span class="extract"><span class="extract-syntax">V1</span></span>,
<span class="extract"><span class="extract-syntax">V2</span></span> and so on must all be acceptable literals for the entry kind of the
list. For example, <span class="extract"><span class="extract-syntax">{ 2, 3, 5, 7, 11, 13, 17, 19 }</span></span>. The same notation is
also accepted for a <span class="extract"><span class="extract-syntax">struct</span></span>, a <span class="extract"><span class="extract-syntax">column</span></span> or a <span class="extract"><span class="extract-syntax">table</span></span>. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_egtable_col1</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_column_of_number</span><span class="plain-syntax"> = { </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">, </span><span class="constant-syntax">16</span><span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_egtable_col2</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_column_of_colour</span><span class="plain-syntax"> = { </span><span class="identifier-syntax">I_green</span><span class="plain-syntax">, </span><span class="reserved-syntax">undef</span><span class="plain-syntax">, </span><span class="identifier-syntax">I_red</span><span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_egtable</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_table</span><span class="plain-syntax"> = { </span><span class="identifier-syntax">C_egtable_col1</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_egtable_col2</span><span class="plain-syntax"> }</span>
</pre>
<p class="commentary">A list-like notation can also be used for a "calculated literal". This is
a single value, but which we may not be able to evaluate at inter generation
time. For example, if we do not yet know the value of <span class="extract"><span class="extract-syntax">X</span></span>, we can write
<span class="extract"><span class="extract-syntax">sum{ X, 1 }</span></span> to mean <span class="extract"><span class="extract-syntax">X+1</span></span>. A present, addition is the only operation
catered for in this way.
</p>
<p class="commentary">A literal <span class="extract"><span class="extract-syntax">text</span></span> is written in double quotes, <span class="extract"><span class="extract-syntax">"like so"</span></span>. All characters
within such text must have Unicode values of 32 or above, except for tab (9),
writtem <span class="extract"><span class="extract-syntax">\t</span></span>, and newline (10), written <span class="extract"><span class="extract-syntax">\n</span></span>. In addition, <span class="extract"><span class="extract-syntax">\"</span></span> denotes a
literal double-quote, and <span class="extract"><span class="extract-syntax">\\</span></span> a literal backslash, but these are the only
backslash notations at present allowed.
</p>
<p class="commentary">There are then a number of notations which look like texts, prefixed by
indicative characters.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">r"text"</span></span> makes a literal real number: the text is required to take the
same form as a literal real number in Inform 6. The result is valid
for use in an <span class="extract"><span class="extract-syntax">int32</span></span>, where it is interpreted as a float. For example,
<span class="extract"><span class="extract-syntax">r"$+1.027E+5"</span></span>.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">dw"text"</span></span> is meaningful only for interactive fiction, and represents the
command parser dictionary entry for the word <span class="extract"><span class="extract-syntax">text</span></span>. This is equivalent
to the Inform 6 constant <span class="extract"><span class="extract-syntax">'text//'</span></span>. <span class="extract"><span class="extract-syntax">dwp"text"</span></span> is the same, but pluralised,
equivalent to Inform 6 <span class="extract"><span class="extract-syntax">'text//p'</span></span>. Again, these can be stored in an <span class="extract"><span class="extract-syntax">int32</span></span>.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">&amp;"text"</span></span> makes a literal value called a "glob". This is not a respectful
term, and nor does it deserve one. A glob is a raw Inform 6 expression,
which can't (easily) be compiled for any other target, but is simply
copied literally through. Its kind is <span class="extract"><span class="extract-syntax">unchecked</span></span>, so it can be used
absolutely anywhere.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">^"text"</span></span> is not really a value at all, and is called a "divider". This
is really a form of comment used in the middle of long lists. Thus the
list <span class="extract"><span class="extract-syntax">{ 1, 2, ^"predictable start", 3721, -11706 }</span></span> is actually a list of four values
but which should be compiled on two lines with the comment in between:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, ! predictable start</span>
<span class="plain-syntax"> </span><span class="constant-syntax">3721</span><span class="plain-syntax">, -11706</span>
</pre>
<p class="commentary">(As unnecessary as this feature seems, it does make the code produced by
Inform look a lot more readable when it finally reaches Inform 6.)
</p>
<p class="commentary">The literal <span class="extract"><span class="extract-syntax">undef</span></span> can be used to mean "this is not a value".
</p>
<p class="commentary">Convention. It is intended that Inform will never make use of globs, but
at present about 30 globs persist in typical inter produced by Inform.
None of these are generated by Inform 7 as such: they all arise from the
oddball expressions in the template code which the code generator can't
</p>
<ul class="items"><li>(yet) assimilate.
</li></ul>
<p class="commentary">Inform generates <span class="extract"><span class="extract-syntax">undef</span></span> values to represent missing entries in tables,
but otherwise makes no use of them.
</p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Kinds have "default values": if some piece of storage has to hold a value
of kind <span class="extract"><span class="extract-syntax">K</span></span>, but that value is not specified, then the default is used.
For example, the default <span class="extract"><span class="extract-syntax">int32</span></span> is zero.
</p>
<p class="commentary">This can be controlled using <span class="extract"><span class="extract-syntax">defaultvalue KIND = VALUE</span></span>. For example,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">defaultvalue</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_boolean</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Enumerations and instances. </b>As noted above, some kinds marked as <span class="extract"><span class="extract-syntax">enum</span></span> are enumerated. This means
that they can have only a finite number of possible values, each of which
is represented in textual inter by a different name.
</p>
<p class="commentary">These values are called "instances" and must also be declared. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_grammatical_tense</span><span class="plain-syntax"> </span><span class="reserved-syntax">enum</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> </span><span class="identifier-syntax">I_present_tense</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_grammatical_tense</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> </span><span class="identifier-syntax">I_past_tense</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_grammatical_tense</span>
</pre>
<p class="commentary">It is also possible to specify numerical values to be used at run-time:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> </span><span class="identifier-syntax">I_present_tense</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_grammatical_tense</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span>
</pre>
<p class="commentary">If so, then such values must all be different (for all instances of that kind).
Enum values must fit into an <span class="extract"><span class="extract-syntax">int16</span></span>.
</p>
<p class="commentary">Enumerations, but no other kinds, may have "subkinds", as in this example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_object</span><span class="plain-syntax"> </span><span class="reserved-syntax">enum</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> K1_room &lt;= </span><span class="identifier-syntax">K_object</span>
</pre>
<p class="commentary">This creates a new <span class="extract"><span class="extract-syntax">enum</span></span> kind <span class="extract"><span class="extract-syntax">K1_room</span></span>. Values of this are a subset of
the values for its parent, <span class="extract"><span class="extract-syntax">K_object</span></span>: thus, an instance of <span class="extract"><span class="extract-syntax">K1_room</span></span> is
automatically also an instance of <span class="extract"><span class="extract-syntax">K_object</span></span>. This new subkind can itself
have subkinds, and so on.
</p>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Properties of instances. </b>A "property" is a named value attached to all instances of a given kind,
and must be created before use with:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">property</span><span class="plain-syntax"> NAME KIND</span>
</pre>
<p class="commentary">which declares that <span class="extract"><span class="extract-syntax">NAME</span></span> is a property whose value has the given <span class="extract"><span class="extract-syntax">KIND</span></span>;
however, it doesn't say which kind(s) can have this property, so we also
have to give one or more "permissions", in the form
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">permission</span><span class="plain-syntax"> NAME KIND</span>
</pre>
<p class="commentary">And once that is done, actual values can be assigned with:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">propertyvalue</span><span class="plain-syntax"> NAME OWNER = VALUE</span>
</pre>
<p class="commentary">where <span class="extract"><span class="extract-syntax">OWNER</span></span> can either be the name of a whole kind, in which case this sets
the default value of the property for instances of that kind, or else the name
of a specific instance, in which case this sets just the property of a single
thing. In either case, it is an error to do this unless the necessary
permission has been established.
</p>
<p class="commentary">The given value is just the initial state; at run-time, it can be changed to
another value (of the same kind).
</p>
<p class="commentary">For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_object</span><span class="plain-syntax"> </span><span class="reserved-syntax">enum</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_text</span><span class="plain-syntax"> </span><span class="reserved-syntax">text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">property</span><span class="plain-syntax"> </span><span class="identifier-syntax">P_printed_name</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">permission</span><span class="plain-syntax"> </span><span class="identifier-syntax">P_printed_name</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_object</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">propertyvalue</span><span class="plain-syntax"> </span><span class="identifier-syntax">P_printed_name</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_object</span><span class="plain-syntax"> = </span><span class="string-syntax">"something"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> </span><span class="identifier-syntax">I_ball</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_object</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">propertyvalue</span><span class="plain-syntax"> </span><span class="identifier-syntax">P_printed_name</span><span class="plain-syntax"> </span><span class="identifier-syntax">I_ball</span><span class="plain-syntax"> = </span><span class="string-syntax">"beach ball"</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Constants. </b>A constant definition assigns a name to a given value: where that name is
used, it evaluates to this value. The syntax is:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> NAME KIND = VALUE</span>
</pre>
<p class="commentary">where the value given must itself be a constant or literal, and must conform
to the given kind. As always, this is conformance only in the very weak
system of type checking used by Inter: if either the value or the constant
has an <span class="extract"><span class="extract-syntax">unchecked</span></span> kind, then the test is automatically passed.
</p>
<p class="commentary">For example,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_number</span><span class="plain-syntax"> </span><span class="reserved-syntax">int32</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> favourite_prime </span><span class="identifier-syntax">K_number</span><span class="plain-syntax"> = </span><span class="constant-syntax">16339</span>
</pre>
<p class="commentary">Constants can have any kind, including enumerated ones, but if so then that
does not make them instances. For example,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_colour</span><span class="plain-syntax"> </span><span class="reserved-syntax">enum</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_red</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_colour</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_green</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_colour</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_favourite</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_colour</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C_green</span>
</pre>
<p class="commentary">does not make <span class="extract"><span class="extract-syntax">C_favourite</span></span> a new possible colour: it's only a synonym for
the existing <span class="extract"><span class="extract-syntax">C_green</span></span>.
</p>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>If a constant needs to refer to a function, we seem to run into the limitation
that there's no notation for literal functions. In fact there is, though:
that's what code packages are. For example,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_number</span><span class="plain-syntax"> </span><span class="reserved-syntax">int32</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_number_to_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_number</span><span class="plain-syntax"> -&gt; </span><span class="identifier-syntax">K_number</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">package</span><span class="plain-syntax"> </span><span class="identifier-syntax">R_101_B</span><span class="plain-syntax"> _code</span>
<span class="plain-syntax"> ...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">R_101</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_number_to_number</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R_101_B</span>
</pre>
<p class="commentary">defines the constant <span class="extract"><span class="extract-syntax">R_101</span></span>. Note that <span class="extract"><span class="extract-syntax">R_101_B</span></span> is not a value, because
package names are not values; but <span class="extract"><span class="extract-syntax">R_101</span></span> on the other hand is a value, and
can be stored and used at run-time like any other value.
</p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Global variables. </b>Variables are like properties, except that each exists only as a single
value, not attached to any instance in particular: it makes no sense to ask
who the owner is. Variables must be declared as:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">variable</span><span class="plain-syntax"> NAME KIND = VALUE</span>
<span class="plain-syntax">The given value is just the initial state; at run-time, it can be changed to</span>
<span class="plain-syntax">another value (</span><span class="reserved-syntax">of</span><span class="plain-syntax"> the same </span><span class="reserved-syntax">kind</span><span class="plain-syntax">). For example,</span>
</pre>
<p class="commentary"> variable V_score K_number = 10
</p>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Metadata. </b>This provides important semantic markup, even though it has no direct effect on
the code generated. Metadata is specified by constant definitions, but
where the symbol name begins with the magic character <span class="extract"><span class="extract-syntax">^</span></span>. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">constant</span><span class="plain-syntax"> ^name = </span><span class="string-syntax">"blue book"</span>
</pre>
<p class="commentary">Metadata constants compile to nothing, and cannot be equated to symbols in
other packages, nor vice versa.
</p>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Append and Link. </b>Two rather ugly constructs are currently needed in order to implement very
low-level features of Inform 7, at points in I7's design where the normally
subterranean presence of Inform 6 pokes up above the surface:
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">append NAME "RAW I6 CODE"</span></span> tells Inter to add the given raw code to whatever
it compiles as the definition (in I6) of whatever the symbol <span class="extract"><span class="extract-syntax">NAME</span></span> refers to.
For example, the I7 source text:
</p>
<blockquote>
<p>Include (- has door, -) when defining a door.</p>
</blockquote>
<p class="commentary">results in the following inter being generated:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">append</span><span class="plain-syntax"> K4_door </span><span class="string-syntax">" has door, \n"</span>
</pre>
<p class="commentary"><span class="extract"><span class="extract-syntax">link STAGE "SEGMENT" "PART" "CONTENT" "OTHER"</span></span> tells Inter that it needs
to make an alteration to the Inform 6 code inside the I6T template file
<span class="extract"><span class="extract-syntax">SEGMENT</span></span>, at heading <span class="extract"><span class="extract-syntax">PART</span></span>; the <span class="extract"><span class="extract-syntax">STAGE</span></span> must be one of <span class="extract"><span class="extract-syntax">early</span></span>, <span class="extract"><span class="extract-syntax">before</span></span>,
<span class="extract"><span class="extract-syntax">instead</span></span> or <span class="extract"><span class="extract-syntax">after</span></span>. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">link</span><span class="plain-syntax"> after </span><span class="string-syntax">"Output.i6t"</span><span class="plain-syntax"> </span><span class="string-syntax">"I6 Inclusions"</span><span class="plain-syntax"> </span><span class="string-syntax">"\n[ LITTLE_USED_DO_NOTHING_R; rfalse; ];\n"</span><span class="plain-syntax"> </span><span class="string-syntax">""</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Nop. </b>The "nop" statement has no textual representation. It does nothing, and exists
only as a convenience used by Inform when it needs to write simultaneously to
multiple positions within the same node's child list &mdash; the idea being that
a nop statement acts as a divider. For example, by placing the A write
position just before a nop N, and the B write position just after, Inform
will generate A1, A2, A3, ..., N, B1, B2, ..., rather than (say) A1, B1, A2,
A3, B2, ... The extra N is simply ignored in code generation, so it causes
no problems to have it.
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="M-ti.html">&#10094;</a></li><li class="progresscurrentchapter">M</li><li class="progresssection"><a href="M-ui.html">ui</a></li><li class="progresssection"><a href="M-ti.html">ti</a></li><li class="progresscurrent">dpiti</li><li class="progresssection"><a href="M-cpiti.html">cpiti</a></li><li class="progresssection"><a href="M-ip.html">ip</a></li><li class="progresssection"><a href="M-ia.html">ia</a></li><li class="progresssection"><a href="M-io.html">io</a></li><li class="progresssection"><a href="M-pas.html">pas</a></li><li class="progresssection"><a href="M-rc.html">rc</a></li><li class="progresschapter"><a href="1-mn.html">1</a></li><li class="progressnext"><a href="M-cpiti.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>