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

456 lines
38 KiB
HTML
Raw Normal View History

2019-03-21 14:51:08 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Data Packages in Textual Inter</title>
2020-05-03 03:01:21 +03:00
<link href="Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-21 14:51:08 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-05-03 03:01:21 +03:00
<link href="Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-21 14:51:08 +02:00
</head>
2020-05-03 03:01:21 +03:00
<body class="commentary-font">
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
2020-04-14 19:56:54 +03:00
<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>
2020-03-19 02:11:25 +02:00
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</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="../html-module/index.html">html</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-05-03 03:01:21 +03:00
<!--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>
2019-03-21 14:51:08 +02:00
<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. Responses</a></li><li><a href="M-dpiti.html#SP11">&#167;11. Metadata</a></li><li><a href="M-dpiti.html#SP12">&#167;12. Append and Link</a></li><li><a href="M-dpiti.html#SP13">&#167;13. Nop</a></li></ul><hr class="tocbar">
2019-03-21 14:51:08 +02:00
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Data packages. </b>To recap: a file of textual inter has a brief global section at the top, and
2019-03-21 14:51:08 +02:00
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
2020-05-03 03:01:21 +03:00
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
2019-03-21 14:51:08 +02:00
data package, so there must be at least one in the program.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">"Data" is a slightly loose phrase for what data packages contain: it
2019-03-21 14:51:08 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Kinds and values. </b>Inter is a very loosely typed language, in the sense that it is possible
2019-03-21 14:51:08 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary">No kinds are built in: all must be declared before use. However, these
2019-03-21 14:51:08 +02:00
declarations are able to say something about them, so they aren't entirely
abstract. The syntax is:
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
symbol pointing to this definition.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary"><span class="extract"><span class="extract-syntax">CONTENT</span></span> must be one of the following:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
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);
2020-05-03 03:01:21 +03:00
</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)
2019-03-21 14:51:08 +02:00
of the enumerated constants with this kind;
2020-05-03 03:01:21 +03:00
</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
2019-03-21 14:51:08 +02:00
of which has a different kind;
2020-05-03 03:01:21 +03:00
</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
2019-03-21 14:51:08 +02:00
of the package in which this definition occurs;
2020-05-03 03:01:21 +03:00
</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
2019-03-21 14:51:08 +02:00
same sort of sense as in Inform;
2020-05-03 03:01:21 +03:00
</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
2019-03-21 14:51:08 +02:00
not all have to have the same kind;
2020-05-03 03:01:21 +03:00
</li><li>(k) and <span class="extract"><span class="extract-syntax">routine</span></span>, meaning that data must be references to functions.
2019-03-21 14:51:08 +02:00
</li></ul>
2020-05-03 03:01:21 +03:00
<p class="commentary">For example:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP3"></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.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
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);
2020-05-03 03:01:21 +03:00
</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.
2019-03-21 14:51:08 +02:00
</li></ul>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
supplied is too large to fit into the kind, an error is thrown.
</p>
2020-05-03 03:01:21 +03:00
<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:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">A list-like notation can also be used for a "calculated literal". This is
2019-03-21 14:51:08 +02:00
a single value, but which we may not be able to evaluate at inter generation
2020-05-03 03:01:21 +03:00
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
2019-03-21 14:51:08 +02:00
catered for in this way.
</p>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
within such text must have Unicode values of 32 or above, except for tab (9),
2020-05-03 03:01:21 +03:00
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
2019-03-21 14:51:08 +02:00
backslash notations at present allowed.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">There are then a number of notations which look like texts, prefixed by
2019-03-21 14:51:08 +02:00
indicative characters.
</p>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
same form as a literal real number in Inform 6. The result is valid
2020-05-03 03:01:21 +03:00
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>.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
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
2020-05-03 03:01:21 +03:00
copied literally through. Its kind is <span class="extract"><span class="extract-syntax">unchecked</span></span>, so it can be used
2019-03-21 14:51:08 +02:00
absolutely anywhere.
</p>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
is really a form of comment used in the middle of long lists. Thus the
2020-05-03 03:01:21 +03:00
list <span class="extract"><span class="extract-syntax">{ 1, 2, ^"predictable start", 3721, -11706 }</span></span> is actually a list of four values
2019-03-21 14:51:08 +02:00
but which should be compiled on two lines with the comment in between:
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">(As unnecessary as this feature seems, it does make the code produced by
2019-03-21 14:51:08 +02:00
Inform look a lot more readable when it finally reaches Inform 6.)
</p>
2020-05-03 03:01:21 +03:00
<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".
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">Convention. It is intended that Inform will never make use of globs, but
2019-03-21 14:51:08 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary">Inform generates <span class="extract"><span class="extract-syntax">undef</span></span> values to represent missing entries in tables,
2019-03-21 14:51:08 +02:00
but otherwise makes no use of them.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP4"></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.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">This can be controlled using <span class="extract"><span class="extract-syntax">defaultvalue KIND = VALUE</span></span>. For example,
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP5"></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
2019-03-21 14:51:08 +02:00
that they can have only a finite number of possible values, each of which
is represented in textual inter by a different name.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">These values are called "instances" and must also be declared. For example:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">It is also possible to specify numerical values to be used at run-time:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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>.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">Enumerations, but no other kinds, may have "subkinds", as in this example:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
have subkinds, and so on.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. Properties of instances. </b>A "property" is a named value attached to all instances of a given kind,
2019-03-21 14:51:08 +02:00
and must be created before use with:
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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>;
2019-03-21 14:51:08 +02:00
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>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">And once that is done, actual values can be assigned with:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary">The given value is just the initial state; at run-time, it can be changed to
2019-03-21 14:51:08 +02:00
another value (of the same kind).
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">For example:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. Constants. </b>A constant definition assigns a name to a given value: where that name is
2019-03-21 14:51:08 +02:00
used, it evaluates to this value. The syntax is:
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">where the value given must itself be a constant or literal, and must conform
2019-03-21 14:51:08 +02:00
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
2020-05-03 03:01:21 +03:00
has an <span class="extract"><span class="extract-syntax">unchecked</span></span> kind, then the test is automatically passed.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary">For example,
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">Constants can have any kind, including enumerated ones, but if so then that
2019-03-21 14:51:08 +02:00
does not make them instances. For example,
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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>.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>If a constant needs to refer to a function, we seem to run into the limitation
2019-03-21 14:51:08 +02:00
that there's no notation for literal functions. In fact there is, though:
that's what code packages are. For example,
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<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
2019-03-21 14:51:08 +02:00
can be stored and used at run-time like any other value.
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. Global variables. </b>Variables are like properties, except that each exists only as a single
2019-03-21 14:51:08 +02:00
value, not attached to any instance in particular: it makes no sense to ask
who the owner is. Variables must be declared as:
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary"> variable V_score K_number = 10
2020-04-08 01:02:44 +03:00
</p>
2019-03-21 14:51:08 +02:00
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. Responses. </b>A "response" is a special sort of property belonging to a function rather than
2019-03-21 14:51:08 +02:00
an instance: it's a piece of text. This can be set with:
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">response</span><span class="plain-syntax"> NAME MARKER FUNCTION = VALUE</span>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary"><span class="extract"><span class="extract-syntax">NAME</span></span> provides a unique symbol name identifying this specific response; this
2019-03-21 14:51:08 +02:00
is needed so that other code elsewhere in the program can alter this response
2020-05-03 03:01:21 +03:00
at run-time. <span class="extract"><span class="extract-syntax">MARKER</span></span> indicates which of 26 possible responses is meant: in
2019-03-21 14:51:08 +02:00
high-level Inform 7 code these are labelled with the letters A to Z, but in
2020-05-03 03:01:21 +03:00
inter, the numbers 0 to 25 must be used. The <span class="extract"><span class="extract-syntax">VALUE</span></span> must be textual, that is,
must be a <span class="extract"><span class="extract-syntax">text</span></span> literal.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. Metadata. </b>This has no effect on the code generated, and is simply semantic markup for
2019-04-23 01:29:02 +03:00
the benefit of onlookers. The scheme here is that any package can have a
dictionary of textual key-value pairs, specified by:
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">metadata</span><span class="plain-syntax"> KEY: VALUE</span>
2019-04-23 01:29:02 +03:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary">Here <span class="extract"><span class="extract-syntax">KEY</span></span> must be a (public) symbol whose name begins with a backtick, and
<span class="extract"><span class="extract-syntax">VALUE</span></span> must be literal text. For example:
2019-04-23 01:29:02 +03:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">metadata</span><span class="plain-syntax"> </span><span class="element-syntax">`name</span><span class="plain-syntax">: </span><span class="string-syntax">"blue book"</span>
2019-04-23 01:29:02 +03:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Append and Link. </b>Two rather ugly constructs are currently needed in order to implement very
2019-03-21 14:51:08 +02:00
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>
2020-05-03 03:01:21 +03:00
<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.
2019-03-21 14:51:08 +02:00
For example, the I7 source text:
</p>
<blockquote>
<p>Include (- has door, -) when defining a door.</p>
</blockquote>
2020-05-03 03:01:21 +03:00
<p class="commentary">results in the following inter being generated:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary"><span class="extract"><span class="extract-syntax">link STAGE "SEGMENT" "PART" "CONTENT" "OTHER"</span></span> tells Inter that it needs
2019-03-21 14:51:08 +02:00
to make an alteration to the Inform 6 code inside the I6T template file
2020-05-03 03:01:21 +03:00
<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:
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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>
2019-03-21 14:51:08 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. Nop. </b>The "nop" statement has no textual representation. It does nothing, and exists
2019-07-13 19:15:26 +03:00
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.
2019-03-21 14:51:08 +02:00
</p>
2020-05-03 03:01:21 +03:00
<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-->
2020-03-19 02:11:25 +02:00
</main>
2019-03-21 14:51:08 +02:00
</body>
</html>