[I7] Current state, internal build 5N27, and library messages

Graham Nelson graham at gnelson.demon.co.uk
Fri Mar 21 13:59:35 CDT 2008


Dear all,

The scheme to merge the I6 support files in I7 with the
I6 library is now complete, at least in so far as there is
a detailed draft which is very much clearer and more
readable than before. It's been possible to unpick many
tangles due to the I6 library not quite matching what
I7 needed, and to remove a lot of clutter, such as
support for V3 of the Z-machine (which would never
work with I7 anyway) and for old, buggy versions of
the I6 compiler (which are not included with I7). There
is also quite a bit more documentation of what
everything does and how it fits together.

Similarly, the revised Standard Rules (version 2) are
now in a nearly complete draft: its loose ends more
or less correspond to the loose ends in the template,
since the two work closely together.

Work continues on optimising story files for run-time
speed on both the Z-machine (where the worst-case
test "Bronze" is now more than twice as fast), and
on Glulx. Since Andrew Hunter is already working
on Zoom for iPhone, where a 600MHz processor
probably means we're looking at story files running
only 1/5th as fast as they would on a modern
desktop, this may be more pressing than it has
been in the past. This work has been greatly helped
by Jesse kindly writing a profiling version of dumb-frotz.
We are also looking at mechanising tests on Glulx
using cheapglk and glulxe, a long-overdue measure:
it may prevent accidents like the one Aaron reported
the other day (in which the example "Pink or Blue"
fails rather gracelessly under Glulx). And work
continues on the new activities for what used to
be called the "locale" routines in the old VerbLib,
and is now a set of activities, with the code ported
out of the I6 library and into I7 source text: Emily is
working on this. Finally, code to support fixed-point
arithmetic already exists in draft form: square root,
sine, cosine, tangent, etc., and exponentiation are
all written, while work advances on logarithms.
So there is movement on several fronts.

The NI compiler itself has not advanced very much
in recent weeks, except to add table amendments,
which work much like table continuations: these
are motivated by the goal of moving all of the
library messages into tabular form and then making
it possible for translators and others to amend any
rows they please from these tables. There's
more to do on extensions before the current builds
of NI can go live to public use; esp. on case sensitivity
of filenames, implementing the proposed ".i7t"
filename extension for extensions, and so on.

But this seems a good point to make a second
try at releasing an internal build which may help
David Fisher's work on library messages. I've
uploaded source code for the current build,
5N27, to the usual place, i.e.:

http://users.ox.ac.uk/~nelson/OS%20X/x/private/

If David K. could kindly make a Windows build
for David F. to play with, that would be much
appreciated. Anyone else who wishes to play
with this intermediate version is welcome to, but
at his own risk. There's probably no need to port
to other platforms: this is a build which doesn't
play well with some existing extensions, and
could cause trouble for end users, so we should
keep it amongst ourselves.

The two PDF files at the above address, called
Appendix-A.pdf and Appendix-B.pdf, are the
typeset forms of the Standard Rules and the
template as they currently stand. The files are so
called because they form the first two appendices
to the full "document" of the NI source code. (NI
is written under the doctrine of Literate
Programming, according to which programs should
be published such that they can be either compiled
or typeset and read. When complete, the typeset
form of NI will be around 2000pp, but of course
nobody will read it: it's meant to be dipped into
by people maintaining I7. Anyway, these two
appendices are a slightly scruffy draft of about
600pp of the whole.)

The old "library messages" (in the absence of a
library, the term is obsolete) have been divided
into three: the old Miscellany messages, the old
ListMiscellany messages, and all of the others.
The point of this division is that ##Miscellany
and ##ListMiscellany are fake actions, in I6, and
are therefore not type-safe values for the I7
kind of value "action-name". (There used to be one
message under the fake action ##Order, but that
has been moved into the miscellany set.) Thus
the "all of the others" category are all messages
pertaining to specific actions.

Most of the messages are generated by rules
written out in I7 source text in the Standard Rules,
but others are generated by calls to an I6 routine
in the template. Wherever they come from, all
requests to print a message are now routed
through three I7 phrases defined in the Standard
Rules as follows:

To decide if intervened in miscellaneous message:
	decide on false.

To decide if intervened in miscellaneous list message:
	decide on false.

To decide if intervened in action message:
	decide on false.

(Deciding false goes through the usual I6
library messages system instead: that used to
be in the I6 library's language definition file,
English.h, but is now in the template's Language.i6t.)

Redefining these to print messages in some way,
and deciding on true instead, provides a hook
with which we can experiment on different
schemes to provide the messages. (These
phrases are probably a temporary expedient
rather than part of the final design.) The sample
code in LMS.inform (zipped at the same site
as above) shows how these can be used to
tabulate the messages in all three categories.

The current change log since the last build is
below.

The number of bug report forms to deal with
is now up to around 200 again. Many thanks to
everyone sending these: they aren't being
ignored, however it may look.

Happy first Sunday after the first ecclesiastical
full moon that occurs on or after March 21,

   Graham


NEW FEATURES

It is now possible to define two different versions of the same text
	substitution, one in which the first letter is capitalised, the other
	in which it is lower case: these then have different meanings. (Inform
	already did this where the first word was The, A or An, and used this
	so that "[the noun]" had a different effect from "[The noun]": what
	is new is that the same rule now applies to any first word.)
When lists of objects are printed with the text substitution "[list  
of ...]"
	(for instance, "[list of open containers]") such lists are now always
	grouped and printed using plurals. (In previous builds, they would be
	if the objects involved were all inside or on top of a given parent
	object, but not otherwise. It's arguable that this is a bug fix rather
	than a new feature.)
When creating new verbs or prepositions, the word "reversed" can be used
	to reverse the sense of a relation. For instance,
		The verb to be embedded in implies the reverse incorporation relation.
The verb "to incorporate" has been added to the built-in stock; that  
is, the
	following is now part of the Standard Rules:
		The verb to incorporate (he incorporates, they incorporate, he
		incorporated, it is incorporated, he is incorporating) implies the
		incorporation relation.
	Thus X incorporates Y if and only if Y is a part of X. It was slightly
	anomalous that no such built-in verb existed already (analogous to
	"to contain" and "to support"), and several extension-writers have
	found it a useful linguistic device and had to define it themselves.
A new activity "printing the announcement of light" has been added, in
	parallel with "printing the announcement of darkness".
The assertion-maker has been slightly improved, so that relative clauses
	like the one in the third sentence here work (rather than producing
	problem messages):
		A person can be asleep or awake. The Spinning Tower is a room.
		Sleeping Beauty is a woman who is asleep in the Spinning Tower.
Test scripts (for TEST) can now contain exotic characters, and follow
	the same apostrophe conventions as other text: thus ' becomes " except
	where used as a contraction, but ['] forces a genuine single quote.
The meaning of the phrase
		place X in scope
	used to depend on whether X was a room or not: for rooms, only the
	contents would be put in scope, and not X itself. This meant there
	was no way to put the actual names of rooms in scope, and was in any
	case an unnecessary complication. As from this build, the following
	possibilities:
		place X in scope
		place X in scope, but not its contents
		place the contents of X in scope
	do what they appear to suggest, whether X is a room or not. (If X is
	a room, the new "place the contents of X in scope" does exactly what
	the old "place X in scope" did, so it should be easy to correct  
existing
	source text if necessary - but e.g. in the Inform examples we didn't
	need to make any corrections at all.)

TABLES

Tables can now have amendments as well as continuations. That is, just  
as
	one can already write
		Table of Semi-Precious Minerals (continued)
	to add extra rows to an existing table, one can now also write:
		Table of Semi-Precious Minerals (amended)
	to change those rows. The amended table must have exactly the columns
	of the original and in the same order. Moreover, each row in the  
amended
	table must match exactly one row in the original. For instance:
	
		Table of Plans
		moment		outcome
		10 AM		"takeover of Mars"
		11:30 AM	"canals reflooded"
		11:45 AM	"chocolate bar production doubled"
		
		Table of Plans (amended)
		moment		outcome
		11:45 AM	"volcanic cave production doubled"

	creates a three-row Table of Plans, with reference to the chocolate  
bars
	struck out.
	Amendment rows may be given in any order.
	The process of matching a row begins at the left-most column: Inform
	tries to see if any single row in the original table has a matching
	entry. If none do, a Problem is issued. If more than one do, Inform  
then
	looks at the second column, and so on. Thus:

		Enthusiasm is a kind of value. The enthusiasms are pumped, wired and  
languid.
		
		Table of Mental States
		feeling	extent	consequence
		pumped	1		"you feel able to run for your life"
		pumped	2		"you feel able to run for President"
		wired	1		"you feel able to run"
		languid	1		"you feel"
		
		Table of Mental States (amended)
		feeling	extent	consequence
		pumped	2		"you feel able to run for the Nebraska State Legislature"

	...the amendment here is made to the second row of the original table.
	For the present, at least, the columns used for matching may only  
contain:
	numbers, times, objects, action names, activities, figure names, sound
	names, truth states and any new kinds of value or units which have been
	declared.

FAST ROUTE-FINDING

The ability to find routes through the map, and other relations, makes  
it
	possible to write quite sophisticated conditions concisely: but these
	sometimes run slowly, because they call for large amounts of  
computation.
	Two especially bad cases are provided by having dozens of characters
	constantly route-finding through the map in order to meander about;
	and having dozens of articles of clothing all partially revealing each
	other, overlying and underlying, so that it becomes a complicated
	matter to establish what can be worn on top of what else.
For finding routes in the map, there are now two use options:
		Use fast route-finding.
		Use slow route-finding.
	This chooses between two algorithms, neither of which is best in all
	cases. If neither is specified, "fast" is used on the Glulx VM, and
	"slow" on the Z-machine. In general, "fast" is very much faster if  
there
	is a large map in which frequent route-finding goes on; but it comes at
	a sufficient memory cost that, for a large map, it won't be able to
	fit into the Z-machine, which is very short of memory. On Glulx  
projects,
	memory is only an issue if we mind that the story file and saved games
	will be a little larger, which could just possibly matter for very  
small
	mobile devices. "Slow" is the same algorithm used in previous builds of
	Inform, and it has very low memory overheads: for many maps, especially
	fairly small ones, and where route-finding is only an occasional need,
	it is not detectably slower than "fast".
	(For those interested, "slow" is a variation on Prim's minimal spanning
	tree algorithm, while "fast" is a form of the Floyd-Warshall  
algorithm.)
For finding routes through relations, the same two options are  
available,
	but because we tend to create many relations which never use route- 
finding
	the default is always "slow". To make route-finding for a given  
relation
	"fast", we have to declare it that way:
		Overlying relates various garments to various garments with
		fast route-finding.
		Overlapping relates various garments to each other with fast
		route-finding.
	(For instance, changing the "overlying" and "underlying" relations in  
the
	example "What Not To Wear" to "fast" enormously improves performance  
when
	there are large wardrobes to choose from.)
	The "with fast route-finding" note can only be added to various-to- 
various
	relations: although route-finding through various-to-one and one-to- 
various
	relations is fully supported, it exploits the relative simplicity of  
these
	problems to use a more efficient algorithm than either the "fast" or  
"slow"
	ones described above.

EXTENSIONS

Headings can now provide source text to be used if a given extension is
	included in the current run; or alternatively, if it isn't. For  
instance:
		Chapter 2a (for use with Locksmith by Emily Short)
	specifies that everything under this heading (and its subheadings, if  
any)
	will be ignored unless the extension Locksmith by Emily Short is  
included.
	Conversely,
		Chapter 2b (for use without Locksmith by Emily Short)
	will be ignored unless it isn't included.
	This allows extension writers to give variant implementations depending
	on what other extensions are in use.
Headings can also replace portions of extensions which have been  
included.
	For instance:
		Section 6 - Hacked locking (in place of Section 1 - Regular locking in
			Locksmith by Emily Short)
	places the source text under the new heading in the place of the old
	(which is thrown away). If there should be two or more headings of the
	same name in the given extension, the first is the one replaced;
	if two or more headings attempt to replace the same heading in the
	given extension, the final attempt in source text order is the one
	which succeeds; and finally, heading dependencies like the above are
	scanned in a top-down way. Thus, if we have
		Chapter 2a (for use with Locksmith by Emily Short)
		...
		Section 1 - Hacked marbles (in place of Section 4 in Marbles by  
Peter Wong)
		...
	and we don't include Locksmith, then the replacement of Section 4 of
	Marbles is not made, because Section 1 - Hacked marbles is subordinate
	to the Chapter 2a heading which we've told Inform to ignore.
The extensions machinery has been made more robust, fixing a number of
	obscure bugs not actually experienced in practice by any users, and
	changing existing conventions as follows:
	- It is now possible for an extension to contain accented characters
	in author name and title: thus,
		Include Étude Pour La Fênetre by Françoise Gauß.
	should work. (Accents are removed for console output; the file of
	the extension must have the actual name it claims, as with any other
	extension.)
	- The maximum lengths of extension title and author name, previously
	31 characters each, have been raised to 50 characters each: but these
	are now more rigorously checked. (Previously, an extension breaking
	these limits would work on some platforms but not others: it would
	produce installation error messages on the Extensions documentation
	page, but these were easy to overlook by accident. An extension with
	overlong title or author name will now produce a Problem message when
	included.)
	- Installation errors are now more prominently displayed on the
	Extensions documentation page.
	- Problem messages added and improved for checking that 'begins here'  
and
	'ends here' sentences for extensions being used are correct. (Checking
	of 'ends here' sentences, in particular, was very lax previously  
because
	of a bug in the extension manager: apologies for this, because it means
	there are now a few extensions in circulation which have improperly
	written 'ends here' sentences, but which are otherwise correct, and
	will now be rejected. But the corrections needed will be very simple.)

INTERNAL REFORMS

The Standard Rules have been revised throughout: they are now more  
logically
	constructed, easier to read and better presented (for instance, in the
	Phrasebook index, which has a slightly new look). They advance formally
	to version 2.
	While much altered internally, they are almost exactly the same from  
the
	user's point of view, except that:
	- The property "inventory listing" for things has been withdrawn.
	(A fossil from the days of Inform 6: in I7's more rule-oriented way of
	looking at things, gadgets like this one are more an obstruction than a
	help, and it was striking that not one of the hundreds of examples ever
	used this property. And users often found it misleading that the  
property
	didn't play well with the activity "printing the name of something".)
	- The either/or property "transparent/opaque" is now a property only of
	containers, not of all things. (It only ever had any effect for
	containers anyway, and for some things it makes no good sense - a
	transparent animal is perhaps a jellyfish, but a transparent man, in
	the non-metaphorical sense?)
	- The either/or property "enterable" is now a property only of  
containers
	and supporters. (Again, it did nothing for any other things before.)
	- An action which fails because the player is in darkness, and it needs
	light, is now deemed to fail the "basic visibility rule", not the  
"can't
	act in the dark rule". (This brings it into line with the "basic
	accessibility rule", which is given as the reason for failure when the
	actor cannot touch something which is required to be in reach.)
	- The somewhat vaguely named "non-player character action rule" is now
	called the "requested actions require persuasion rule".
	- Implicit taking has been reformed: in past builds, the implementation
	of the taking action looked as if implicit takes were unlike ordinary
	actions, but this wasn't really so. The action variable "thing  
implicitly
	taken" has been abolished, and so have the following three rules:
		standard set taking variables rule
		avoid unnecessary implicit taking rule
		don't report successful implicit takes rule
Four obscure variant syntaxes, intended primarily for use by the  
Standard
	Rules, have been combined into one. The following examples show the
	change:
		Open translates into Inform as open.
		--> The open property translates into I6 as "open".
		The I6 library object name of yourself is "selfobj".
		--> The yourself object translates into I6 as "selfobj".
		The adjust light rule corresponds to routine ADJUST_LIGHT_R.
		--> The adjust light rule translates into I6 as "ADJUST_LIGHT_R".
		Quitting the game is an action corresponding to Quit, out of world
		and applying to nothing.
		--> Quitting the game is an action, out of world and applying to  
nothing.
		The quitting the game action translates into I6 as "Quit".
	In addition, one can now write:
		The whatever variable translates into I6 as "whtvr".
	which was not previously possible to specify.
	Problem messages have been added to defend this combination verb
	better against malformed requests, though it is still intended only for
	low-level extensions.
	(As a result, "to correspond" is no longer reserved and people can
	define this as a verb of their own now; "to translate", of course, is
	still reserved. The "I6 library object name" property has been  
abolished.
	Old-style tabular action definitions, in terms of lists of I6 routine  
names,
	have also been withdrawn.)
I7 projects no longer use the old I6 library: for fifteen years now,  
every
	story file made by Inform has included "Parser.h", "VerbLib.h" and
	"Grammar.h", but no longer. This is not as momentous as it sounds.
	I7 began by using library 6/9, then adapted to 6/10 and 6/11, but it
	always required minor modifications, indicated the suffix "N": thus,
	the latest releases of I7 have used library 6/11N. This was intended
	for dual use by I6 and I7 projects, but I7's use of the library had
	become increasingly strained. In 5J39, library 6/11N contained around
	400 conditional compilations causing it to produce different code when
	used by I6 and I7: in some cases, drastically different. Almost half of
	the lines in 6/11N were ignored by I7, as were many of the concepts
	and features familiar to I6 users. It seemed to the authors that 6/11N
	was living a lie: it wasn't really the same library when used by both
	systems, and the continuing pretence was only making the code more and
	more baroque. Its form was only holding back further development.
	In this new build, the material from 6/11N which was still in use has
	been moved into the "template layer", where it joins the other I6
	code used by I7. This somewhat simplifies the I7 architecture.
	Library 6/11N is still included in the current build, for the benefit
	of anyone using it with purely I6 projects in the Inform 7 user
	interface.
	In any case much of the significant code in the I6 library lives on,  
almost
	unmodified, in a new home. "Parser.i6t" in the new template, for  
instance,
	is more or less the supposedly abandoned "parserm.h" from Library  
6/11N.
	The I6 library is dead; long live the I6 library.
The template layer consists of a set of more than 20 mainly short  
files, or
	"segments", with the extension ".i6t". Each segment has a name and is
	divided up into one or more named parts.
	This has enabled the Include (- ... -) syntax for inserting raw I6 code
	to be considerably strengthened. For instance -
		Include (- ... -) before "Flowers.i6t".
		Include (- ... -) instead of "Flowers.i6t".
		Include (- ... -) after "Rhizomes" in "Flowers.i6t".
	With these new forms of Include, the given I6 code can be placed  
before,
	instead of, or after any named segment or named part of a segment.
	- Multiple such inclusions can be made for the same segment or part,  
and
	if so, all will take effect;
	- Inclusions requested before, or after, a segment or part which has  
been
	replaced with "instead of" will take effect and appear before or after
	the code which appears instead of it.
	- The existing but deprecated syntax
		Include (- ... -) before the library.
	has been withdrawn; the new syntax
		Include (- ... -) after "Definitions.i6t".
	should have the same effect.
	- The existing (and still fine!) syntax
		Include (- ... -).
	is, for what it's worth, equivalent to
		Include (- ... -) after "I6 Inclusions" in "Output.i6t".
	- Template code can now use the same (+ ... +) notation to evaluate I7
	expressions that inline definitions can; they also have access to a  
wide
	range of internal-use-only commands which shouldn't be used except in
	the built-in template files, but one command is safe to use:
		{-segment:NAME}
	places the whole of the template file NAME in this position. The file
	should be named as something like "MyStuff.i6t" -- it's a leafname, not
	a pathname -- and Inform looks for template files first in the  
subfolder
	"I6T" of a project's "Materials" folder, if that exists, and only then
	in its built-in stock. This means that
		(a) you can if you wish replace the built-in templates with your
		own, putting those in Materials/I6T, and
		(b) you can if you wish include chunks of I6 code generated by
		external utilities - Perl scripts, lex and yacc, etc. - by compiling
		those to suitable template files in Materials/I6T and then using
		an inclusion like
			Include (- {-segment:MyStuff.i6t} -).
All this allows for fine control in modifying the template, though we  
hope
	that users won't go in for template modification much or often.
	The template layer is gradually being tidied up: an annotated version,
	explaining what each part does, will be published later this year. In
	the mean time, those who do hack the template are warned that they may
	need to alter their code to keep it working with future builds.
One application of template layer hacking might be to provide extensions
	which translate the language of play. At present, I7 is not  
configurable
	enough to translate the language of writing, but as from this build it
	should be much more viable to translate the language of the story file.
	To demonstrate this, a new extension, "English by David Fisher", is
	built in. This extension implements English, and there's no need for
	anyone to include it in their story files since English is already the
	language of play by default: but it serves as a model which translators
	can imitate. It should be fairly straightforward to convert existing
	I6 language definition files into extensions following this model.
	The authors suggest that these could be named in the style "Language
	by Translator's Name" - say, "Latin by Adam Thornton".

OPTIMISATION

We would like to thank Jesse McGrew for writing a profiling version of  
the
	Z-machine interpreter dumb-frotz: a great help. (It appears,  
incidentally,
	that if dumb-frotz has a 3GHz Xeon CPU core to itself, it can interpret
	at around 13.5 MHz; a just-in-time compiler can manage 19.7 MHz,  
probably
	the world speed record for the Z-machine. Realistically, when  
interpreting
	the Z-machine over the next couple of years, we can expect about 10  
MHz,
	but we should divide by about five to get likely speeds on portable  
devices
	such as the iPhone, with CPUs at about 600 MHz.)
The running time of large rulebooks (with 16 or more rules) has been  
improved.
	The recent discussion on RAIF about before, instead or after rules  
being
	inefficient in large numbers - because these rulebooks become large -
	led us to investigate how large an effect this really was. The answer
	was that it wasn't as dramatic as some people had feared, but was well
	worth addressing: this shaved about 24% off the running time of  
"Bronze"
	played right through to a solution. (The representation of rulebooks is
	now such that there is very little or no possible speed advantage to  
moving
	a before/instead/after rule into the check/carry out/report rulebooks,
	so this shouldn't be a factor in deciding where to put rules in  
future.)
As of this build, activity rulebooks are "processed" rather than  
"followed".
	This means that they do not run the procedural rules individually as  
fresh
	contexts for rules in their own right: instead, they remain subject to
	procedural rules applying to whatever larger thing is going on -- i.e.,
	in almost all cases, the current action. This change made no difference
	to the behaviour of any test in the test suite, and removed a further
	16% from the running time of "Bronze". (The change will not so
	significantly affect projects which don't use procedural rules, of  
course.)
Miscellaneous other adjustments, such as replacing heavily-used veneer  
routines
	with hand-coded assembly language versions better aimed at likely I7  
rather
	than I6 use cases, should save about 10% of running time on most  
projects.
At the end of this period of optimisation, "Bronze" ran about 2.5  
times faster
	than at the start, but this was an extreme case: most examples saw more
	modest improvements.

MAINTENANCE

Bug fixed whereby a skipped line for a paragraph break would in some
	circumstances be omitted between subsequent paragraphs in a room
	description.
Run-time problems added for attempts to remove the player from play (a  
logical
	impossibility) or to remove doors from play (which would make a mess of
	the map), and for attempts to change the player to someone who has been
	removed from play.
Bug fixed whereby the count of how many turns over which a category of  
actions
	has been happening would sometimes be wrong if the action qualified  
only
	when a certain condition held, which did not hold at the start of the
	action but did hold at the end. For instance, suppose we have:
		A thing can be examined or unexamined.
		Carry out examining something: now the noun is examined.
		After examining an examined thing for the third turn: say "Not again!"
	If the player types EXAMINE BOX, never having done so before, then this
	does not qualify as "examining an examined thing": but previous builds
	would have counted it towards the three turns needed for the rule to  
fire
	because, at the very end of the action, the description "examining an
	examined thing" would indeed match, the box by then having acquired the
	"examined" property.
Bug fixed whereby the count of turns is not fooled by multiple actions  
in a
	single turn: suppose we have the rule
		Before taking for the third turn: say "Not again!"
	and suppose the player types TAKE ALL, picking up a dozen items. In
	previous builds, the rule would treat these as different turns, but now
	they are treated as the same turn.
The count has further been reformed by ensuring that silent actions can
	never count towards the number of turns in such a rule; silent actions
	are never the main point of what is happening in a turn.
Bug fixed whereby if a character were asked to do something with  
multiple
	objects (say with the command HELEN, GET ALL) then it would be assumed
	that agreement to perform the action with the first item would extend
	to the rest of the list, too. Persuasion rules are now properly checked
	for each item in the list in turn.
Bug fixed whereby rules predicated on a list of two or more actions,  
where
	an action name before the last could be read as both a complete action
	name and also an abbreviation for a different one, would have both
	interpretations applied instead of only the complete one: for example,
	if actions called "franking" and "franking it with" both existed, then
	"Instead of franking or taking" would be misread as applying to any of
	the "franking", "franking it with" or "taking" actions - whereas
	"Instead of franking" and "Instead of taking or franking" would not
	be misread in this way.
Bug fixed whereby the "in" would be misinterpreted if it occurred in the
	name of a rule being explicitly placed in a rulebook, as here:
		The new can't travel in what's not a vehicle rule is listed instead
		of the can't travel in what's not a vehicle rule in the check
		going rules.
Bug fixed whereby some extension namespace clashes would fail to be
	reported correctly on the dictionary page where three or more
	different extensions all defined the same term.
Bugs fixed whereby names with exotic ingredients such as ~, ^, @ would
	either be misprinted or misparsed, or both.
Bug fixed whereby paragraph breaks in the middle of phrase definitions
	would sometimes incorrectly be allowed, if the material just before
	the paragraph break ended in a semicolon.
Bugs fixed, or really, syntax clarified as to when qualifiers such as
	"always" and "usually" can be used in assertions: these are allowed
	on either side of the verb in most assertions, but not on both (for
	which a problem message has been added), and not in assertions
	admitting no doubt (such as "Looking is an action applying to  
nothing").
	Previously Inform would silently allow, though ignore, some such
	usages.
Similarly, "worn", "carried" and "here" can now only be used in  
assertions
	using the verb "to be".
Similarly, "of", "from" and "and" now lose their grammatical meanings as
	introducers of clauses in assertions if they are unexpectedly written
	with an upper-case O, F or A, respectively. Thus
		On the shelf is Of Mice And Men and The Girl From Ipanema.
	places two objects on the shelf, with the obvious names, and doesn't
	get sidetracked into thinking the shelf contains (for instance) an
	item called "Of Mice" together with some "men".
Problem message added for creating a property name consisting only of  
the
	word "presence" (since this causes ambiguities with "...in the presence
	of...").
Bug fixed whereby names containing "from" would sometimes have their  
original
	articles taken as part of the name itself: for instance,
		The telegram from Klaxor is in the Breakfast Nook.
	would produce a proper noun, "The telegram from Klaxor", rather than
	parsing it as "the" (definite article) + "telegram from Klaxor". (That
	this bug was not more widely felt is chiefly because another mechanism
	in Inform tended to compensate for it.)
Bug fixed whereby "called" names were sometimes unable to contain the  
words
	"with" or "having": for instance, this failed -
		The golf ball is in a container called the flask and cap with flange.
Bug fixed whereby consecutive articles would on rare occasions be  
allowed
	in noun phrases ("a the tree", say).

Examples:
	"Provenance Unknown" added to demonstrate how PUSH TELEVISION WEST  
might
		be converted to pushing the cart on which the television rests.
	Changes to "Alias", "Air Conditioning is Standard", "A Haughty Spirit",
		and "Dinner is Served" to reflect new strictness about properties
		such as enterable and transparent. (These were all effectively minor
		bugs that had previously gone unnoticed.)
	Changes to "What Not To Wear", to reflect new strictness and to make
		some running speed improvements. More speed improvements are  
necessary.

Extensions:
	"Locksmith" edited to make it easier to change the output text; version
	number advanced to 6.
	"Plurality" advanced to version 6, and a bug fixed whereby is-are did  
not
	print the correct output in the case where the object was the player.


--
Graham Nelson





More information about the Inform7-porters mailing list