From 03592cb26fba55e032bdcf31eed4326287471a1f Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Thu, 1 Sep 2022 00:14:18 +0100 Subject: [PATCH] Refactored plugins to become compiler features --- README.md | 2 +- build.txt | 4 +- docs-src/inform7n.inweb | 10 +- docs/arch-module/1-am.html | 4 +- docs/arch-module/2-arc.html | 2 +- docs/arch-module/2-cmp.html | 2 +- docs/arch-module/2-tvm.html | 2 +- docs/arch-module/3-fm.html | 242 ++++++++++ docs/arch-module/P-htitm.html | 2 +- docs/arch-module/P-wtmd.html | 10 +- docs/arch-module/index.html | 11 + docs/assertions-module/3-nvr.html | 2 +- docs/assertions-module/4-ass.html | 4 +- docs/assertions-module/4-rpt.html | 4 +- docs/assertions-module/5-rcd.html | 14 +- docs/assertions-module/5-rf.html | 14 +- docs/assertions-module/6-rls.html | 2 +- docs/core-module/1-cm.html | 21 +- docs/core-module/1-cp.html | 4 +- docs/core-module/1-cp2.html | 2 +- docs/core-module/1-cs.html | 2 +- docs/core-module/1-htc.html | 6 +- docs/core-module/1-inaa.html | 4 +- docs/core-module/1-itc.html | 2 +- docs/core-module/1-pp.html | 2 +- docs/core-module/1-wtc.html | 9 +- docs/core-module/2-cp.html | 2 +- docs/core-module/2-kp.html | 2 +- docs/core-module/2-pwst.html | 2 +- docs/core-module/2-si.html | 2 +- docs/core-module/2-sq.html | 2 +- docs/core-module/2-up.html | 2 +- docs/core-module/3-pc.html | 258 +++++++---- docs/core-module/P-wtmd.html | 6 +- docs/core-module/index.html | 7 +- docs/final-module/4-i6o.html | 4 +- docs/if-module/1-im.html | 54 +-- docs/if-module/2-bd.html | 10 +- docs/if-module/3-bck.html | 16 +- docs/if-module/3-dvc.html | 8 +- docs/if-module/3-enah.html | 2 +- docs/if-module/3-mcr.html | 4 +- docs/if-module/3-prs.html | 6 +- docs/if-module/3-rgn.html | 28 +- docs/if-module/3-scn.html | 36 +- docs/if-module/3-si.html | 2 +- docs/if-module/3-sm.html | 52 +-- docs/if-module/3-sr.html | 6 +- docs/if-module/3-tm.html | 40 +- docs/if-module/3-tp.html | 18 +- docs/if-module/3-tr.html | 24 +- docs/if-module/3-ts.html | 6 +- docs/if-module/4-ac.html | 2 +- docs/if-module/4-act.html | 4 +- docs/if-module/4-anaa.html | 2 +- docs/if-module/4-ap.html | 38 +- docs/if-module/4-gng.html | 28 +- docs/if-module/4-pc.html | 2 +- docs/if-module/4-rpoa.html | 26 +- docs/if-module/5-cg.html | 2 +- docs/if-module/5-pp.html | 32 +- docs/if-module/5-pv.html | 22 +- docs/if-module/5-us.html | 2 +- docs/if-module/P-wtmd.html | 14 +- docs/if-module/index.html | 30 +- docs/imperative-module/2-cr.html | 2 +- docs/imperative-module/2-map.html | 6 +- docs/imperative-module/4-ca.html | 2 +- docs/inbuild/1-mn.html | 2 +- docs/inbuild/M-agtk.html | 6 +- docs/inbuild/M-agtpm.html | 17 +- docs/index-module/3-me.html | 2 +- docs/inform7/1-mn.html | 8 +- docs/inform7/M-pm.html | 190 ++++---- docs/inform7/index.html | 2 +- docs/inform7/preform-diagnostics.txt | 407 +++++++++-------- docs/inform7n.html | 10 +- docs/kinds-module/2-fk.html | 4 +- docs/kinds-module/4-kc.html | 2 +- docs/kinds-module/4-st.html | 2 +- docs/knowledge-module/3-ep.html | 2 +- docs/knowledge-module/3-prp.html | 2 +- docs/knowledge-module/3-vp.html | 2 +- docs/knowledge-module/4-is.html | 28 +- docs/knowledge-module/4-pp.html | 20 +- docs/knowledge-module/5-tnt.html | 14 +- docs/knowledge-module/P-wtmd.html | 2 +- docs/lexicon-module/P-wtmd.html | 2 +- docs/multimedia-module/1-mm.html | 18 +- docs/multimedia-module/2-ef.html | 16 +- docs/multimedia-module/2-fgr.html | 20 +- docs/multimedia-module/2-se.html | 20 +- docs/multimedia-module/P-wtmd.html | 4 +- docs/runtime-module/2-ic.html | 20 +- docs/runtime-module/2-sc.html | 2 +- docs/runtime-module/3-cm.html | 4 +- docs/runtime-module/4-sal.html | 2 +- docs/runtime-module/5-bi.html | 2 +- docs/runtime-module/5-chr.html | 6 +- docs/runtime-module/5-ins.html | 4 +- docs/runtime-module/5-lp.html | 2 +- docs/runtime-module/5-ri.html | 2 +- docs/runtime-module/index.html | 4 +- docs/supervisor-module/1-ic.html | 18 +- docs/supervisor-module/2-ce.html | 6 +- docs/supervisor-module/2-cps.html | 6 +- docs/supervisor-module/2-rqr.html | 4 +- docs/supervisor-module/2-wrk.html | 4 +- docs/supervisor-module/3-bg.html | 8 +- docs/supervisor-module/3-bs2.html | 2 +- docs/supervisor-module/3-ib.html | 4 +- docs/supervisor-module/3-is.html | 2 +- docs/supervisor-module/3-is2.html | 4 +- docs/supervisor-module/4-em.html | 2 +- docs/supervisor-module/4-pbm.html | 4 +- docs/supervisor-module/4-pfm.html | 4 +- docs/supervisor-module/5-es.html | 4 +- docs/supervisor-module/5-ks.html | 43 +- docs/supervisor-module/5-ls.html | 10 +- docs/supervisor-module/5-ps2.html | 430 ++++++++++-------- docs/supervisor-module/6-hdn.html | 8 +- docs/supervisor-module/6-inc.html | 6 +- docs/supervisor-module/6-st.html | 2 +- docs/supervisor-module/6-tof.html | 2 +- docs/supervisor-module/7-cns.html | 2 +- docs/supervisor-module/7-tm.html | 2 +- docs/supervisor-module/P-wtmd.html | 8 +- docs/values-module/3-tod.html | 4 +- docs/values-module/4-pi.html | 2 +- inbuild/Manual/A Guide to Kits.w | 6 +- inbuild/Manual/A Guide to Project Metadata.w | 12 + .../Chapter 5/Kit Services.w | 23 +- .../Chapter 5/Project Services.w | 57 ++- inform7/Chapter 1/Main.w | 2 +- inform7/Downloads/excerpts-diagnostics.txt | 2 +- inform7/Figures/memory-diagnostics.txt | 46 +- inform7/Figures/timings-diagnostics.txt | 25 +- .../BasicInformExtrasKit/kit_metadata.json | 2 +- .../Inter/BasicInformKit/kit_metadata.json | 2 +- .../Inter/CommandParserKit/kit_metadata.json | 2 +- .../EnglishLanguageKit/kit_metadata.json | 2 +- .../Inter/WorldModelKit/kit_metadata.json | 2 +- .../Chapter 3/New Verb Requests.w | 2 +- .../assertions-module/Chapter 4/Assertions.w | 4 +- .../Chapter 4/Refine Parse Tree.w | 4 +- .../assertions-module/Chapter 5/Rule Family.w | 14 +- .../Chapter 5/Runtime Context Data.w | 14 +- inform7/assertions-module/Chapter 6/Rules.w | 2 +- .../Chapter 1/Class Predeclarations.w | 2 - inform7/core-module/Chapter 1/Core Module.w | 18 +- .../core-module/Chapter 1/How To Compile.w | 4 +- .../Inform-Only Nodes and Annotations.w | 2 +- .../core-module/Chapter 1/What To Compile.w | 3 +- inform7/core-module/Chapter 3/Plugin Calls.w | 154 +++++-- .../core-module/Chapter 3/Plugin Manager.w | 215 --------- inform7/core-module/Contents.w | 1 - .../Preliminaries/What This Module Does.w | 4 +- inform7/if-module/Chapter 1/IF Module.w | 54 +-- .../if-module/Chapter 2/Bibliographic Data.w | 10 +- inform7/if-module/Chapter 3/Backdrops.w | 16 +- inform7/if-module/Chapter 3/Devices.w | 8 +- .../Chapter 3/Everywhere, Nowhere and Here.w | 2 +- .../Chapter 3/Map Connection Relations.w | 4 +- inform7/if-module/Chapter 3/Persons.w | 6 +- inform7/if-module/Chapter 3/Regions.w | 28 +- inform7/if-module/Chapter 3/Scenes.w | 36 +- .../if-module/Chapter 3/Spatial Inferences.w | 2 +- inform7/if-module/Chapter 3/Spatial Model.w | 52 +-- .../if-module/Chapter 3/Spatial Relations.w | 6 +- inform7/if-module/Chapter 3/The Map.w | 40 +- inform7/if-module/Chapter 3/The Player.w | 18 +- inform7/if-module/Chapter 3/The Score.w | 6 +- inform7/if-module/Chapter 3/Timed Rules.w | 24 +- .../if-module/Chapter 4/Action Conditions.w | 2 +- inform7/if-module/Chapter 4/Actions Plugin.w | 38 +- .../Actions-Only Nodes and Annotations.w | 2 +- inform7/if-module/Chapter 4/Actions.w | 4 +- inform7/if-module/Chapter 4/Going.w | 28 +- inform7/if-module/Chapter 4/Parse Clauses.w | 2 +- .../Chapter 4/Rules Predicated on Actions.w | 26 +- .../if-module/Chapter 5/Command Grammars.w | 2 +- inform7/if-module/Chapter 5/Parsing Plugin.w | 32 +- .../if-module/Chapter 5/Property Visibility.w | 22 +- .../Chapter 5/Understand Sentences.w | 2 +- .../Preliminaries/What This Module Does.w | 14 +- .../Chapter 2/Compile Rvalues.w | 2 +- .../Chapter 2/Matching Action Patterns.w | 6 +- .../Chapter 4/Compile Atoms.w | 2 +- .../Chapter 3/Either-Or Properties.w | 2 +- .../knowledge-module/Chapter 3/Properties.w | 2 +- .../Chapter 3/Valued Properties.w | 2 +- .../Chapter 4/Inference Subjects.w | 27 +- .../Chapter 4/Property Permissions.w | 20 +- .../Chapter 5/The Naming Thicket.w | 12 +- .../Preliminaries/What This Module Does.w | 2 +- .../Chapter 1/Multimedia Module.w | 18 +- .../Chapter 2/External Files.w | 16 +- inform7/multimedia-module/Chapter 2/Figures.w | 20 +- .../Chapter 2/Sound Effects.w | 20 +- .../Preliminaries/What This Module Does.w | 4 +- .../Chapter 2/Instance Counting.w | 20 +- .../runtime-module/Chapter 2/Showme Command.w | 2 +- .../Chapter 3/Completion Module.w | 4 +- .../Chapter 4/Stored Action Literals.w | 2 +- .../Chapter 5/Backdrop Instances.w | 2 +- inform7/runtime-module/Chapter 5/Chronology.w | 6 +- inform7/runtime-module/Chapter 5/Instances.w | 4 +- .../Chapter 5/Literal Patterns.w | 2 +- .../Chapter 5/Region Instances.w | 2 +- .../values-module/Chapter 3/Times of Day.w | 4 +- .../Chapter 4/Parse Invocations.w | 2 +- .../final-module/Chapter 4/Inform 6 Objects.w | 4 +- inter/index-module/Chapter 3/Map Element.w | 2 +- notes/working_notes.md | 32 +- services/arch-module/Chapter 1/Arch Module.w | 2 + .../arch-module/Chapter 3/Feature Manager.w | 165 +++++++ services/arch-module/Contents.w | 3 + .../Preliminaries/What This Module Does.w | 6 + .../kinds-module/Chapter 2/Familiar Kinds.w | 4 +- .../kinds-module/Chapter 4/Kind Commands.w | 2 +- .../kinds-module/Chapter 4/Star Templates.w | 2 +- .../Figures/excerpts-diagnostics.txt | 2 +- 222 files changed, 2368 insertions(+), 1810 deletions(-) create mode 100644 docs/arch-module/3-fm.html delete mode 100644 inform7/core-module/Chapter 3/Plugin Manager.w create mode 100644 services/arch-module/Chapter 3/Feature Manager.w diff --git a/README.md b/README.md index 7c517278f..9398cc137 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -[Version](notes/versioning.md): 10.2.0-beta+6V48 'Krypton' (30 August 2022) +[Version](notes/versioning.md): 10.2.0-beta+6V49 'Krypton' (1 September 2022) ## About Inform diff --git a/build.txt b/build.txt index 8c7a1afbe..423f46e1f 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: beta -Build Date: 30 August 2022 -Build Number: 6V48 +Build Date: 1 September 2022 +Build Number: 6V49 diff --git a/docs-src/inform7n.inweb b/docs-src/inform7n.inweb index 48c094f5a..b8e16f046 100755 --- a/docs-src/inform7n.inweb +++ b/docs-src/inform7n.inweb @@ -33,8 +33,8 @@ up individual tasks; it provides general mechanisms for issuing problem messages and also a "plugin" architecture enabling language features to be added. Most Inform users think of rooms, map connections and so on as being built in to the language itself, but internally we take the view that there is a purist -Basic Inform language dealing only in data, and then a set of plugins to add -domain-specific gadgets to that language. +Basic Inform language dealing only in data, and then a set of optional compiler +features to add domain-specific gadgets to that language. (*) Contents page of web: //core//. @@ -100,8 +100,8 @@ for the moment.[1] [1] If we ever do go down the road of a full-on linker, issues like this would be part of what is nowadays called "ABI stability". -@ The //if// module consists of an extensive suite of plugins (see |core| -above) to add interactive fiction features to the Basic Inform language. +@ The //if// module consists of an extensive suite of features (see |core| +above) to add interactive fiction support to the Basic Inform language. Support for scenes, a spatial map, a protagonist character, and so on are all to be found here. @@ -109,7 +109,7 @@ all to be found here. (*) Detailed overview: //if: What This Module Does//. -@ The //multimedia// module consists of a few plugins (see |core| above) +@ The //multimedia// module consists of a few features (see |core| above) to add images, sound files and external file-handling to the Basic Inform language. diff --git a/docs/arch-module/1-am.html b/docs/arch-module/1-am.html index 241e8ceb5..f51fbb0db 100644 --- a/docs/arch-module/1-am.html +++ b/docs/arch-module/1-am.html @@ -64,11 +64,13 @@ which use this module:
enum inter_architecture_CLASS
 enum target_vm_CLASS
 enum compatibility_specification_CLASS
+enum compiler_feature_CLASS
 
 DECLARE_CLASS(inter_architecture)
 DECLARE_CLASS(target_vm)
 DECLARE_CLASS(compatibility_specification)
+DECLARE_CLASS(compiler_feature)
 

§3. Like all modules, this one must define a start and end function:

@@ -83,7 +85,7 @@ which use this module: } diff --git a/docs/arch-module/2-arc.html b/docs/arch-module/2-arc.html index f6d33d78b..8c08bb5f8 100644 --- a/docs/arch-module/2-arc.html +++ b/docs/arch-module/2-arc.html @@ -168,7 +168,7 @@ are ever made. } diff --git a/docs/arch-module/2-cmp.html b/docs/arch-module/2-cmp.html index 817151f9b..760d69557 100644 --- a/docs/arch-module/2-cmp.html +++ b/docs/arch-module/2-cmp.html @@ -481,7 +481,7 @@ according to what the token} diff --git a/docs/arch-module/2-tvm.html b/docs/arch-module/2-tvm.html index dde06b618..68ccbbc29 100644 --- a/docs/arch-module/2-tvm.html +++ b/docs/arch-module/2-tvm.html @@ -537,7 +537,7 @@ will return the empty text. } diff --git a/docs/arch-module/3-fm.html b/docs/arch-module/3-fm.html new file mode 100644 index 000000000..a90dcdd93 --- /dev/null +++ b/docs/arch-module/3-fm.html @@ -0,0 +1,242 @@ + + + + Feature Manager + + + + + + + + + + + + + + + + + + +
+ + +

Creating, activating or deactivating compiler features.

+ +

§1. "Features" are optional pieces of compiler functionality, which are given +textual names. They can be "activated" or "deactivated", that is, on or off. +For example, some of the interactive-fiction support in the Inform compiler +is provided by features which are deactivated for Basic Inform projects. +Incompletely implemented, or experimental, functions under development can +also be gated behind features which are deactivated by default, and activated +just for test projects. +

+ +

It turns out to be convenient to have a hard-wired maximum number of these. +But since features are not things an author can create in source text, we always +know exactly how many there are. +

+ +
define MAX_COMPILER_FEATURES 32
+
+
+typedef struct compiler_feature {
+    struct text_stream *textual_name;
+    struct compiler_feature *parent_feature;
+    void (*activation_function)(void);
+    int active;
+    int permanently_active;
+    int activation_function_run;
+    CLASS_DEFINITION
+} compiler_feature;
+
+compiler_feature *Features::new(void (*starter)(void), text_stream *tname, compiler_feature *set) {
+    compiler_feature *F = CREATE(compiler_feature);
+    F->textual_name = Str::duplicate(tname);
+    F->activation_function = starter;
+    F->active = FALSE;
+    F->parent_feature = set;
+    F->activation_function_run = FALSE;
+    if (F->allocation_id >= MAX_COMPILER_FEATURES)
+        internal_error("too many features");
+    return F;
+}
+
+
  • The structure compiler_feature is private to this section.
+

§2. With so few features in existence, there's no need to do this more efficiently: +

+ +
+compiler_feature *Features::from_name(text_stream *S) {
+    compiler_feature *F;
+    LOOP_OVER(F, compiler_feature)
+        if (Str::eq_insensitive(F->textual_name, S))
+            return F;
+    return NULL;
+}
+
+

§3. The idea is that an inactive feature does nothing; it's as if that section of +code were not in the compiler at all. These provide convenient shorthand ways +to test that: +

+ +
define FEATURE_ACTIVE(name) Features::active(name##_feature)
+define FEATURE_INACTIVE(name) (Features::active(name##_feature) == FALSE)
+
+
+int Features::active(compiler_feature *F) {
+    return F->active;
+}
+
+void Features::list(OUTPUT_STREAM, int state, compiler_feature *except) {
+    compiler_feature *F;
+    int c = 0;
+    LOOP_OVER(F, compiler_feature) if (F->active == state)
+        if ((except == FALSE) || (Features::part_of(F, except) == FALSE)) {
+            if (c > 0) WRITE(", ");
+            WRITE("%S", F->textual_name);
+            c++;
+        }
+}
+
+

§4. In the code above, features are set up as inactive by default — even "core", +which the compiler absolutely cannot live without. So Project Services (in supervisor) +calls the following before switching on optional things that it wants. +

+ +
+void Features::activate_bare_minimum(void) {
+    compiler_feature *F;
+    LOOP_OVER(F, compiler_feature)
+        if ((F->permanently_active) && (F->active == FALSE))
+            Features::activate(F);
+}
+
+void Features::make_permanently_active(compiler_feature *F) {
+    if (F == NULL) internal_error("no feature");
+    F->permanently_active = TRUE;
+}
+
+

§5. Most features are subordinate to a parent feature: for example, a dozen more +specific IF-related features are subordinate to the "interactive fiction" one. +

+ +
+int Features::part_of(compiler_feature *F, compiler_feature *G) {
+    while ((F != G) && (F != NULL)) F = F->parent_feature;
+    if (F == G) return TRUE;
+    return FALSE;
+}
+
+

§6. Activating or deactivating a parent like that automatically activates +or deactivates its children. +

+ +
+void Features::activate(compiler_feature *F) {
+    if ((F) && (F->active == FALSE)) {
+        F->active = TRUE;
+        Features::run_activation_function(F);
+        compiler_feature *G;
+        LOOP_OVER(G, compiler_feature)
+            if (G->parent_feature == F)
+                Features::activate(G);
+    }
+}
+
+

§7. Whereas anything can be activated, some things cannot be deactivated, so the +following returns a success flag: +

+ +
+int Features::deactivate(compiler_feature *F) {
+    if ((F) && (F->active)) {
+        if (F->permanently_active) return FALSE;
+        F->active = FALSE;
+        compiler_feature *G;
+        LOOP_OVER(G, compiler_feature)
+            if (G->parent_feature == F)
+                if (Features::deactivate(G) == FALSE)
+                    return FALSE;
+    }
+    return TRUE;
+}
+
+

§8. Every active feature gets to run its start function, if it provides one. +But this is postponed until Features::run_activation_functions is called; +at that point, every activated feature runs its function. If any feature is +activated after this point, its function runs immediately. (The point of the +postponement is that very early in Inform's run, the memory manager may not +yet be working, and so on.) +

+ +

It's kind of incredible that C's grammar for round brackets is unambiguous. +

+ +
+int allow_activation_functions_to_be_run = FALSE;
+
+void Features::allow_activation_functions(void) {
+    allow_activation_functions_to_be_run = TRUE;
+}
+
+void Features::run_activation_functions(void) {
+    compiler_feature *F;
+    LOOP_OVER(F, compiler_feature)
+        if (F->active)
+            Features::run_activation_function(F);
+}
+
+void Features::run_activation_function(compiler_feature *F) {
+    if ((allow_activation_functions_to_be_run) && (F) &&
+        (F->activation_function_run == FALSE)) {
+        F->activation_function_run = TRUE;
+        void (*start)() = (void (*)()) F->activation_function;
+        if (start) (*start)();
+    }
+}
+
+ + +
+ + + diff --git a/docs/arch-module/P-htitm.html b/docs/arch-module/P-htitm.html index 4e54faa74..05a868de8 100644 --- a/docs/arch-module/P-htitm.html +++ b/docs/arch-module/P-htitm.html @@ -81,7 +81,7 @@ module: before, the corresponding calls to foundation.) diff --git a/docs/arch-module/P-wtmd.html b/docs/arch-module/P-wtmd.html index 046df31f5..1cc138a73 100644 --- a/docs/arch-module/P-wtmd.html +++ b/docs/arch-module/P-wtmd.html @@ -51,7 +51,7 @@

An overview of the arch module's role and abilities.

-
+

§1. Prerequisites. The arch module is a part of the Inform compiler toolset. It is presented as a literate program or "web". Before diving in: @@ -148,8 +148,14 @@ anything". This should be the default; §5. Features. The last service provided by this module is to manage which named features of +the compiler are switched on or off: see Feature Manager. At one time +this functionality was part of the core Inform compiler, but having it here +means that all of the compiler tools can make use of it. +

+ diff --git a/docs/arch-module/index.html b/docs/arch-module/index.html index 84e8163ea..f3cb36614 100644 --- a/docs/arch-module/index.html +++ b/docs/arch-module/index.html @@ -97,6 +97,17 @@ +
  • +

    + Chapter 3: Features

    + +

  • diff --git a/docs/assertions-module/3-nvr.html b/docs/assertions-module/3-nvr.html index af61f4f65..e6f59bb81 100644 --- a/docs/assertions-module/3-nvr.html +++ b/docs/assertions-module/3-nvr.html @@ -360,7 +360,7 @@ now absolutely any non-empty word range is accepted as the property name.

    §5.3. So we can now use the above grammar to understand the definition of the verb. Note that it is legal, but does nothing, to request a built-in meaning which does not exist: this allows for Basic Inform to mention built-in meanings -which exist only when certain plugins are active. +which exist only when certain features are active.

    Find the verb meaning and priority5.3 = diff --git a/docs/assertions-module/4-ass.html b/docs/assertions-module/4-ass.html index f91fe6011..211a2b6cc 100644 --- a/docs/assertions-module/4-ass.html +++ b/docs/assertions-module/4-ass.html @@ -889,7 +889,7 @@ further sub-cases later.

    §6.3.17. Case 17. In fact one sentence like this can make sense — "The mist is -everywhere", or similar — but is handled by the spatial plugin, if active. +everywhere", or similar — but is handled by the spatial feature, if active. Even then, of course, "everywhere" implicitly means "in every room", not "every room".

    @@ -2057,7 +2057,7 @@ these sentences falls into case 41.

    East is the Pavilion.

    -

    (Of course this will only be true if the map plugin is active.) +

    (Of course this will only be true if the map feature is active.)

    Case 41 - PROPER NOUN on both sides6.3.41 = diff --git a/docs/assertions-module/4-rpt.html b/docs/assertions-module/4-rpt.html index a89a4b969..e61a0302f 100644 --- a/docs/assertions-module/4-rpt.html +++ b/docs/assertions-module/4-rpt.html @@ -115,7 +115,7 @@ the details of a description to the node.

    §3. It's useful to have a safe way of transferring the complete noun details from one node to another, without breaking the above invariant. (The -nowhere annotation is used by the spatial model plugin, if active, and +nowhere annotation is used by the spatial feature, if active, and it probably never needs to be copied, but we do so for safety's sake.)

    @@ -634,7 +634,7 @@ complicated description is as follows: else Node::set_subject(p, NULL); -

    §11.8.1. For example, "above" and "below" become significant if the mapping plugin +

    §11.8.1. For example, "above" and "below" become significant if the mapping feature is active, and "nowhere" if the spatial one is.

    diff --git a/docs/assertions-module/5-rcd.html b/docs/assertions-module/5-rcd.html index c713e91ea..21a26f115 100644 --- a/docs/assertions-module/5-rcd.html +++ b/docs/assertions-module/5-rcd.html @@ -94,7 +94,7 @@ about the location applies. Those two restrictions are both stored in its RCD. struct wording activity_context; text used to parse... struct activity_list *avl; happens only while these activities go on struct action_pattern *ap; happens only if the action or parameter matches this - void *plugin_rcd[MAX_PLUGINS]; storage for plugins to attach, if they want to + void *feature_rcd[MAX_COMPILER_FEATURES]; storage for features to attach, if they want to } id_runtime_context_data; id_runtime_context_data RuntimeContextData::new(void) { @@ -102,7 +102,7 @@ about the location applies. Those two restrictions are both stored in its RCD. phrcd.activity_context = EMPTY_WORDING; phrcd.avl = NULL; phrcd.ap = NULL; - for (int i=0; i<MAX_PLUGINS; i++) phrcd.plugin_rcd[i] = NULL; + for (int i=0; i<MAX_COMPILER_FEATURES; i++) phrcd.feature_rcd[i] = NULL; PluginCalls::new_rcd_notify(&phrcd); return phrcd; } @@ -114,13 +114,13 @@ about the location applies. Those two restrictions are both stored in its RCD.

    §2. For the more interesting clauses, see Scenes (in if) and Rules Predicated on Actions (in if), -where the scenes and actions plugins make use of the following extensibility: +where the scenes and actions features make use of the following extensibility:

    -
    define RCD_PLUGIN_DATA(id, rcd)
    -    ((id##_rcd_data *) rcd->plugin_rcd[id##_plugin->allocation_id])
    -define CREATE_PLUGIN_RCD_DATA(id, rcd, creator)
    -    (rcd)->plugin_rcd[id##_plugin->allocation_id] = (void *) (creator(rcd));
    +
    define RCD_FEATURE_DATA(id, rcd)
    +    ((id##_rcd_data *) rcd->feature_rcd[id##_feature->allocation_id])
    +define CREATE_RCD_FEATURE_DATA(id, rcd, creator)
    +    (rcd)->feature_rcd[id##_feature->allocation_id] = (void *) (creator(rcd));
     

    §3. Specificity. The following is one of Inform's standardised comparison routines, which takes a pair of objects A, B and returns 1 if A makes a more specific diff --git a/docs/assertions-module/5-rf.html b/docs/assertions-module/5-rf.html index 7b216aaf9..1b5b5da6e 100644 --- a/docs/assertions-module/5-rf.html +++ b/docs/assertions-module/5-rf.html @@ -122,7 +122,7 @@ this is divided up into smaller excerpts of text, as in the following examples: int owning_rulebook_placement; ...and with this placement value: see Rulebooks int permit_all_outcomes; waive the usual restrictions on rule outcomes - void *plugin_rfd[MAX_PLUGINS]; storage for plugins to attach, if they want to + void *feature_rfd[MAX_COMPILER_FEATURES]; storage for features to attach, if they want to CLASS_DEFINITION } rule_family_data; @@ -140,18 +140,18 @@ this is divided up into smaller excerpts of text, as in the following examples: rfd->owning_rulebook = NULL; rfd->owning_rulebook_placement = MIDDLE_PLACEMENT; rfd->permit_all_outcomes = FALSE; - for (int i=0; i<MAX_PLUGINS; i++) rfd->plugin_rfd[i] = NULL; + for (int i=0; i<MAX_COMPILER_FEATURES; i++) rfd->feature_rfd[i] = NULL; return rfd; }

    -

    §3. These two macros provide access to plugin-specific rule family data: +

    §3. These two macros provide access to feature-specific rule family data:

    -
    define RFD_PLUGIN_DATA(id, rfd)
    -    ((id##_rfd_data *) rfd->plugin_rfd[id##_plugin->allocation_id])
    -define CREATE_PLUGIN_RFD_DATA(id, rfd, creator)
    -    (rfd)->plugin_rfd[id##_plugin->allocation_id] = (void *) (creator(rfd));
    +
    define RFD_FEATURE_DATA(id, rfd)
    +    ((id##_rfd_data *) rfd->feature_rfd[id##_feature->allocation_id])
    +define CREATE_RFD_FEATURE_DATA(id, rfd, creator)
    +    (rfd)->feature_rfd[id##_feature->allocation_id] = (void *) (creator(rfd));
     

    §4. Identification. We are going to claim as our own any definition whose name matches the following nonterminal — and because of the last production, this will always diff --git a/docs/assertions-module/6-rls.html b/docs/assertions-module/6-rls.html index 617738fdf..0d1f0cc2b 100644 --- a/docs/assertions-module/6-rls.html +++ b/docs/assertions-module/6-rls.html @@ -290,7 +290,7 @@ nothing. kind *Rules::to_kind(rule *R) { kind *K = R->kind_of_rule; if (K == NULL) { - if (PluginManager::active(actions_plugin)) + if (FEATURE_ACTIVE(actions)) K = Kinds::binary_con(CON_rule, K_action_name, K_void); else K = Kinds::binary_con(CON_rule, K_void, K_void); diff --git a/docs/core-module/1-cm.html b/docs/core-module/1-cm.html index 37dea9958..a94e38905 100644 --- a/docs/core-module/1-cm.html +++ b/docs/core-module/1-cm.html @@ -67,22 +67,29 @@ function togglePopup(material_id) {

    §2. Like all modules, this one must define a start and end function.

    -

    Note that the "core" plugin itself does nothing except to be a parent to the +

    Note that the "core" feature itself does nothing except to be a parent to the other two; it doesn't even have an activation function.

    +

    The "experimental features" feature is similarly an umbrella for any features +being used to test out half-implemented compiler functionality before it's ready +to be part of a released version. +

    +
    enum TASK_QUEUE_DA
     enum INTER_DA
     enum INFORM_INTER_DA
     
    -plugin *core_plugin, *naming_plugin, *counting_plugin;
    +compiler_feature *core_feature, *naming_feature, *counting_feature, *experimental_feature;
     
     void CoreModule::start(void) {
    -    core_plugin = PluginManager::new(NULL, I"core", NULL);
    -    PluginManager::make_permanently_active(core_plugin);
    -    naming_plugin = PluginManager::new(&Naming::start, I"naming", core_plugin);
    -    counting_plugin = PluginManager::new(&InstanceCounting::start, I"instance counting", core_plugin);
    +    core_feature = Features::new(NULL, I"core", NULL);
    +    Features::make_permanently_active(core_feature);
    +    naming_feature = Features::new(&Naming::start, I"naming", core_feature);
    +    counting_feature = Features::new(&InstanceCounting::start, I"instance counting", core_feature);
    +
    +    experimental_feature = Features::new(NULL, I"experimental features", NULL);
     
         Log::declare_aspect(TASK_QUEUE_DA, L"task queue", FALSE, FALSE);
         Log::declare_aspect(INTER_DA, L"inter", FALSE, FALSE);
    @@ -112,7 +119,7 @@ want to produce predictable output for easier testing.
     }
     
    diff --git a/docs/core-module/1-cp.html b/docs/core-module/1-cp.html index ebb2dc9a0..fb405ce16 100644 --- a/docs/core-module/1-cp.html +++ b/docs/core-module/1-cp.html @@ -249,7 +249,6 @@ We begin with core itself. enum label_namespace_CLASS enum group_together_function_CLASS enum nascent_array_CLASS -enum plugin_CLASS enum runtime_kind_structure_CLASS enum slash_gpr_CLASS enum test_scenario_CLASS @@ -269,7 +268,6 @@ We begin with core itself. DECLARE_CLASS(label_namespace) DECLARE_CLASS(group_together_function) DECLARE_CLASS(nascent_array) -DECLARE_CLASS(plugin) DECLARE_CLASS(runtime_kind_structure) DECLARE_CLASS(slash_gpr) DECLARE_CLASS(test_scenario) @@ -371,7 +369,7 @@ We begin with core itself. DECLARE_CLASS(files_data)
    diff --git a/docs/core-module/1-cp2.html b/docs/core-module/1-cp2.html index 30fe36f71..4b7a1a876 100644 --- a/docs/core-module/1-cp2.html +++ b/docs/core-module/1-cp2.html @@ -165,7 +165,7 @@ bit or the <k-kind> bit set, which as we see above is } diff --git a/docs/core-module/1-cs.html b/docs/core-module/1-cs.html index 35471f8f3..fb8d72a2c 100644 --- a/docs/core-module/1-cs.html +++ b/docs/core-module/1-cs.html @@ -231,7 +231,7 @@ the above settings can be changed.) } diff --git a/docs/core-module/1-htc.html b/docs/core-module/1-htc.html index c983da8ea..49e479ad0 100644 --- a/docs/core-module/1-htc.html +++ b/docs/core-module/1-htc.html @@ -164,8 +164,8 @@ as possible.

    §2.2. Here, then, are the steps in the production line, presented without commentary. For what they do, see the relevant sections. Note that at the -end of each stage, plugins are allowed to add further steps; see -Task::advance_stage_to. +end of each stage, plugins made by compiler features are allowed to add +further steps; see Task::advance_stage_to.

    Before anything else can be done, we must create an empty Inter hierarchy @@ -655,7 +655,7 @@ to advance last_task}

    diff --git a/docs/core-module/1-inaa.html b/docs/core-module/1-inaa.html index 916a93f69..aca98dc2e 100644 --- a/docs/core-module/1-inaa.html +++ b/docs/core-module/1-inaa.html @@ -487,7 +487,7 @@ which compilation unit the node belongs. enum lpe_options_ANNOT int: options set for a literal pattern part enum multiplicity_ANNOT int: e.g., 5 for "five gold rings" enum new_relation_here_ANNOT binary_predicate: new relation as subject of "relates" sentence -enum nowhere_ANNOT int: used by the spatial plugin to show this represents "nowhere" +enum nowhere_ANNOT int: used by the spatial feature to show this represents "nowhere" enum predicate_ANNOT unary_predicate: which adjective is asserted enum quant_ANNOT quantifier: for quantified excerpts like "three baskets" enum quantification_parameter_ANNOT int: e.g., 3 for "three baskets" @@ -1340,7 +1340,7 @@ which compilation unit the node belongs. } diff --git a/docs/core-module/1-itc.html b/docs/core-module/1-itc.html index 3827edce2..20e12a9bd 100644 --- a/docs/core-module/1-itc.html +++ b/docs/core-module/1-itc.html @@ -470,7 +470,7 @@ and carry on regardless. diff --git a/docs/core-module/1-pp.html b/docs/core-module/1-pp.html index b6df9d5ba..90c278ae1 100644 --- a/docs/core-module/1-pp.html +++ b/docs/core-module/1-pp.html @@ -131,7 +131,7 @@ a final status indicator. } diff --git a/docs/core-module/1-wtc.html b/docs/core-module/1-wtc.html index 1a1701d65..896cd9b12 100644 --- a/docs/core-module/1-wtc.html +++ b/docs/core-module/1-wtc.html @@ -129,7 +129,8 @@ thing which is being compiled when it is. DocReferences::read_xrefs(); Task::issue_problems_arising(project->as_copy->vertex); - PluginManager::start_plugins(); + Features::allow_activation_functions(); + Features::run_activation_functions(); if (problem_count > 0) return FALSE; @@ -183,7 +184,7 @@ rough stages. Twenty is plenty. if (stage <= inform7_task->stage_of_compilation) internal_error("not an advance"); if (stage >= 20) internal_error("went too far"); if ((inform7_task->stage_of_compilation >= 0) && (problem_count == 0)) - PluginCalls::production_line(inform7_task->stage_of_compilation, debugging, timer); + PluginCalls::production_line(inform7_task->stage_of_compilation, debugging, timer); char *roman[] = { "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX" }; @@ -240,7 +241,7 @@ rough stages. Twenty is plenty. return inform7_task->project->as_copy->edition; } -parse_node_tree *Task::syntax_tree(void) { +parse_node_tree *Task::syntax_tree(void) { return latest_syntax_tree; } @@ -554,7 +555,7 @@ flag stays FALSE}
    diff --git a/docs/core-module/2-cp.html b/docs/core-module/2-cp.html index f60bbbeb0..b69849f44 100644 --- a/docs/core-module/2-cp.html +++ b/docs/core-module/2-cp.html @@ -139,7 +139,7 @@ below. } diff --git a/docs/core-module/2-kp.html b/docs/core-module/2-kp.html index e365c8d21..54c488cd8 100644 --- a/docs/core-module/2-kp.html +++ b/docs/core-module/2-kp.html @@ -158,7 +158,7 @@ below. } diff --git a/docs/core-module/2-pwst.html b/docs/core-module/2-pwst.html index 2cc2633e2..af9dba75a 100644 --- a/docs/core-module/2-pwst.html +++ b/docs/core-module/2-pwst.html @@ -493,7 +493,7 @@ group. } diff --git a/docs/core-module/2-si.html b/docs/core-module/2-si.html index 4a875df28..34f5f5223 100644 --- a/docs/core-module/2-si.html +++ b/docs/core-module/2-si.html @@ -409,7 +409,7 @@ own quaint syntax, and where there is syntax, there are error messages: } diff --git a/docs/core-module/2-sq.html b/docs/core-module/2-sq.html index 4de30bf87..f0813f305 100644 --- a/docs/core-module/2-sq.html +++ b/docs/core-module/2-sq.html @@ -204,7 +204,7 @@ actual constant 15 to the generic constant "number": } diff --git a/docs/core-module/2-up.html b/docs/core-module/2-up.html index c4fba59ee..a462a9061 100644 --- a/docs/core-module/2-up.html +++ b/docs/core-module/2-up.html @@ -386,7 +386,7 @@ a message which diagnoses the problem rather better. } diff --git a/docs/core-module/3-pc.html b/docs/core-module/3-pc.html index 2d6eed3d1..c5d711e2c 100644 --- a/docs/core-module/3-pc.html +++ b/docs/core-module/3-pc.html @@ -21,6 +21,7 @@ function togglePopup(material_id) { + @@ -57,32 +58,125 @@ function togglePopup(material_id) { -

    The interface between the main compiler and its plugins.

    +

    Giving compiler features the ability to install plugin functions.

    -
    +
    -

    §1. The following set of functions is an API for the main compiler to consult -with the plugins; put another way, it is also an API for the plugins to -influence the main compiler. They do so by adding plugs to the relevant rulebooks: -see PluginManager::plug. +

    §1. The three Inform compiler tools inform7, inbuild and inter +share a set of named compiler features, managed by Feature Manager (in arch). +At any given time these can be active or inactive.

    -

    Nothing can prevent this from being a big old miscellany, so we take them by +

    In inform7, features gain further abilities: they can attach storage to +certain internal data structures, and they can provide plugin functions which +interfere with the normal running of the compiler. +

    + +

    The names of these features are hard-wired into the compiler rather than being +stored in Preform grammar, and they therefore cannot be translated out of +English. But this is intentional. Dependencies on compiler features are managed +by name inside the supervisor module, and metadata for projects and kits +refers to those names. So they have to be the same regardless of the language +being used in the project. But it hardly matters, because these names are +invisible to all but the most expert users. +

    + +

    However, because it is possible to have headings in Inform source text which +restrict material according to whether a feature is active, we do need a +Preform nonterminal to parse those names. Here it is: +

    + +
    +<language-element> internal {
    +    TEMPORARY_TEXT(T)
    +    WRITE_TO(T, "%W", W);
    +    compiler_feature *F = Features::from_name(T);
    +    DISCARD_TEXT(T)
    +    if (F) {
    +        if (F->active == FALSE) {
    +            ==> { FALSE, F };
    +        } else {
    +            ==> { TRUE, F };
    +        }
    +        return TRUE;
    +    }
    +    ==> { fail nonterminal };
    +}
    +
    + +

    §2. As noted above, features can provide plugin functions, which go into what +we will call "plugin rulebooks" — there's a mixed metaphor here, but the idea +is that they behave like Inform rulebooks. When a rulebook is called, the +compiler works through each plug until one of them returns something other +than FALSE. +

    + +

    Features should add plugins in their activation functions, by calling +PluginCalls::plug, which has an interestingly vague type. The next +screenful of code looks like something of a workout for the C typechecker, but +it compiles under clang without even the -Wpedantic warning, and honestly +you're barely living as a C programmer if you never generate that one. +

    + +
    +linked_list *plugin_rulebooks[NO_DEFINED_PLUG_VALUES+1];  of void, reprehensibly
    +
    +void PluginCalls::start(void) {
    +    for (int i=0; i<=NO_DEFINED_PLUG_VALUES; i++)
    +        plugin_rulebooks[i] = NEW_LINKED_LIST(void);
    +}
    +
    +void PluginCalls::plug(int code, int (*R)()) {
    +    if (code > NO_DEFINED_PLUG_VALUES) internal_error("not a plugin call");
    +    void *vR = (void *) R;
    +    ADD_TO_LINKED_LIST(vR, void, plugin_rulebooks[code]);
    +}
    +
    +

    §3. The functions in Plugin Calls then make use of these macros, which are +the easiest way to persuade the C typechecker to allow variable arguments to +be passed in a portable way. Similarly, there are two macros not one because +C does not allow a void variable argument list. +

    + +

    We must take care that the variables introduced in the macro body do not mask +existing variables used in the arguments; the only way to do this is to give +them implausible names. +

    + +
    define PLUGINS_CALL(code, args...) {
    +    void *R_plugin_pointer_XYZZY;  no argument can have this name
    +    LOOP_OVER_LINKED_LIST(R_plugin_pointer_XYZZY, void, plugin_rulebooks[code]) {
    +        int (*R_plugin_rule_ZOOGE)() = (int (*)()) R_plugin_pointer_XYZZY;  or this one
    +        int Q_plugin_return_PLUGH = (*R_plugin_rule_ZOOGE)(args);  or this
    +        if (Q_plugin_return_PLUGH) return Q_plugin_return_PLUGH;
    +    }
    +    return FALSE;
    +}
    +define PLUGINS_CALLV(code) {
    +    void *R_plugin_pointer_XYZZY;
    +    LOOP_OVER_LINKED_LIST(R_plugin_pointer_XYZZY, void, plugin_rulebooks[code]) {
    +        int (*R_plugin_rule_ZOOGE)() = (int (*)()) R_plugin_pointer_XYZZY;
    +        int Q_plugin_return_PLUGH = (*R_plugin_rule_ZOOGE)();
    +        if (Q_plugin_return_PLUGH) return Q_plugin_return_PLUGH;
    +    }
    +    return FALSE;
    +}
    +
    +

    §4. Nothing can prevent this from being a big old miscellany, so we take them by compiler module, and within each module in alphabetical order.

    -

    §2. Influencing core. Called from Task::advance_stage_to. This allows plugins to run additional +

    §5. Influencing core. Called from Task::advance_stage_to. This allows features to run additional production-line steps in compilation, and that is done mostly at the Inter -generation stage, to add extra arrays or functions needed at run-time to -support whatever feature the plugin implements. For example, the mapping plugin -compiles an array to hold the map during stage INTER1_CSEQ. +generation stage, to add extra arrays or functions needed at runtime. +For example, the mapping feature compiles an array to hold the map during +stage INTER1_CSEQ.

    Because the following is called at the end of every main stage of compilation except for FINISHED_CSEQ, it is called about 15 times in all, so it is essential to check stage and act only on the right occasion. debugging is -TRUE if this is a debugging run, and allows a plugin to generate diagnostic -features if so. +TRUE if this is a debugging run.

    A function attached to this plug should then ideally divide its work up into @@ -100,9 +194,9 @@ takes will (if appreciable) be included in the PLUGINS_CALL(PRODUCTION_LINE_PLUG, stage, debugging, timer); } -

    §3. Influencing assertions. Called from Refine Parse Tree (in assertions) to ask if this node is a noun +

    §6. Influencing assertions. Called from Refine Parse Tree (in assertions) to ask if this node is a noun phrase with special significance: for example, "below" is significant to the -mapping plugin. If so, the plugin should set the subject of the node to say +mapping feature. If so, the plugin should set the subject of the node to say what it refers to, and return TRUE.

    @@ -113,8 +207,8 @@ what it refers to, and return PLUGINS_CALL(ACT_ON_SPECIAL_NPS_PLUG, p); } -

    §4. Called from Assemblies (in assertions). Body-snatching is used only by the -"player" plugin, and is explained there; it handles the consequences of sentences +

    §7. Called from Assemblies (in assertions). Body-snatching is used only by the +"player" feature, and is explained there; it handles the consequences of sentences like "The player is Lord Collingwood".

    @@ -126,7 +220,7 @@ like "The player is Lord Collingwood". PLUGINS_CALL(DETECT_BODYSNATCHING_PLUG, body, snatcher, counterpart); } -

    §5. Called from Assertions (in assertions) to see if any plugin wants to +

    §8. Called from Assertions (in assertions) to see if any plugin wants to intepret a sentence its own way, either taking direct action or issuing a more nuanced problem message than the usual machinery would have issued. If so, the plugin should return TRUE, which both ensures that no other @@ -141,8 +235,8 @@ with the sentence. PLUGINS_CALL(INTERVENE_IN_ASSERTION_PLUG, px, py); } -

    §6. Called from The Creator (in assertions) when a copular sentence may be -creating something. For example, the actions plugin needs this. +

    §9. Called from The Creator (in assertions) when a copular sentence may be +creating something. For example, the actions feature needs this.

    enum CREATION_PLUG
    @@ -152,8 +246,8 @@ creating something. For example, the actions plugin needs this.
         PLUGINS_CALL(CREATION_PLUG, px, py);
     }
     
    -

    §7. Called from Assertions (in assertions) when an unfamiliar node type appears -where a property value might be expected. For example, the actions plugin +

    §10. Called from Assertions (in assertions) when an unfamiliar node type appears +where a property value might be expected. For example, the actions feature uses this to deal with setting a property to an ACTION_NT node. To intervene, set the node specification using Refine Parse Tree (in assertions) and return TRUE; or return FALSE to let nature take its course. @@ -166,10 +260,10 @@ and return TRUE PLUGINS_CALL(UNUSUAL_PROPERTY_VALUE_PLUG, py); } -

    §8. Called from The Creator (in assertions) when an instance is being made in +

    §11. Called from The Creator (in assertions) when an instance is being made in an assembly, and its name may involve a genitive. For example, if the assembly says "every person has a nose", then normally this would be called -something like "Mr Rogers's nose"; but the player plugin uses the following +something like "Mr Rogers's nose"; but the player feature uses the following to have "your nose" in the case of the player instance.

    @@ -181,9 +275,9 @@ to have "your nose" in the case of the player instance. PLUGINS_CALL(IRREGULAR_GENITIVE_IN_ASSEMBLY_PLUG, owner, genitive, propriety); } -

    §9. Called from Booting Verbs (in assertions) to give each plugin a chance to +

    §12. Called from Booting Verbs (in assertions) to give each plugin a chance to create any special sentence meanings it would like to. For example, the -sounds plugin defines a special form of assertion sentence this way. The +sounds feature defines a special form of assertion sentence this way. The plugin should always return FALSE, since otherwise it may gazump other plugins and cause them to stop working.

    @@ -195,11 +289,11 @@ plugins and cause them to stop working. PLUGINS_CALLV(MAKE_SPECIAL_MEANINGS_PLUG); } -

    §10. Called from Assertions (in assertions) when it seems that the author wants +

    §13. Called from Assertions (in assertions) when it seems that the author wants to create a property of something with a sentence like "A container has a number called security rating." A plugin can intervene and act on that, returning TRUE to stop the usual machinery. For example, the actions -plugin does this so that "The going action has a number called celerity" +feature does this so that "The going action has a number called celerity" can be intercepted to create an action variable, not a property.

    @@ -210,7 +304,7 @@ can be intercepted to create an action variable, not a property. PLUGINS_CALL(OFFERED_PROPERTY_PLUG, K, owner, what); } -

    §11. Called from Assertions (in assertions) when the specification pseudo-variable +

    §14. Called from Assertions (in assertions) when the specification pseudo-variable is about to be set for something; the plugin can then intercept this.

    @@ -221,9 +315,9 @@ is about to be set for something; the plugin can then intercept this. PLUGINS_CALL(OFFERED_SPECIFICATION_PLUG, owner, W); } -

    §12. Called from Refine Parse Tree (in assertions) to ask plugins if a noun phrase +

    §15. Called from Refine Parse Tree (in assertions) to ask plugins if a noun phrase has a noun implicit within it, even though none is explicitly given. For -example, the player plugin uses this to say that "initially carried" means +example, the player feature uses this to say that "initially carried" means "...by the player", and sets the subject of the node to be the player character instance.

    @@ -235,8 +329,8 @@ instance. PLUGINS_CALL(REFINE_IMPLICIT_NOUN_PLUG, p); } -

    §13. Called from Classifying Sentences (in assertions) to give plugins the chance -of an early look at a newly-read assertion. For example, the map plugin uses +

    §16. Called from Classifying Sentences (in assertions) to give plugins the chance +of an early look at a newly-read assertion. For example, the map feature uses this to spot that a sentence will create a new direction.

    @@ -247,7 +341,7 @@ this to spot that a sentence will create a new direction. PLUGINS_CALL(NEW_ASSERTION_NOTIFY_PLUG, p); } -

    §14. Called from The Equality Relation Revisited (in assertions) when we have +

    §17. Called from The Equality Relation Revisited (in assertions) when we have to decide if it's valid to ask or declare that two things are the same. Returning TRUE says that it is always valid; returning FALSE leaves it to the regular machinery. This plug can therefore only be used to permit @@ -261,7 +355,7 @@ additional usages, not to restrict existing ones. PLUGINS_CALL(TYPECHECK_EQUALITY_PLUG, K1, K2); } -

    §15. Called from Assertions (in assertions) to warn plugins that a variable +

    §18. Called from Assertions (in assertions) to warn plugins that a variable is now being assigned a value by an explicit assertion sentence.

    @@ -272,7 +366,7 @@ is now being assigned a value by an explicit assertion sentence. PLUGINS_CALL(VARIABLE_VALUE_NOTIFY_PLUG, q, val); } -

    §16. Called from Rule Family (in assertions) to warn plugins that a new rule +

    §19. Called from Rule Family (in assertions) to warn plugins that a new rule definition has been found in the source text.

    @@ -283,7 +377,7 @@ definition has been found in the source text. PLUGINS_CALL(NEW_RULE_DEFN_NOTIFY_PLUG, id, rfd); } -

    §17. Called from Runtime Context Data (in assertions) to warn plugins that +

    §20. Called from Runtime Context Data (in assertions) to warn plugins that a new set of runtime context data is being made.

    @@ -294,9 +388,9 @@ a new set of runtime context data is being made. PLUGINS_CALL(NEW_RCD_NOTIFY_PLUG, rcd); } -

    §18. Influencing values. Called from Rvalues (in values) to allow plugins to help decide whether values +

    §21. Influencing values. Called from Rvalues (in values) to allow plugins to help decide whether values of the same kind would be equal if evaluated at runtime. For example, the -"scenes" plugin uses this to determine if two K_scene constants are equal. +scenes feature uses this to determine if two K_scene constants are equal. To make a decision, set rv to either TRUE or FALSE and return TRUE. To make no decision, return FALSE.

    @@ -308,7 +402,7 @@ To make no decision, return F PLUGINS_CALL(COMPARE_CONSTANT_PLUG, c1, c2, rv); } -

    §19. Called from Rvalues (in values) to allow plugins to compile rvalues in +

    §22. Called from Rvalues (in values) to allow plugins to compile rvalues in eccentric ways of their own: not in fact just for the whimsy of it, but to make it possible for plugins to support base kinds of their own. For example, the "actions" plugin needs this to deal with the "stored action" kind. @@ -321,7 +415,7 @@ the "actions" plugin needs this to deal with the "stored action" kind. PLUGINS_CALL(COMPILE_CONSTANT_PLUG, VH, K, spec); } -

    §20. Called from Conditions (in values) to allow plugins to compile conditions in +

    §23. Called from Conditions (in values) to allow plugins to compile conditions in their own way. For example, the "actions" plugin needs this to compile matches of the current action against an action pattern.

    @@ -333,9 +427,9 @@ of the current action against an action pattern. PLUGINS_CALL(COMPILE_CONDITION_PLUG, VH, spec); } -

    §21. Called from Specifications (in values) to ask if there is some reason why +

    §24. Called from Specifications (in values) to ask if there is some reason why a rule about I1 should be thought broader in scope than one about I2. This -is used by the regions plugin when one is a sub-region of the other. This is +is used by the regions feature when one is a sub-region of the other. This is expected to behave as a strcmp-like sorting function, with a positive return value saying I1 is broader, negative I2, or zero that they are equal.

    @@ -347,11 +441,11 @@ return value saying I1 PLUGINS_CALL(MORE_SPECIFIC_PLUG, I1, I2); } -

    §22. Called from Constants and Descriptions (in values) to give plugins a chance +

    §25. Called from Constants and Descriptions (in values) to give plugins a chance to parse text which might otherwise be meaningless (or mean something different) and make it a "composite noun-quantifier" such as "everywhere" or "nothing". The main compiler does not recognise "everywhere" because it has no concept -of space, but the spatial plugin does, and this is how. +of space, but the spatial feature does, and this is how.

    enum PARSE_COMPOSITE_NQS_PLUG
    @@ -362,7 +456,7 @@ of space, but the spatial plugin does, and this is how.
         PLUGINS_CALL(PARSE_COMPOSITE_NQS_PLUG, W, DW, quantifier_used, some_kind);
     }
     
    -

    §23. Influencing knowledge. Called from The Model World (in knowledge) to invite the plugin to participate +

    §26. Influencing knowledge. Called from The Model World (in knowledge) to invite the plugin to participate in stages I to V of the completion process. This may involve using contextual reasoning to draw further inferences.

    @@ -374,7 +468,7 @@ reasoning to draw further inferences. PLUGINS_CALL(COMPLETE_MODEL_PLUG, stage); } -

    §24. Called from Inference Subjects (in knowledge) to invite the plugin to +

    §27. Called from Inference Subjects (in knowledge) to invite the plugin to create any additional inference subjects it might want to reason about. In practice, this tends to be used to create preliminary subjects to stand in for significant kinds before those kinds are ready to be created. @@ -387,7 +481,7 @@ for significant kinds before those kinds are ready to be created. PLUGINS_CALLV(CREATE_INFERENCE_SUBJECTS_PLUG); } -

    §25. Called from Indefinite Appearance (in knowledge) to ask the plugins what +

    §28. Called from Indefinite Appearance (in knowledge) to ask the plugins what inferences, if any, to draw from a double-quoted text standing as an entire sentence. The infs is the subject which was being talked about at the time the text was quoted, and therefore presumably is what the text should describe. @@ -400,10 +494,10 @@ the text was quoted, and therefore presumably is what the text should describe. PLUGINS_CALL(DEFAULT_APPEARANCE_PLUG, infs, txt); } -

    §26. Called from Inferences (in knowledge) when an inference is drawn about +

    §29. Called from Inferences (in knowledge) when an inference is drawn about something. This does not, of course, necessarily mean that this will actually be the property of something: the inference might turn out to be mistaken. The -mapping plugin uses this to infer further that if something is said to be a +mapping feature uses this to infer further that if something is said to be a map connection to somewhere else, then it is probably a room.

    @@ -414,7 +508,7 @@ map connection to somewhere else, then it is probably a room. PLUGINS_CALL(INFERENCE_DRAWN_NOTIFY_PLUG, I, subj); } -

    §27. Called from Kind Subjects (in knowledge). Early in the run, before some kinds +

    §30. Called from Kind Subjects (in knowledge). Early in the run, before some kinds are created, placeholder inference subjects are created to stand in for them; this call enables plugins to recognise certain texts as referring to those.

    @@ -426,9 +520,9 @@ this call enables plugins to recognise certain texts as referring to those. PLUGINS_CALL(NAME_TO_EARLY_INFS_PLUG, W, infs); } -

    §28. Called from Kind Subjects (in knowledge) to warn plugins about a new kind, +

    §31. Called from Kind Subjects (in knowledge) to warn plugins about a new kind, which in practice enables them to spot from the name that it is actually a kind -they want to provide built-in support for: thus the actions plugin reacts to +they want to provide built-in support for: thus the actions feature reacts to the name "stored action", for example. K is the newcomer, super its super-kind, if any; d and W are alternate forms of that name — d will be useful if the kind was created by a kit (such as "number"), W if it came from Inform 7 @@ -442,8 +536,8 @@ source text (such as "container"). PLUGINS_CALL(NEW_BASE_KIND_NOTIFY_PLUG, K, d, W); } -

    §29. Called from Instances (in knowledge) to warn plugins that a new instance has -been created. For example, the figures plugin needs to know this so that it +

    §32. Called from Instances (in knowledge) to warn plugins that a new instance has +been created. For example, the figures feature needs to know this so that it can see when a new illustration has been created.

    @@ -459,8 +553,8 @@ sure you're not dealing with an object. PLUGINS_CALL(NEW_INSTANCE_NOTIFY_PLUG, nc); } -

    §30. Called from Property Permissions (in knowledge) to warn plugins that a subject -has been given permission to hold a property; the parsing plugin, for example, +

    §33. Called from Property Permissions (in knowledge) to warn plugins that a subject +has been given permission to hold a property; the parsing feature, for example, uses this to attach a visibility flag.

    @@ -471,7 +565,7 @@ uses this to attach a visibility flag. PLUGINS_CALL(NEW_PERMISSION_NOTIFY_PLUG, pp); } -

    §31. Called from Properties (in knowledge) to warn plugins that a property has +

    §34. Called from Properties (in knowledge) to warn plugins that a property has been created, which they can use to spot properties with special significance to them.

    @@ -483,7 +577,7 @@ to them. PLUGINS_CALL(NEW_PROPERTY_NOTIFY_PLUG, prn); } -

    §32. Called from Inference Subjects (in knowledge) to warn plugins that a subject +

    §35. Called from Inference Subjects (in knowledge) to warn plugins that a subject has been created, which they can use to spot subjects with special significance to them.

    @@ -495,7 +589,7 @@ to them. PLUGINS_CALL(NEW_SUBJECT_NOTIFY_PLUG, subj); } -

    §33. Called from Nonlocal Variables (in knowledge) to warn plugins that a new +

    §36. Called from Nonlocal Variables (in knowledge) to warn plugins that a new variable has been created, which they can use to spot variables with special significance to them.

    @@ -507,7 +601,7 @@ significance to them. PLUGINS_CALL(NEW_VARIABLE_NOTIFY_PLUG, q); } -

    §34. Called from Instances (in knowledge) to warn plugins that the kind of an +

    §37. Called from Instances (in knowledge) to warn plugins that the kind of an instance is about to be set. This happens most often when the instance is created, but can also happen again, refining the kind to a subkind, when the instance is an object. @@ -520,7 +614,7 @@ the instance is an object. PLUGINS_CALL(SET_KIND_NOTIFY_PLUG, I, k); } -

    §35. Called from Kind Subjects (in knowledge) when one kind of object is made a +

    §38. Called from Kind Subjects (in knowledge) when one kind of object is made a subkind of another, as for example when "container" is a made a subkind of "thing". The plugin should return TRUE if it wishes to forbid this, and if so, it had better throw a problem message, or the user will be @@ -538,8 +632,8 @@ regions plugin does with the "region" kind. PLUGINS_CALL(SET_SUBKIND_NOTIFY_PLUG, sub, super); } -

    §36. Influencing the imperative plugin. Called from Rule Bookings (in assertions) to give plugins a chance to move -automatically placed rules from one rulebook to another. The actions plugin +

    §39. Influencing the imperative module. Called from Rule Bookings (in assertions) to give plugins a chance to move +automatically placed rules from one rulebook to another. The actions feature uses this to break up what would otherwise be unwieldy before and after rulebooks into smaller ones for each action.

    @@ -555,7 +649,7 @@ and return TRUE PLUGINS_CALL(PLACE_RULE_PLUG, R, original_owner, new_owner); } -

    §37. Called from Rulebooks (in assertions). This is very similar, but runs in all cases, +

    §40. Called from Rulebooks (in assertions). This is very similar, but runs in all cases, and not only for automatic placement.

    @@ -566,7 +660,7 @@ and not only for automatic placement. PLUGINS_CALL(RULE_PLACEMENT_NOTIFY_PLUG, R, original_owner, side, ref_rule); } -

    §38.

    +

    §41.

    enum COMPILE_TEST_HEAD_PLUG
     
    @@ -575,7 +669,7 @@ and not only for automatic placement. PLUGINS_CALL(COMPILE_TEST_HEAD_PLUG, idb, R, tests); } -

    §39.

    +

    §42.

    enum COMPILE_TEST_TAIL_PLUG
     
    @@ -584,7 +678,7 @@ and not only for automatic placement. PLUGINS_CALL(COMPILE_TEST_TAIL_PLUG, idb, R); } -

    §40. Called from Compile Invocations Inline (in imperative), but only when an +

    §43. Called from Compile Invocations Inline (in imperative), but only when an annotation arises which the regular machinery doesn't know how to handle. This is currently only used by Timed Rules (in if).

    @@ -596,12 +690,12 @@ This is currently only used by
    PLUGINS_CALL(INLINE_ANNOTATION_PLUG, annot, supplied); } -

    §41. Influencing the actions plugin. We now have a whole run of functions called only by the actions plugin, and +

    §44. Influencing the actions feature. We now have a whole run of functions called only by the actions feature, and therefore only when it is active.

    Called from Actions Plugin (in if) to signal that a new action has been -created. For example, the going plugin uses this to spot the arrival of "going". +created. For example, the going feature uses this to spot the arrival of "going".

    enum NEW_ACTION_NOTIFY_PLUG
    @@ -611,7 +705,7 @@ created. For example, the going plugin uses this to spot the arrival of "going".
         PLUGINS_CALL(NEW_ACTION_NOTIFY_PLUG, an);
     }
     
    -

    §42. Called from Action Pattern Clauses (in if) to invite plugins to change the +

    §45. Called from Action Pattern Clauses (in if) to invite plugins to change the action pattern clause ID associated with a given action variable. This may be needed in order to cross-reference between multiple such clauses, as with the going action variables. @@ -625,7 +719,7 @@ the going action variables. PLUGINS_CALL(DIVERT_AP_CLAUSE_PLUG, stv, id); } -

    §43. Called from Action Pattern Clauses (in if) to ask plugins to print a helpful +

    §46. Called from Action Pattern Clauses (in if) to ask plugins to print a helpful name for the debugging log for any new clause ID C which they have created.

    @@ -636,7 +730,7 @@ name for the debugging log for any new clause ID PLUGINS_CALL(WRITE_AP_CLAUSE_ID_PLUG, OUT, C); } -

    §44. Called from Action Pattern Clauses (in if) to ask for the *_APCA aspect +

    §47. Called from Action Pattern Clauses (in if) to ask for the *_APCA aspect for the clause ID C, where C is a new clause ID created by the plugin. If this is not given, then the aspect will be MISC_APCA.

    @@ -648,7 +742,7 @@ this is not given, then the aspect will be PLUGINS_CALL(ASPECT_OF_AP_CLAUSE_ID_PLUG, C, A); } -

    §45. Called from Action Pattern Clauses (in if) to give plugins a chance to +

    §48. Called from Action Pattern Clauses (in if) to give plugins a chance to decide which AP is more specific, on the basis of the extra clauses defined in the plugin.

    @@ -672,7 +766,7 @@ to let the usual machinery take its course. PLUGINS_CALL(COMPARE_AP_SPECIFICITY_PLUG, ap1, ap2, rv, ignore_in); } -

    §46. Called from Action Pattern Clauses (in if) to notify plugins that a clause +

    §49. Called from Action Pattern Clauses (in if) to notify plugins that a clause matching an action variable has just been added to an action pattern.

    @@ -683,9 +777,9 @@ matching an action variable has just been added to an action pattern. PLUGINS_CALL(NEW_AP_CLAUSE_PLUG, ap, apoc); } -

    §47. Called from Parse Clauses (in if) to give plugins a chance to intervene in +

    §50. Called from Parse Clauses (in if) to give plugins a chance to intervene in the normal process of evaluating the meaning of text in an action pattern -clause: for example, in parsing "going nowhere", the going plugin uses this +clause: for example, in parsing "going nowhere", the going feature uses this to detect that the NOUN_AP_CLAUSE, with text "nowhere", should not be parsed normally. What it does it to set a bit in the bitmap bits, which it will pick up again and act upon when reacting to ACT_ON_ANL_ENTRY_OPTIONS_PLUG. @@ -702,7 +796,7 @@ text of the clause in the normal way. PLUGINS_CALL(PARSE_AP_CLAUSE_PLUG, an, c, bits); } -

    §48. Called from Parse Clauses (in if) to give plugins a chance to intervene in +

    §51. Called from Parse Clauses (in if) to give plugins a chance to intervene in the type-checking process for a clause. Ordinarily, this would just check that the contents have the right kind: if matching an action variable of kind K then it must be a value compatible with K or a description of such. @@ -720,7 +814,7 @@ or FALSE (it is PLUGINS_CALL(VALIDATE_AP_CLAUSE_PLUG, an, c, outcome); } -

    §49. Called from Parse Clauses (in if) to deal with the options bitmap set +

    §52. Called from Parse Clauses (in if) to deal with the options bitmap set previously by a PARSE_AP_CLAUSE_PLUG call: see above.

    @@ -731,7 +825,7 @@ previously by a PARSE_AP_CLAU PLUGINS_CALL(ACT_ON_ANL_ENTRY_OPTIONS_PLUG, entry, entry_options, fail); } -

    §50. Called from Matching Action Patterns (in imperative) when assembling the requirement +

    §53. Called from Matching Action Patterns (in imperative) when assembling the requirement clauses for compiling a mattern match; this gives plugins a chance to act extra stipulations, which are not explicit in clauses already in the pattern.

    @@ -744,7 +838,7 @@ extra stipulations, which are not explicit in clauses already in the pattern. PLUGINS_CALL(SET_PATTERN_MATCH_REQUIREMENTS_PLUG, ap, cpm, needed, needed_apoc); } -

    §51. Called from Matching Action Patterns (in imperative) when compiling any additional +

    §54. Called from Matching Action Patterns (in imperative) when compiling any additional requirements set by SET_PATTERN_MATCH_REQUIREMENTS_PLUG.

    @@ -756,7 +850,7 @@ requirements set by SET_PATTE } diff --git a/docs/core-module/P-wtmd.html b/docs/core-module/P-wtmd.html index 7b8a7bcf5..ba597149f 100644 --- a/docs/core-module/P-wtmd.html +++ b/docs/core-module/P-wtmd.html @@ -96,13 +96,11 @@ needed to make Inform's many concepts work at run-time.

    There are then two expansion packs, as it were: the if and multimedia modules, which do nothing essential but add support for interactive fiction -and for sound and images respectively. These are implemented very largely -as sets of Chapter 3: Plugins, an architecture which allows the basic Inform -language to be made more domain-specific. +and for sound and images respectively.

    diff --git a/docs/core-module/index.html b/docs/core-module/index.html index 2ab87b5f2..1d60d90a4 100644 --- a/docs/core-module/index.html +++ b/docs/core-module/index.html @@ -154,15 +154,10 @@ Chapter 3: Plugins

    Extensions to the main compiler, which can be either active or inactive.

      -
    • -

      - Plugin Manager - - Creating, activating or deactivating plugins.

      -
    • Plugin Calls - - The interface between the main compiler and its plugins.

      + Giving compiler features the ability to install plugin functions.

    diff --git a/docs/final-module/4-i6o.html b/docs/final-module/4-i6o.html index ec54bd778..4cd83c44a 100644 --- a/docs/final-module/4-i6o.html +++ b/docs/final-module/4-i6o.html @@ -483,10 +483,10 @@ enumerated these colours as 1, 2, 3.

    §9. For the I6 header syntax, see the DM4. Note that the "hardwired" short name is intentionally made blank: we always use I6's short_name property -instead. I7's spatial plugin, if loaded (as it usually is), will have +instead. I7's spatial feature, if loaded (as it usually is), will have annotated the Inter symbol for the object with an "arrow count", that is, a measure of its spatial depth. This we translate into I6 arrow notation. -If the spatial plugin wasn't loaded then we have no notion of containment, +If the spatial feature wasn't loaded then we have no notion of containment, all arrow counts are 0, and we define a flat sequence of free-standing objects.

    diff --git a/docs/if-module/1-im.html b/docs/if-module/1-im.html index af920405d..dcc5c9f3a 100644 --- a/docs/if-module/1-im.html +++ b/docs/if-module/1-im.html @@ -79,7 +79,7 @@ function togglePopup(material_id) { COMPILE_WRITER(action_name *, ActionNameNames::log) void IFModule::start(void) { - IFModule::create_plugins(); + IFModule::create_features(); Register this module's debugging log aspects2.2; Register this module's debugging log writers2.3; Register this module's direct memory usage2.5; @@ -143,44 +143,44 @@ function togglePopup(material_id) { }

    §4. Plugins. Except for the current minimal section of code, the if module is comprised -of the following plugins. They all belong to an "if" plugin, but that does +of the following features. They all belong to an "if" feature, but that does nothing except to be a parent to them; it has no activation function.

    -plugin *actions_plugin, *going_plugin,
    -    *backdrops_plugin, *bibliographic_plugin, *chronology_plugin,
    -    *devices_plugin, *map_plugin, *parsing_plugin, *persons_plugin, *player_plugin,
    -    *regions_plugin, *scenes_plugin, *scoring_plugin, *showme_plugin, *spatial_plugin,
    -    *timed_rules_plugin, *times_plugin;
    +compiler_feature *actions_feature, *going_feature,
    +    *backdrops_feature, *bibliographic_feature, *chronology_feature,
    +    *devices_feature, *map_feature, *parsing_feature, *persons_feature, *player_feature,
    +    *regions_feature, *scenes_feature, *scoring_feature, *showme_feature, *spatial_feature,
    +    *timed_rules_feature, *times_feature;
     

    §5.

    -void IFModule::create_plugins(void) {
    -    plugin *ifp = PluginManager::new(NULL, I"interactive fiction", NULL);
    +void IFModule::create_features(void) {
    +    compiler_feature *ifp = Features::new(NULL, I"interactive fiction", NULL);
     
    -     must be created before the other world model plugins
    -    spatial_plugin = PluginManager::new(&Spatial::start, I"spatial model", ifp);
    +     must be created before the other world model features
    +    spatial_feature = Features::new(&Spatial::start, I"spatial model", ifp);
     
    -    backdrops_plugin = PluginManager::new(&Backdrops::start, I"backdrops", ifp);
    -    bibliographic_plugin = PluginManager::new(&BibliographicData::start, I"bibliographic data", ifp);
    -    chronology_plugin = PluginManager::new(&Chronology::start_plugin, I"chronology", ifp);
    -    devices_plugin = PluginManager::new(&PL::Devices::start, I"devices", ifp);
    -    map_plugin = PluginManager::new(&Map::start, I"mapping", ifp);
    -    persons_plugin = PluginManager::new(&PL::Persons::start, I"persons", ifp);
    -    player_plugin = PluginManager::new(&Player::start, I"player", ifp);
    -    regions_plugin = PluginManager::new(&Regions::start, I"regions", ifp);
    -    scenes_plugin = PluginManager::new(&Scenes::start, I"scenes", ifp);
    -    scoring_plugin = PluginManager::new(&TheScore::start, I"scoring", ifp);
    -    timed_rules_plugin = PluginManager::new(TimedRules::start, I"timed rules", ifp);
    -    times_plugin = PluginManager::new(TimesOfDay::start, I"times of day", ifp);
    +    backdrops_feature = Features::new(&Backdrops::start, I"backdrops", ifp);
    +    bibliographic_feature = Features::new(&BibliographicData::start, I"bibliographic data", ifp);
    +    chronology_feature = Features::new(&Chronology::start_feature, I"chronology", ifp);
    +    devices_feature = Features::new(&PL::Devices::start, I"devices", ifp);
    +    map_feature = Features::new(&Map::start, I"mapping", ifp);
    +    persons_feature = Features::new(&PL::Persons::start, I"persons", ifp);
    +    player_feature = Features::new(&Player::start, I"player", ifp);
    +    regions_feature = Features::new(&Regions::start, I"regions", ifp);
    +    scenes_feature = Features::new(&Scenes::start, I"scenes", ifp);
    +    scoring_feature = Features::new(&TheScore::start, I"scoring", ifp);
    +    timed_rules_feature = Features::new(TimedRules::start, I"timed rules", ifp);
    +    times_feature = Features::new(TimesOfDay::start, I"times of day", ifp);
     
    -    actions_plugin = PluginManager::new(&ActionsPlugin::start, I"actions", ifp);
    -    going_plugin = PluginManager::new(&GoingPlugin::start, I"going", actions_plugin);
    +    actions_feature = Features::new(&ActionsPlugin::start, I"actions", ifp);
    +    going_feature = Features::new(&GoingPlugin::start, I"going", actions_feature);
     
    -    parsing_plugin = PluginManager::new(&ParsingPlugin::start, I"command", ifp);
    -    showme_plugin = PluginManager::new(&RTShowmeCommand::start, I"showme", parsing_plugin);
    +    parsing_feature = Features::new(&ParsingPlugin::start, I"command", ifp);
    +    showme_feature = Features::new(&RTShowmeCommand::start, I"showme", parsing_feature);
     }
     
    -

    The core compiler in a natural-language design system for interactive fiction. This is version 10.1.0.

    +

    The core compiler in a natural-language design system for interactive fiction. This is version 10.2.0.


      diff --git a/docs/inform7/preform-diagnostics.txt b/docs/inform7/preform-diagnostics.txt index 9b894c05b..da6909703 100644 --- a/docs/inform7/preform-diagnostics.txt +++ b/docs/inform7/preform-diagnostics.txt @@ -16,7 +16,7 @@ internal nti 19 constraint (none) extremes [1, 1] - internal hits 2901/25368 nti 20 constraint (none) extremes [1, 1] + internal hits 2901/25424 nti 20 constraint (none) extremes [1, 1] internal nti 21 constraint (none) extremes [1, 1] @@ -4758,12 +4758,12 @@ internal hits 0/258 nti 14 constraint (none) extremes [1, infinity) - hits 36373/72746 nti 11 constraint (none) extremes [1, infinity) + hits 36382/72764 nti 11 constraint (none) extremes [1, infinity) English: {...} - (hits 7878/36373) (matched long text) constraint (none) extremes [2, infinity) + (hits 7877/36382) (matched long text) constraint (none) extremes [2, infinity) {...} - (hits 28495/28495) (matched long text) constraint (none) extremes [1, infinity) + (hits 28505/28505) (matched long text) constraint (none) extremes [1, infinity) nti 12 constraint (none) extremes [1, infinity) English: @@ -4772,21 +4772,21 @@ {...} constraint (none) extremes [1, infinity) - hits 83045/166090 nti 13 constraint (none) extremes [1, infinity) + hits 83051/166102 nti 13 constraint (none) extremes [1, infinity) English:
      {...} - (hits 16076/47454) (matched long text) constraint (none) extremes [2, infinity) + (hits 16076/47460) (matched long text) constraint (none) extremes [2, infinity) {...} - (hits 66969/66969) (matched long text) constraint (none) extremes [1, infinity) + (hits 66975/66975) (matched long text) constraint (none) extremes [1, infinity) nti 14 constraint (none) extremes [2, infinity) English:
      {...} constraint (none) extremes [2, infinity) -
      internal hits 16530/98966 nti r2 constraint (none) extremes [1, 1] +
      internal hits 16530/98978 nti r2 constraint (none) extremes [1, 1] - internal hits 20373/236440 nti r2 constraint (none) extremes [1, 1] + internal hits 20372/236458 nti r2 constraint (none) extremes [1, 1] internal hits 2283/41534 nti r2 constraint (none) extremes [1, 1] @@ -6417,6 +6417,13 @@ {......} constraint (none) extremes [1, infinity) + hits 5/10 nti 11 constraint (none) extremes [1, infinity) + English: +
      + constraint (none) extremes [2, infinity) + + (hits 5/5) (matched: 'leading-through') constraint (none) extremes [1, infinity) + hits 5/12 nti 23 constraint DS = {23} extremes [3, infinity) English: to @@ -6507,7 +6514,7 @@ constraint (none) extremes [1, infinity) - nti 11 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English:
      constraint (none) extremes [2, infinity) @@ -6523,7 +6530,7 @@ constraint (none) extremes [1, infinity) - hits 74/1260 nti 12 constraint DS = {11} extremes [1, infinity) + hits 74/1260 nti 13 constraint DS = {11} extremes [1, infinity) English: (hits 74/340) (matched: 'a verb') constraint DS = {11} extremes [2, infinity) @@ -6539,7 +6546,7 @@ verb implying/meaning (hits 0/423) constraint DS = {11} extremes [3, infinity) - hits 82/168 nti 13 constraint DS = {12} extremes [2, infinity) + hits 82/168 nti 14 constraint DS = {12} extremes [2, infinity) English: (hits 82/84) (matched long text) constraint DS = {12} extremes [3, infinity) @@ -6610,14 +6617,14 @@ {...} (hits 3/3) (matched: 'he conceals') constraint (none) extremes [2, infinity) - hits 1/4 nti 14 constraint (none) extremes [1, infinity) + hits 1/4 nti 15 constraint (none) extremes [1, infinity) English: {***} (hits 1/2) (matched: 'concealing') constraint (none) extremes [1, infinity) {***} (hits 0/1) constraint (none) extremes [1, infinity) - hits 0/856 nti 15 constraint DS = {18} extremes [1, infinity) + hits 0/856 nti 16 constraint DS = {18} extremes [1, infinity) English: (hits 0/259) constraint DS = {18} extremes [2, infinity) @@ -6752,14 +6759,14 @@ {...} ( called {...} ) {***} (hits 18/476) (matched long text) constraint DS = {27} extremes [5, infinity) - hits 0/2020 nti 28 constraint (none) extremes [1, infinity) + hits 0/2032 nti 28 constraint (none) extremes [1, infinity) English:
      (hits 0/156) constraint (none) extremes [1, 1] {***} (/)/{/}/,/./(- {***} (hits 0/343) constraint DS = {28} extremes [1, infinity) {***} {***} - (hits 0/940) constraint (none) extremes [1, infinity) + (hits 0/946) constraint (none) extremes [1, infinity) hits 0/1614 nti 29 constraint (none) extremes [1, infinity) English: @@ -6835,13 +6842,13 @@ {to} constraint CS = {13} extremes [1, 1] to {...} ( called {...} ) - (hits 0/804) constraint DS = {13} extremes [6, infinity) + (hits 0/807) constraint DS = {13} extremes [6, infinity) {to ...} ( this is the {### function} inverse to {###} ) - (hits 16/677) (matched long text) constraint DS = {13} extremes [12, infinity) + (hits 16/680) (matched long text) constraint DS = {13} extremes [12, infinity) {to ...} ( this is the {### function} ) - (hits 4/719) (matched long text) constraint DS = {13} extremes [9, infinity) + (hits 4/722) (matched long text) constraint DS = {13} extremes [9, infinity) {to ...} ( this is {...} ) - (hits 0/763) constraint DS = {13} extremes [7, infinity) + (hits 0/766) constraint DS = {13} extremes [7, infinity) {to ...} (hits 477/862) (matched long text) constraint DS = {13} extremes [2, infinity) @@ -6872,7 +6879,7 @@ to {...} (hits 302/302) (matched long text) constraint DS = {16} extremes [2, infinity) - hits 161/322 nti 16 constraint (none) extremes [1, infinity) + hits 161/322 nti 17 constraint (none) extremes [1, infinity) English: (hits 161/161) (matched: 'relation of objects') constraint (none) extremes [1, infinity) @@ -7005,11 +7012,11 @@ {......} (hits 0/5) constraint (none) extremes [1, infinity) - internal hits 24/68 nti 17 constraint (none) extremes [1, infinity) + internal hits 24/68 nti 18 constraint (none) extremes [1, infinity) - internal hits 102/3338 nti 18 constraint (none) extremes [1, infinity) + internal hits 102/3338 nti 19 constraint (none) extremes [1, infinity) - hits 65/130 nti 19 constraint (none) extremes [1, infinity) + hits 65/130 nti 20 constraint (none) extremes [1, infinity) English: {...} (hits 20/65) (matched long text) constraint (none) extremes [1, infinity) @@ -7029,14 +7036,14 @@ and/or (hits 0/36) constraint DS = {23} extremes [2, infinity) - hits 65/130 nti 20 constraint (none) extremes [1, infinity) + hits 65/130 nti 21 constraint (none) extremes [1, infinity) English: {...} (hits 20/65) (matched: 'without printing a room description') constraint (none) extremes [1, infinity) {...} (hits 45/45) (matched: 'without printing a room description') constraint (none) extremes [1, infinity) - hits 102/204 nti 21 constraint (none) extremes [1, infinity) + hits 102/204 nti 22 constraint (none) extremes [1, infinity) English: {...} (hits 43/102) (matched long text) constraint (none) extremes [1, infinity) @@ -7052,7 +7059,7 @@ _,/and (hits 86/168) (matched long text) constraint DS = {24} extremes [2, infinity) - hits 102/204 nti 22 constraint (none) extremes [1, infinity) + hits 102/204 nti 23 constraint (none) extremes [1, infinity) English: (hits 102/102) (matched: 'giving brief inventory information') constraint (none) extremes [1, infinity) @@ -7070,7 +7077,7 @@ this is {...} rules (hits 0/346) constraint DS = {25} extremes [4, infinity) {...} ( this is the {... rule} ) - (hits 283/305) (matched long text) constraint DS = {25} extremes [8, infinity) + (hits 286/308) (matched long text) constraint DS = {25} extremes [8, infinity) {...} ( this is the rule ) (hits 0/31) constraint DS = {25} extremes [7, infinity) {...} ( this is {...} rule ) @@ -7078,7 +7085,7 @@ {...} ( this is {...} rules ) (hits 0/31) constraint DS = {25} extremes [7, infinity) {...} - (hits 89/89) (matched long text) constraint (none) extremes [1, infinity) + (hits 86/86) (matched long text) constraint (none) extremes [1, infinity) hits 372/744 nti 28 constraint (none) extremes [1, infinity) English: @@ -7159,7 +7166,7 @@ constraint (none) extremes [1, infinity) - nti 23 constraint (none) extremes [1, infinity) + nti 24 constraint (none) extremes [1, infinity) English: constraint DS = {9} extremes [3, infinity) @@ -7173,7 +7180,7 @@ _,/or constraint DS = {9} extremes [2, infinity) - nti 24 constraint (none) extremes [1, infinity) + nti 25 constraint (none) extremes [1, infinity) English: {......} constraint (none) extremes [1, infinity) @@ -7185,7 +7192,7 @@ (hits 38/38) (matched: 'dropping or throwing or inserting or putting') constraint (none) extremes [1, infinity) - hits 39/78 nti 25 constraint (none) extremes [1, infinity) + hits 39/78 nti 26 constraint (none) extremes [1, infinity) English: {...} (hits 13/39) (matched: 'throwing or inserting or putting') constraint (none) extremes [1, infinity) @@ -7223,14 +7230,14 @@ (hits 3/14) (matched: 'smelling') constraint (none) extremes [1, infinity) - internal hits 76/152 nti 26 constraint (none) extremes [0, 0] + internal hits 76/152 nti 27 constraint (none) extremes [0, 0] - hits 1197/2394 nti 15 constraint DS = {15} extremes [2, infinity) + hits 1206/2412 nti 15 constraint DS = {15} extremes [2, infinity) English: {...} rule - (hits 1197/1197) (matched long text) constraint DS = {15} extremes [2, infinity) + (hits 1206/1206) (matched long text) constraint DS = {15} extremes [2, infinity) - internal hits 123/246 nti 27 constraint (none) extremes [1, infinity) + internal hits 123/246 nti 28 constraint (none) extremes [1, infinity) hits 431/862 nti 16 constraint (none) extremes [1, infinity) English: @@ -7254,11 +7261,11 @@ {...} rulebook constraint DS = {17} extremes [2, infinity) - internal hits 82/164 nti 28 constraint (none) extremes [1, infinity) + internal hits 82/164 nti 29 constraint (none) extremes [1, infinity) - internal hits 372/792 nti 29 constraint (none) extremes [1, infinity) + internal hits 372/792 nti 30 constraint (none) extremes [1, infinity) - hits 396/792 nti 30 constraint (none) extremes [1, infinity) + hits 396/792 nti 6 constraint (none) extremes [1, infinity) English: (hits 19/396) (matched: 'a first turn sequence rule') constraint (none) extremes [2, infinity) @@ -7293,7 +7300,7 @@ {...} (hits 392/392) (matched long text) constraint (none) extremes [1, infinity) - internal hits 8/1232 nti 6 constraint (none) extremes [1, infinity) + internal hits 8/1232 nti 7 constraint (none) extremes [1, infinity) hits 7/14 nti 23 constraint (none) extremes [1, infinity) English: @@ -7304,14 +7311,14 @@ {...} constraint (none) extremes [1, infinity) - nti 7 constraint (none) extremes [1, infinity) + nti 8 constraint (none) extremes [1, infinity) English: constraint CS = {20} extremes [1, 2] {...} constraint (none) extremes [1, infinity) - hits 27/54 nti 8 constraint (none) extremes [1, infinity) + hits 27/54 nti 9 constraint (none) extremes [1, infinity) English: {...} (hits 10/27) (matched long text) constraint (none) extremes [1, infinity) @@ -7327,7 +7334,7 @@ _,/and/or (hits 20/76) (matched long text) constraint DS = {22} extremes [2, infinity) - hits 27/54 nti 9 constraint (none) extremes [1, infinity) + hits 27/54 nti 10 constraint (none) extremes [1, infinity) English: {...} (hits 10/27) (matched: 'there is sufficient light ( failure )') constraint (none) extremes [1, infinity) @@ -7397,7 +7404,7 @@ after {...} constraint DS = {28} extremes [2, infinity) - internal hits 1/84 nti 10 constraint (none) extremes [1, infinity) + internal hits 1/84 nti 11 constraint (none) extremes [1, infinity) hits 28/56 nti 6 constraint (none) extremes [1, infinity) English: @@ -7470,7 +7477,7 @@ {***} with blank row/rows for each/every {...} (hits 1/5) (matched long text) constraint DS = {11} extremes [6, infinity) - hits 164/328 nti 11 constraint (none) extremes [1, infinity) + hits 164/328 nti 12 constraint (none) extremes [1, infinity) English: (hits 14/14) (matched: '--') constraint CS = {12} extremes [1, 1] @@ -7542,7 +7549,7 @@ {...} where {...} constraint DS = {18} extremes [3, infinity) - hits 4/8 nti 12 constraint (none) extremes [1, infinity) + hits 4/8 nti 13 constraint (none) extremes [1, infinity) English: {...} (hits 0/4) constraint (none) extremes [1, infinity) @@ -7558,7 +7565,7 @@ _,/and constraint DS = {20} extremes [2, infinity) - hits 4/8 nti 13 constraint (none) extremes [1, infinity) + hits 4/8 nti 14 constraint (none) extremes [1, infinity) English: {...} (hits 0/4) constraint (none) extremes [1, infinity) @@ -7582,7 +7589,7 @@ constraint (none) extremes [1, infinity) - hits 4/8 nti 14 constraint (none) extremes [1, infinity) + hits 4/8 nti 15 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'x') constraint (none) extremes [1, infinity) @@ -7591,7 +7598,7 @@ {...} constraint (none) extremes [1, infinity) - internal hits 4/8 nti 15 constraint (none) extremes [1, infinity) + internal hits 4/8 nti 16 constraint (none) extremes [1, infinity) hits 18/86 nti 21 constraint DS = {21} extremes [8, infinity) English: @@ -7631,7 +7638,7 @@ (hits 0/9846) constraint (none) extremes [1, infinity) - internal hits 682/1364 nti 16 constraint (none) extremes [1, 1] + internal hits 682/1364 nti 17 constraint (none) extremes [1, 1] hits 78/2614 nti 15 constraint CS = {15} extremes [1, 1] English: @@ -7640,9 +7647,9 @@ true (hits 49/1278) (matched: 'true') constraint CS = {15} extremes [1, 1] - internal nti 17 constraint (none) extremes [1, infinity) + internal nti 18 constraint (none) extremes [1, infinity) - internal hits 0/19692 nti 18 constraint (none) extremes [1, infinity) + internal hits 0/19692 nti 19 constraint (none) extremes [1, infinity) hits 11/19870 nti 13 constraint (none) extremes [1, infinity) English: @@ -7657,7 +7664,7 @@ (hits 1/9925) (matched: '0.5') constraint (none) extremes [1, infinity) - internal hits 1/19850 nti 19 constraint (none) extremes [1, infinity) + internal hits 1/19850 nti 20 constraint (none) extremes [1, infinity) hits 0/7420 nti 20 constraint DW = {18, 19, 20} extremes [2, 5] English: @@ -7677,7 +7684,7 @@ hour/hours minute/minutes (hits 0/545) constraint DS = {18} extremes [4, 4] - hits 0/830 nti 20 constraint DS = {19} extremes [2, 2] + hits 0/830 nti 21 constraint DS = {19} extremes [2, 2] English: (hits 0/415) constraint DS = {19} extremes [2, 2] @@ -7691,18 +7698,18 @@ pm constraint CS = {19} extremes [1, 1] - internal hits 0/830 nti 21 constraint (none) extremes [1, 1] + internal hits 0/830 nti 22 constraint (none) extremes [1, 1] - internal nti 22 constraint (none) extremes [1, 1] + internal nti 23 constraint (none) extremes [1, 1] - nti 23 constraint (none) extremes [1, infinity) + nti 24 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] constraint (none) extremes [1, infinity) - internal nti 24 constraint (none) extremes [1, infinity) + internal nti 25 constraint (none) extremes [1, infinity) hits 0/6500 nti 17 constraint DS = {17} extremes [2, infinity) English: @@ -7718,39 +7725,39 @@ constraint (none) extremes [1, infinity) - nti 25 constraint (none) extremes [1, infinity) + nti 26 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) {......} constraint (none) extremes [1, infinity) - internal hits 4/8 nti 26 constraint (none) extremes [1, infinity) + internal hits 4/8 nti 27 constraint (none) extremes [1, infinity) - internal hits 4/16 nti 27 constraint (none) extremes [1, infinity) + internal hits 4/16 nti 28 constraint (none) extremes [1, infinity) - internal hits 3219/8270 nti 28 constraint (none) extremes [1, infinity) + internal hits 3219/8270 nti 29 constraint (none) extremes [1, infinity) - internal hits 1096/2196 nti 29 constraint (none) extremes [1, infinity) + internal hits 1096/2196 nti 30 constraint (none) extremes [1, infinity) - internal hits 8/16 nti 30 constraint (none) extremes [1, infinity) + internal hits 8/16 nti 6 constraint (none) extremes [1, infinity) - internal hits 1965/5226 nti 6 constraint (none) extremes [1, infinity) + internal hits 1965/5226 nti 7 constraint (none) extremes [1, infinity) - internal hits 1273/3060 nti 7 constraint (none) extremes [1, infinity) + internal hits 1273/3060 nti 8 constraint (none) extremes [1, infinity) - internal hits 530/1074 nti 8 constraint (none) extremes [1, infinity) + internal hits 530/1074 nti 9 constraint (none) extremes [1, infinity) - hits 241/1720 nti 9 constraint (none) extremes [1, infinity) + hits 241/1720 nti 10 constraint (none) extremes [1, infinity) English: (hits 189/790) (matched long text) constraint (none) extremes [1, infinity) (hits 52/601) (matched long text) constraint (none) extremes [1, infinity) - internal hits 0/244 nti 10 constraint (none) extremes [1, infinity) + internal hits 0/244 nti 11 constraint (none) extremes [1, infinity) - internal hits 0/244 nti 11 constraint (none) extremes [1, infinity) + internal hits 0/244 nti 12 constraint (none) extremes [1, infinity) hits 2373/20958 nti 29 constraint (none) extremes [1, infinity) English: @@ -7769,28 +7776,28 @@ response ( ) (hits 0/779) constraint DS = {29} extremes [5, infinity) - internal hits 449/17164 nti 12 constraint (none) extremes [1, infinity) + internal hits 449/17164 nti 13 constraint (none) extremes [1, infinity) - internal hits 0/244 nti 13 constraint (none) extremes [1, infinity) + internal hits 0/244 nti 14 constraint (none) extremes [1, infinity) - internal nti 14 constraint (none) extremes [1, infinity) + internal nti 15 constraint (none) extremes [1, infinity) - internal hits 26/52 nti 15 constraint (none) extremes [1, infinity) + internal hits 26/52 nti 16 constraint (none) extremes [1, infinity) - internal nti 16 constraint (none) extremes [1, infinity) + internal nti 17 constraint (none) extremes [1, infinity) - internal hits 165/18654 nti 17 constraint (none) extremes [1, infinity) + internal hits 165/18654 nti 18 constraint (none) extremes [1, infinity) - hits 36/1576 nti 18 constraint DS = {23} extremes [2, infinity) + hits 36/1576 nti 19 constraint DS = {23} extremes [2, infinity) English: (hits 36/36) (matched: 'the property initial appearance') constraint DS = {23} extremes [3, infinity) constraint DS = {23} extremes [2, infinity) - internal hits 788/21494 nti 19 constraint (none) extremes [1, infinity) + internal hits 788/21494 nti 20 constraint (none) extremes [1, infinity) - hits 651/21926 nti 20 constraint (none) extremes [1, infinity) + hits 651/21926 nti 21 constraint (none) extremes [1, infinity) English: (hits 651/10963) (matched: 'unmarked for listing') constraint (none) extremes [1, infinity) @@ -7817,36 +7824,36 @@ internal hits 2217/19100 nti r3 constraint CS = {r3} extremes [1, infinity) - hits 3628/90356 nti 21 constraint (none) extremes [1, infinity) + hits 3628/90356 nti 22 constraint (none) extremes [1, infinity) English: (hits 2591/45178) (matched: 'value of kind k') constraint (none) extremes [1, infinity) (hits 1037/2020) (matched: 'the alfred cralle pool hall') constraint CW = {r2, r4} extremes [1, infinity) - hits 8/864 nti 22 constraint (none) extremes [1, infinity) + hits 8/864 nti 23 constraint (none) extremes [1, infinity) English: (hits 8/432) (matched: 'person') constraint (none) extremes [1, infinity) - hits 131/7856 nti 23 constraint CW = {r2, r4} extremes [1, infinity) + hits 131/7856 nti 24 constraint CW = {r2, r4} extremes [1, infinity) English: (hits 131/330) (matched: 'alfred cralle pool hall') constraint CW = {r2, r4} extremes [1, infinity) - hits 768/5176 nti 24 constraint (none) extremes [1, infinity) + hits 768/5176 nti 25 constraint (none) extremes [1, infinity) English: (hits 768/2588) (matched: 'marked for listing other') constraint (none) extremes [1, infinity) - hits 1640/38904 nti 25 constraint (none) extremes [1, infinity) + hits 1640/38904 nti 26 constraint (none) extremes [1, infinity) English: (hits 1384/19452) (matched long text) constraint (none) extremes [1, infinity) (hits 256/4835) (matched long text) constraint (none) extremes [3, infinity) - hits 256/2102 nti 26 constraint (none) extremes [1, infinity) + hits 256/2102 nti 27 constraint (none) extremes [1, infinity) English: (hits 256/1051) (matched: 'thing ( called the item being printed )') constraint (none) extremes [1, infinity) @@ -7858,7 +7865,7 @@ (hits 1534/20397) (matched: 'the alfred cralle pool hall') constraint (none) extremes [1, infinity) - hits 1640/41018 nti 27 constraint (none) extremes [1, infinity) + hits 1640/41018 nti 28 constraint (none) extremes [1, infinity) English: (hits 51/10637) (matched: 'at least two stamped envelopes') constraint (none) extremes [2, infinity) @@ -7877,30 +7884,30 @@ (hits 746/19615) (matched: 'marked for listing other people') constraint (none) extremes [1, infinity) - hits 1406/40980 nti 28 constraint (none) extremes [1, infinity) + hits 1406/40980 nti 29 constraint (none) extremes [1, infinity) English: (hits 1022/20490) (matched: 'nancy johnson memorial square') constraint (none) extremes [1, infinity) (hits 384/10212) (matched: 'marked for listing other people') constraint (none) extremes [2, infinity) - hits 2/300 nti 29 constraint (none) extremes [1, infinity) + hits 2/300 nti 30 constraint (none) extremes [1, infinity) English: (hits 2/150) (matched: 'person') constraint (none) extremes [1, infinity) (hits 0/111) constraint (none) extremes [2, infinity) - hits 54/7222 nti 30 constraint (none) extremes [1, infinity) + hits 54/7222 nti 6 constraint (none) extremes [1, infinity) English: (hits 54/127) (matched: 'alfred cralle pool hall') constraint CW = {r2, r4} extremes [1, infinity) (hits 0/1434) constraint (none) extremes [2, infinity) - internal hits 4747/9708 nti 6 constraint (none) extremes [0, 0] + internal hits 4747/9708 nti 7 constraint (none) extremes [0, 0] - hits 102/544 nti 7 constraint (none) extremes [1, infinity) + hits 102/544 nti 8 constraint (none) extremes [1, infinity) English: (hits 102/272) (matched: 'the dark') constraint (none) extremes [1, infinity) @@ -7914,7 +7921,7 @@ (hits 102/272) (matched: 'the dark') constraint (none) extremes [1, infinity) - hits 102/544 nti 8 constraint (none) extremes [1, infinity) + hits 102/544 nti 9 constraint (none) extremes [1, infinity) English: (hits 8/153) (matched: 'every dvd') constraint (none) extremes [2, infinity) @@ -7933,7 +7940,7 @@ (hits 94/264) (matched: 'the dark') constraint (none) extremes [1, infinity) - hits 102/566 nti 9 constraint (none) extremes [1, infinity) + hits 102/566 nti 10 constraint (none) extremes [1, infinity) English: (hits 101/283) (matched: 'cold comfort') constraint (none) extremes [1, infinity) @@ -7942,18 +7949,18 @@ (hits 1/182) (matched: 'the dark') constraint (none) extremes [1, infinity) - hits 106/212 nti 10 constraint (none) extremes [1, infinity) + hits 106/212 nti 11 constraint (none) extremes [1, infinity) English:
      {...} (hits 71/83) (matched: 'the item being printed') constraint (none) extremes [2, infinity) {...} (hits 35/35) (matched: 'random bystander') constraint (none) extremes [1, infinity) - internal hits 79/21580 nti 11 constraint (none) extremes [1, infinity) + internal hits 79/21580 nti 12 constraint (none) extremes [1, infinity) - internal hits 288/62906 nti 12 constraint (none) extremes [1, infinity) + internal hits 288/62906 nti 13 constraint (none) extremes [1, infinity) - hits 1950/4834 nti 13 constraint (none) extremes [1, infinity) + hits 1950/4834 nti 14 constraint (none) extremes [1, infinity) English:
      (hits 118/398) (matched long text) constraint (none) extremes [2, infinity) @@ -7984,14 +7991,14 @@ (hits 0/26) constraint CW = {r2, r4} extremes [1, infinity) - hits 1253/3020 nti 14 constraint (none) extremes [1, infinity) + hits 1253/3020 nti 15 constraint (none) extremes [1, infinity) English:
      (hits 162/790) (matched: 'an ice cream cone') constraint (none) extremes [2, infinity) (hits 1091/1348) (matched long text) constraint (none) extremes [1, infinity) - hits 1253/3020 nti 15 constraint (none) extremes [1, infinity) + hits 1253/3020 nti 16 constraint (none) extremes [1, infinity) English: (hits 74/1510) (matched: 'unmarked for listing') constraint (none) extremes [1, infinity) @@ -8007,7 +8014,7 @@ (hits 61/62) (matched: 'action based rule producing nothing') constraint (none) extremes [1, infinity) - hits 61/124 nti 16 constraint (none) extremes [1, infinity) + hits 61/124 nti 17 constraint (none) extremes [1, infinity) English: (hits 61/62) (matched: 'action based rule producing nothing') constraint (none) extremes [1, infinity) @@ -8020,13 +8027,13 @@ (hits 0/1) constraint (none) extremes [1, infinity) - internal hits 8/18486 nti 17 constraint (none) extremes [0, 0] + internal hits 8/18486 nti 18 constraint (none) extremes [0, 0] - internal hits 2/9386 nti 18 constraint (none) extremes [0, 0] + internal hits 2/9386 nti 19 constraint (none) extremes [0, 0] - internal hits 9/18594 nti 19 constraint (none) extremes [0, 0] + internal hits 9/18594 nti 20 constraint (none) extremes [0, 0] - internal hits 0/18594 nti 20 constraint (none) extremes [0, 0] + internal hits 0/18594 nti 21 constraint (none) extremes [0, 0] hits 8480/18882 nti 30 constraint (none) extremes [1, infinity) English: @@ -8080,7 +8087,7 @@ (hits 0/9239) constraint (none) extremes [1, infinity) - hits 5834/24160 nti 21 constraint (none) extremes [1, infinity) + hits 5834/24160 nti 22 constraint (none) extremes [1, infinity) English: (hits 1641/6153) (matched: 'the room back the other way') constraint (none) extremes [2, infinity) @@ -8100,25 +8107,25 @@ constraint (none) extremes [1, infinity) - hits 169/1114 nti 22 constraint (none) extremes [1, infinity) + hits 169/1114 nti 23 constraint (none) extremes [1, infinity) English: (hits 169/557) (matched: 'the person asked') constraint (none) extremes [1, infinity) - internal hits 1146/27410 nti 23 constraint (none) extremes [1, infinity) + internal hits 1146/27410 nti 24 constraint (none) extremes [1, infinity) - internal hits 895/18728 nti 24 constraint (none) extremes [1, infinity) + internal hits 895/18728 nti 25 constraint (none) extremes [1, infinity) - internal hits 2308/19752 nti 25 constraint (none) extremes [1, infinity) + internal hits 2308/19752 nti 26 constraint (none) extremes [1, infinity) hits 100/18450 nti 11 constraint DS = {11} extremes [3, infinity) English: of {...} (hits 100/1499) (matched: 'walk style of the character entry') constraint DS = {11} extremes [3, infinity) - internal hits 503/18450 nti 26 constraint (none) extremes [1, infinity) + internal hits 503/18450 nti 27 constraint (none) extremes [1, infinity) - internal hits 483/18156 nti 27 constraint (none) extremes [1, infinity) + internal hits 483/18156 nti 28 constraint (none) extremes [1, infinity) hits 139/7662 nti 29 constraint DS = {29} extremes [2, infinity) English: @@ -8133,19 +8140,19 @@ of in/from (hits 2/682) (matched long text) constraint DS = {29} extremes [5, infinity) - hits 1080/2250 nti 28 constraint (none) extremes [3, infinity) + hits 1080/2250 nti 29 constraint (none) extremes [3, infinity) English: (hits 0/1099) constraint DS = {25} extremes [3, infinity) (hits 1080/1114) (matched long text) constraint (none) extremes [3, infinity) - hits 11/22 nti 29 constraint FS = {7} extremes [2, infinity) + hits 11/22 nti 30 constraint FS = {7} extremes [2, infinity) English: (hits 11/11) (matched long text) constraint FS = {7} extremes [2, infinity) - hits 2161/6686 nti 30 constraint (none) extremes [2, infinity) + hits 2161/6686 nti 6 constraint (none) extremes [2, infinity) English: (hits 0/906) constraint DS = {7} & FS = {9} extremes [4, infinity) @@ -8159,7 +8166,7 @@ to constraint DS = {7} extremes [3, infinity) - hits 256/10010 nti 6 constraint (none) extremes [3, infinity) + hits 256/10010 nti 7 constraint (none) extremes [3, infinity) English: (hits 169/4526) (matched long text) constraint DS = {13} extremes [3, infinity) @@ -8173,7 +8180,7 @@ not (hits 1/6137) (matched: 'not carried by the person asked') constraint DS = {6, 13} extremes [3, infinity) - hits 175/24056 nti 7 constraint DS = {11} extremes [3, infinity) + hits 175/24056 nti 8 constraint DS = {11} extremes [3, infinity) English: (hits 0/2547) constraint DS = {7, 11} extremes [5, infinity) @@ -8182,11 +8189,11 @@ (hits 143/6046) (matched: 'which provide the property initial appearance') constraint DS = {11} extremes [3, infinity) - internal hits 787/18392 nti 8 constraint (none) extremes [1, infinity) + internal hits 787/18392 nti 9 constraint (none) extremes [1, infinity) - internal hits 1205/34696 nti 9 constraint (none) extremes [0, 0] + internal hits 1205/34696 nti 10 constraint (none) extremes [0, 0] - hits 4670/9688 nti 10 constraint (none) extremes [1, infinity) + hits 4670/9688 nti 11 constraint (none) extremes [1, infinity) English: (hits 26/4844) (matched: 'the person asked') constraint (none) extremes [1, infinity) @@ -8195,7 +8202,7 @@ ^ (hits 4618/4792) (matched long text) constraint (none) extremes [1, infinity) - hits 797/2188 nti 11 constraint (none) extremes [1, infinity) + hits 797/2188 nti 12 constraint (none) extremes [1, infinity) English: (hits 143/1094) (matched: 'the person asked') constraint (none) extremes [1, infinity) @@ -8215,7 +8222,7 @@ (hits 2/248) (matched: 'switched off') constraint (none) extremes [1, infinity) - hits 1075/2642 nti 12 constraint (none) extremes [0, infinity) + hits 1075/2642 nti 13 constraint (none) extremes [0, infinity) English: (hits 1073/1321) (matched long text) constraint (none) extremes [0, infinity) @@ -8239,7 +8246,7 @@ (hits 1203/1463) (matched long text) constraint (none) extremes [0, infinity) - internal hits 0/2926 nti 13 constraint (none) extremes [1, infinity) + internal hits 0/2926 nti 14 constraint (none) extremes [1, infinity) hits 1203/2926 nti 20 constraint (none) extremes [0, infinity) English: @@ -8285,9 +8292,9 @@ is/are {...} (hits 22/1197) (matched long text) constraint DS = {13, 25} extremes [3, infinity) - internal hits 95/2924 nti 14 constraint (none) extremes [1, infinity) + internal hits 95/2924 nti 15 constraint (none) extremes [1, infinity) - internal hits 1/2926 nti 15 constraint (none) extremes [1, infinity) + internal hits 1/2926 nti 16 constraint (none) extremes [1, infinity) hits 1380/2760 nti 22 constraint (none) extremes [1, infinity) English: @@ -8322,11 +8329,11 @@ (hits 0/2346) constraint (none) extremes [1, infinity) - internal hits 0/4692 nti 16 constraint (none) extremes [1, infinity) + internal hits 0/4692 nti 17 constraint (none) extremes [1, infinity) - internal hits 1380/2760 nti 17 constraint (none) extremes [1, infinity) + internal hits 1380/2760 nti 18 constraint (none) extremes [1, infinity) - internal hits 2392/4784 nti 18 constraint (none) extremes [1, infinity) + internal hits 2392/4784 nti 19 constraint (none) extremes [1, infinity) nti 25 constraint CS = {25} extremes [1, 1] English: @@ -8340,7 +8347,7 @@ {...} constraint (none) extremes [1, infinity) - nti 19 constraint (none) extremes [1, infinity) + nti 20 constraint (none) extremes [1, infinity) English: constraint DS = {28} extremes [3, infinity) @@ -8402,7 +8409,7 @@ {...} constraint (none) extremes [1, infinity) - nti 20 constraint (none) extremes [1, infinity) + nti 21 constraint (none) extremes [1, infinity) English: {...} ^option constraint (none) extremes [2, infinity) @@ -8420,20 +8427,20 @@ internal hits 1168/4924 nti r4 constraint CW = {r2, r4} extremes [1, infinity) - internal hits 4/252 nti 21 constraint (none) extremes [1, infinity) + internal hits 4/252 nti 22 constraint (none) extremes [1, infinity) - nti 22 constraint (none) extremes [0, 0] + nti 23 constraint (none) extremes [0, 0] English: constraint (none) extremes [0, 0] constraint (none) extremes [0, 0] - internal hits 0/172 nti 23 constraint (none) extremes [1, infinity) + internal hits 0/172 nti 24 constraint (none) extremes [1, infinity) - internal hits 4/252 nti 24 constraint (none) extremes [1, infinity) + internal hits 4/252 nti 25 constraint (none) extremes [1, infinity) - nti 25 constraint (none) extremes [1, infinity) + nti 26 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -8467,27 +8474,27 @@ property {...} (hits 36/36) (matched: 'property initial appearance') constraint DS = {23} extremes [2, infinity) - internal hits 69/430 nti 26 constraint (none) extremes [1, infinity) + internal hits 69/430 nti 27 constraint (none) extremes [1, infinity) - internal hits 0/44 nti 27 constraint (none) extremes [1, infinity) + internal hits 0/44 nti 28 constraint (none) extremes [1, infinity) - internal hits 127/2212 nti 28 constraint (none) extremes [1, infinity) + internal hits 127/2212 nti 29 constraint (none) extremes [1, infinity) - internal hits 104/388 nti 29 constraint (none) extremes [1, infinity) + internal hits 104/388 nti 30 constraint (none) extremes [1, infinity) hits 0/292 nti 10 constraint DS = {10} extremes [1, infinity) English: {***} of {***} (hits 0/8) constraint DS = {10} extremes [1, infinity) - internal nti 30 constraint (none) extremes [1, infinity) + internal nti 6 constraint (none) extremes [1, infinity) nti 11 constraint DS = {11} extremes [4, infinity) English: the same {...} as constraint DS = {11} extremes [4, infinity) - hits 22/44 nti 6 constraint (none) extremes [1, infinity) + hits 22/44 nti 7 constraint (none) extremes [1, infinity) English: (hits 0/22) constraint (none) extremes [1, infinity) @@ -8542,9 +8549,9 @@ female (hits 1/1) (matched: 'female') constraint CS = {15} extremes [1, 1] - internal hits 123/390 nti 7 constraint (none) extremes [1, infinity) + internal hits 123/390 nti 8 constraint (none) extremes [1, infinity) - hits 195/390 nti 8 constraint (none) extremes [1, infinity) + hits 195/390 nti 9 constraint (none) extremes [1, infinity) English: (hits 13/73) (matched: 'the current working sack') constraint (none) extremes [2, infinity) @@ -8573,7 +8580,7 @@ {...} constraint (none) extremes [1, infinity) - internal hits 1567/3134 nti 9 constraint (none) extremes [1, infinity) + internal hits 1567/3134 nti 10 constraint (none) extremes [1, infinity) hits 30/564 nti 18 constraint (none) extremes [1, 1] English: @@ -8887,14 +8894,14 @@ entire game (hits 1/1) (matched: 'entire game') constraint CS = {26} extremes [2, 2] - hits 4/8 nti 10 constraint (none) extremes [1, infinity) + hits 4/8 nti 11 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'the entire game') constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - nti 11 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -8918,23 +8925,23 @@ (hits 0/2) constraint (none) extremes [1, infinity) - hits 4/8 nti 12 constraint (none) extremes [1, infinity) + hits 4/8 nti 13 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'the entire game') constraint (none) extremes [2, infinity) constraint (none) extremes [1, infinity) - hits 4/8 nti 13 constraint (none) extremes [1, infinity) + hits 4/8 nti 14 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'entire game') constraint (none) extremes [1, infinity) - internal nti 14 constraint (none) extremes [1, infinity) + internal nti 15 constraint (none) extremes [1, infinity) - internal nti 15 constraint (none) extremes [1, infinity) + internal nti 16 constraint (none) extremes [1, infinity) - nti 16 constraint (none) extremes [1, infinity) + nti 17 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -8951,7 +8958,7 @@ rankings constraint CS = {29} extremes [1, 1] - nti 17 constraint (none) extremes [1, infinity) + nti 18 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -8997,7 +9004,7 @@ {...} of constraint DS = {7} extremes [3, infinity) - nti 18 constraint (none) extremes [1, infinity) + nti 19 constraint (none) extremes [1, infinity) English: constraint (none) extremes [2, infinity) @@ -9015,9 +9022,9 @@ constraint (none) extremes [1, infinity) - internal nti 19 constraint (none) extremes [1, infinity) + internal nti 20 constraint (none) extremes [1, infinity) - nti 20 constraint (none) extremes [1, 1] + nti 21 constraint (none) extremes [1, 1] English: constraint CS = {r0} extremes [1, 1] @@ -9037,7 +9044,7 @@ off constraint CS = {8} extremes [1, 1] - internal nti 21 constraint (none) extremes [1, 1] + internal nti 22 constraint (none) extremes [1, 1] nti 10 constraint DS = {10} extremes [2, infinity) English: @@ -9057,7 +9064,7 @@ waiting (hits 1/2) (matched: 'waiting') constraint CS = {11} extremes [1, 1] - hits 91/1036 nti 22 constraint DS = {12} extremes [1, infinity) + hits 91/1036 nti 23 constraint DS = {12} extremes [1, infinity) English: (hits 91/330) (matched long text) constraint DS = {12} extremes [2, infinity) @@ -9073,7 +9080,7 @@ action constraint CS = {12} extremes [1, 1] - hits 90/180 nti 23 constraint (none) extremes [0, infinity) + hits 90/180 nti 24 constraint (none) extremes [0, infinity) English: ^ (hits 90/90) (matched long text) constraint (none) extremes [0, infinity) @@ -9085,21 +9092,21 @@ {***} variable (hits 0/90) constraint DS = {13} extremes [1, infinity) - hits 90/180 nti 24 constraint (none) extremes [1, infinity) + hits 90/180 nti 25 constraint (none) extremes [1, infinity) English: (hits 0/90) constraint (none) extremes [1, infinity) {...} (hits 90/90) (matched: 'switching the story transcript on') constraint (none) extremes [1, infinity) - hits 90/180 nti 25 constraint (none) extremes [1, infinity) + hits 90/180 nti 26 constraint (none) extremes [1, infinity) English: (hits 90/90) (matched long text) constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 128/256 nti 26 constraint (none) extremes [1, infinity) + hits 128/256 nti 27 constraint (none) extremes [1, infinity) English: {...} (hits 19/128) (matched: 'applying to nothing or one thing and') constraint (none) extremes [1, infinity) @@ -9155,12 +9162,12 @@ {...} constraint (none) extremes [1, infinity) - hits 70/140 nti 27 constraint (none) extremes [1, infinity) + hits 70/140 nti 28 constraint (none) extremes [1, infinity) English: (hits 70/70) (matched: 'visible thing') constraint (none) extremes [1, infinity) - hits 70/140 nti 28 constraint (none) extremes [1, infinity) + hits 70/140 nti 29 constraint (none) extremes [1, infinity) English: (hits 12/12) (matched: 'visible thing') constraint DS = {14} extremes [2, infinity) @@ -9185,7 +9192,7 @@ (hits 7/7) (matched: 'abbreviated form allowed') constraint (none) extremes [1, infinity) - hits 13/26 nti 29 constraint (none) extremes [1, infinity) + hits 13/26 nti 30 constraint (none) extremes [1, infinity) English: (hits 0/13) constraint (none) extremes [1, infinity) @@ -9206,7 +9213,7 @@ report {...} constraint DS = {20} extremes [2, infinity) - internal hits 227/664 nti 30 constraint (none) extremes [1, infinity) + internal hits 227/664 nti 6 constraint (none) extremes [1, infinity) hits 378/10710 nti 21 constraint DS = {21} extremes [2, infinity) English: @@ -9244,7 +9251,7 @@ {...} constraint (none) extremes [1, infinity) - hits 596/1408 nti 6 constraint (none) extremes [1, infinity) + hits 596/1408 nti 7 constraint (none) extremes [1, infinity) English: (hits 0/129) constraint DS = {22} extremes [3, infinity) @@ -9258,7 +9265,7 @@ _,/or (hits 0/352) constraint DS = {22} extremes [2, infinity) - hits 596/1408 nti 7 constraint (none) extremes [1, infinity) + hits 596/1408 nti 8 constraint (none) extremes [1, infinity) English: (hits 0/704) constraint (none) extremes [1, infinity) @@ -9267,9 +9274,9 @@ (hits 596/704) (matched long text) constraint (none) extremes [1, infinity) - internal hits 0/1408 nti 8 constraint (none) extremes [1, infinity) + internal hits 0/1408 nti 9 constraint (none) extremes [1, infinity) - internal hits 596/1408 nti 9 constraint (none) extremes [1, infinity) + internal hits 596/1408 nti 10 constraint (none) extremes [1, infinity) hits 7/676 nti 26 constraint CS = {26} extremes [1, 1] English: @@ -9287,13 +9294,13 @@ {...} (hits 0/331) constraint (none) extremes [2, infinity) - internal hits 0/662 nti 10 constraint (none) extremes [1, infinity) + internal hits 0/662 nti 11 constraint (none) extremes [1, infinity) - internal hits 1197/31652 nti 11 constraint (none) extremes [0, 0] + internal hits 1197/31652 nti 12 constraint (none) extremes [0, 0] - internal hits 1268/2536 nti 12 constraint (none) extremes [0, 0] + internal hits 1268/2536 nti 13 constraint (none) extremes [0, 0] - hits 300/1268 nti 13 constraint (none) extremes [1, infinity) + hits 300/1268 nti 14 constraint (none) extremes [1, infinity) English: ^ (hits 0/634) constraint (none) extremes [1, infinity) @@ -9306,24 +9313,24 @@ (hits 233/567) (matched long text) constraint (none) extremes [1, infinity) - internal hits 3/20038 nti 14 constraint (none) extremes [1, infinity) + internal hits 3/20038 nti 15 constraint (none) extremes [1, infinity) - hits 27/2756 nti 15 constraint (none) extremes [1, infinity) + hits 27/2756 nti 16 constraint (none) extremes [1, infinity) English: (hits 27/1378) (matched long text) constraint (none) extremes [1, infinity) - hits 0/1778 nti 16 constraint DS = {18} extremes [2, infinity) + hits 0/1778 nti 17 constraint DS = {18} extremes [2, infinity) English: (hits 0/889) constraint DS = {18} extremes [2, infinity) - hits 0/1364 nti 17 constraint DS = {15} extremes [3, infinity) + hits 0/1364 nti 18 constraint DS = {15} extremes [3, infinity) English: (hits 0/682) constraint DS = {15} extremes [3, infinity) - hits 0/2004 nti 18 constraint DS = {16} extremes [4, infinity) + hits 0/2004 nti 19 constraint DS = {16} extremes [4, infinity) English: (hits 0/1002) constraint DS = {16} extremes [4, infinity) @@ -9421,11 +9428,11 @@ we have not (hits 0/1002) constraint DS = {16} extremes [4, infinity) - internal hits 94/13122 nti 19 constraint (none) extremes [1, infinity) + internal hits 94/13122 nti 20 constraint (none) extremes [1, infinity) - internal hits 585/24334 nti 20 constraint (none) extremes [1, infinity) + internal hits 585/24334 nti 21 constraint (none) extremes [1, infinity) - internal nti 21 constraint (none) extremes [1, infinity) + internal nti 22 constraint (none) extremes [1, infinity) hits 0/1392 nti 29 constraint CS = {29} extremes [2, 2] English: @@ -9443,9 +9450,9 @@ {...} when/while {...} (hits 0/21) constraint DS = {30} extremes [3, infinity) - internal hits 19/38 nti 22 constraint (none) extremes [1, infinity) + internal hits 19/38 nti 23 constraint (none) extremes [1, infinity) - internal hits 585/1408 nti 23 constraint (none) extremes [1, infinity) + internal hits 585/1408 nti 24 constraint (none) extremes [1, infinity) hits 201/408 nti 6 constraint (none) extremes [1, infinity) English: @@ -9500,7 +9507,7 @@ r5 constraint CS = {8} extremes [1, 1] - internal hits 0/4010 nti 24 constraint (none) extremes [1, infinity) + internal hits 0/4010 nti 25 constraint (none) extremes [1, infinity) hits 1/180 nti 11 constraint CS = {11} extremes [1, 1] English: @@ -9542,7 +9549,7 @@ (hits 167/167) (matched long text) constraint (none) extremes [1, infinity) - hits 383/766 nti 25 constraint (none) extremes [1, infinity) + hits 383/766 nti 26 constraint (none) extremes [1, infinity) English: {...} (hits 88/383) (matched long text) constraint (none) extremes [1, infinity) @@ -9558,12 +9565,12 @@ _,/and/or (hits 176/176) (matched long text) constraint DS = {16} extremes [2, infinity) - hits 383/766 nti 26 constraint (none) extremes [1, infinity) + hits 383/766 nti 27 constraint (none) extremes [1, infinity) English: {...} (hits 383/383) (matched: '"n"') constraint (none) extremes [1, infinity) - hits 70/554 nti 27 constraint (none) extremes [1, infinity) + hits 70/554 nti 28 constraint (none) extremes [1, infinity) English: {...} (hits 69/277) (matched long text) constraint (none) extremes [1, infinity) @@ -9593,7 +9600,7 @@ (hits 166/166) (matched: 'giving it to ( with nouns reversed )') constraint (none) extremes [1, infinity) - hits 167/334 nti 28 constraint (none) extremes [1, infinity) + hits 167/334 nti 29 constraint (none) extremes [1, infinity) English: {...} (hits 0/167) constraint (none) extremes [1, infinity) @@ -9609,7 +9616,7 @@ _,/and/or (hits 0/77) constraint DS = {19} extremes [2, infinity) - hits 167/334 nti 29 constraint (none) extremes [1, infinity) + hits 167/334 nti 30 constraint (none) extremes [1, infinity) English: (hits 167/167) (matched: 'giving it to ( with nouns reversed )') constraint (none) extremes [1, infinity) @@ -9635,7 +9642,7 @@ (hits 159/159) (matched: 'requesting the story file version') constraint (none) extremes [1, infinity) - hits 165/330 nti 30 constraint (none) extremes [1, infinity) + hits 165/330 nti 6 constraint (none) extremes [1, infinity) English: (hits 150/165) (matched: 'requesting the story file version') constraint (none) extremes [1, infinity) @@ -9673,7 +9680,7 @@ {...} constraint (none) extremes [1, infinity) - hits 1/2 nti 6 constraint (none) extremes [1, infinity) + hits 1/2 nti 7 constraint (none) extremes [1, infinity) English: (hits 1/1) (matched: 'an ice cream cone') constraint (none) extremes [1, infinity) @@ -9682,7 +9689,7 @@ {...} constraint (none) extremes [1, infinity) - hits 8/16 nti 7 constraint (none) extremes [1, infinity) + hits 8/16 nti 8 constraint (none) extremes [1, infinity) English: (hits 8/8) (matched: 'the player is not yourself') constraint (none) extremes [1, infinity) @@ -9766,9 +9773,9 @@ things held constraint CS = {25} extremes [2, 2] - internal hits 3/326 nti 8 constraint (none) extremes [1, infinity) + internal hits 3/326 nti 9 constraint (none) extremes [1, infinity) - hits 1/4 nti 9 constraint DS = {27} extremes [2, infinity) + hits 1/4 nti 10 constraint DS = {27} extremes [2, infinity) English: (hits 1/1) (matched: 'the file of cover art ( The cover art. )') constraint DS = {27} extremes [3, infinity) @@ -9806,7 +9813,7 @@ of cover art constraint CS = {6} extremes [3, 3] - hits 0/2 nti 10 constraint DS = {7} extremes [2, infinity) + hits 0/2 nti 11 constraint DS = {7} extremes [2, infinity) English: constraint DS = {7} extremes [3, infinity) @@ -9830,7 +9837,7 @@ constraint (none) extremes [1, infinity) - nti 11 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] @@ -9864,14 +9871,14 @@ {...} constraint (none) extremes [1, infinity) - nti 12 constraint (none) extremes [1, infinity) + nti 13 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] {...} constraint (none) extremes [1, infinity) - nti 13 constraint DS = {13} extremes [2, infinity) + nti 14 constraint DS = {13} extremes [2, infinity) English: constraint DS = {13} extremes [3, infinity) @@ -9883,12 +9890,12 @@ called constraint DS = {13} extremes [2, infinity) - hits 0/688 nti 14 constraint (none) extremes [2, infinity) + hits 0/688 nti 15 constraint (none) extremes [2, infinity) English: (hits 0/330) constraint (none) extremes [2, infinity) - nti 15 constraint (none) extremes [0, 0] + nti 16 constraint (none) extremes [0, 0] - nti 16 constraint (none) extremes [0, 0] + nti 17 constraint (none) extremes [0, 0] diff --git a/docs/inform7n.html b/docs/inform7n.html index 1583eed24..e2aae1681 100644 --- a/docs/inform7n.html +++ b/docs/inform7n.html @@ -87,8 +87,8 @@ up individual tasks; it provides general mechanisms for issuing problem messages and also a "plugin" architecture enabling language features to be added. Most Inform users think of rooms, map connections and so on as being built in to the language itself, but internally we take the view that there is a purist -Basic Inform language dealing only in data, and then a set of plugins to add -domain-specific gadgets to that language. +Basic Inform language dealing only in data, and then a set of optional compiler +features to add domain-specific gadgets to that language.

      • ● Contents page of web: core. @@ -155,8 +155,8 @@ for the moment.2
        • 2 If we ever do go down the road of a full-on linker, issues like this would be part of what is nowadays called "ABI stability".

        -

        §8. The if module consists of an extensive suite of plugins (see core -above) to add interactive fiction features to the Basic Inform language. +

        §8. The if module consists of an extensive suite of features (see core +above) to add interactive fiction support to the Basic Inform language. Support for scenes, a spatial map, a protagonist character, and so on are all to be found here.

        @@ -164,7 +164,7 @@ all to be found here. -

        §9. The multimedia module consists of a few plugins (see core above) +

        §9. The multimedia module consists of a few features (see core above) to add images, sound files and external file-handling to the Basic Inform language.

        diff --git a/docs/kinds-module/2-fk.html b/docs/kinds-module/2-fk.html index bbb7455ef..a3eb6c7f2 100644 --- a/docs/kinds-module/2-fk.html +++ b/docs/kinds-module/2-fk.html @@ -174,8 +174,8 @@ the letter K: kind_constructor *CON_KIND_VARIABLE = NULL;

        §8. So much for the exotica: back onto familiar ground for anyone who uses -Inform. Some standard kinds follow. Some belong only to plugins; if the -plugin in question is inactive, they will remain NULL and do nothing. +Inform. Some standard kinds follow. Some belong only to features; if the +feature in question is inactive, they will remain NULL and do nothing.

        diff --git a/docs/kinds-module/4-kc.html b/docs/kinds-module/4-kc.html
        index b608ace9c..c91520e91 100644
        --- a/docs/kinds-module/4-kc.html
        +++ b/docs/kinds-module/4-kc.html
        @@ -142,7 +142,7 @@ function togglePopup(material_id) {
             if (tcc == compatible_with_KCC) {
                 #ifdef CORE_MODULE
                 if ((Str::eq(stc.constructor_argument, I"SNIPPET_TY")) &&
        -            (PluginManager::active(parsing_plugin) == FALSE)) return;
        +            (FEATURE_INACTIVE(parsing))) return;
                 #endif
                 kind_constructor_casting_rule *dtcr = CREATE(kind_constructor_casting_rule);
                 dtcr->next_casting_rule = con->first_casting_rule;
        diff --git a/docs/kinds-module/4-st.html b/docs/kinds-module/4-st.html
        index dcfb576ff..7c742691e 100644
        --- a/docs/kinds-module/4-st.html
        +++ b/docs/kinds-module/4-st.html
        @@ -174,7 +174,7 @@ protocol is applied to all of the base kinds conforming to that protocol.
                 return;
             }
             #ifdef CORE_MODULE
        -    if ((PluginManager::active(parsing_plugin) == FALSE) &&
        +    if ((FEATURE_INACTIVE(parsing)) &&
                 (Str::eq(ttd->template_name, I"*UNDERSTOOD-VARIABLE")))
                 return;
             #endif
        diff --git a/docs/knowledge-module/3-ep.html b/docs/knowledge-module/3-ep.html
        index 40a10bece..7bca8c33c 100644
        --- a/docs/knowledge-module/3-ep.html
        +++ b/docs/knowledge-module/3-ep.html
        @@ -130,7 +130,7 @@ a new one if necessary, and give the subject }
         

        §4. Requesting new nameless properties. These are properties needed for implementation reasons by runtime, or by -plugins in if, but which have no existence at the Inform 7 source text level — +features in if, but which have no existence at the Inform 7 source text level — and hence have no names. An author cannot refer to them, knows nothing of them.

        diff --git a/docs/knowledge-module/3-prp.html b/docs/knowledge-module/3-prp.html index 2e309be54..6e983212d 100644 --- a/docs/knowledge-module/3-prp.html +++ b/docs/knowledge-module/3-prp.html @@ -262,7 +262,7 @@ something. ValueProperties::make_coincide_with_kind(prn, <<rp>>);
        • This code is used in §3.
        -

        §3.5. A few properties have special significance to core Inform, though plugins +

        §3.5. A few properties have special significance to core Inform, though features are interested in many others:

        diff --git a/docs/knowledge-module/3-vp.html b/docs/knowledge-module/3-vp.html index 1c7498f05..0e8e6b44b 100644 --- a/docs/knowledge-module/3-vp.html +++ b/docs/knowledge-module/3-vp.html @@ -145,7 +145,7 @@ nameless in the source text, unrecorded in the Index, and generally invisible to the end user.

        -

        Core Inform creates no such properties, but many of the plugins do. +

        Core Inform creates no such properties, but many of the features do.

        The function comes in two forms: one where we already have an iname we want diff --git a/docs/knowledge-module/4-is.html b/docs/knowledge-module/4-is.html index 62b6aca93..7a32310b0 100644 --- a/docs/knowledge-module/4-is.html +++ b/docs/knowledge-module/4-is.html @@ -78,7 +78,7 @@ MathJax = {

    A unified way to refer to the things propositions talk about.

    -
    +

    §1. Families. inference_subject is a type which can represent anything in the model which a proposition can discuss: in particular, kinds, relations, variables @@ -199,7 +199,7 @@ one and only subject with no broader subject: struct inference_subject_family *infs_family; struct general_pointer represents; family-specific data - void *additional_data_for_plugins[MAX_PLUGINS]; and managed by those plugins + void *additional_data_for_features[MAX_COMPILER_FEATURES]; and managed by those features struct linked_list *inf_list; contingently true: each inference drawn about this struct linked_list *imp_list; necessarily true: each implication applying to this @@ -248,7 +248,7 @@ kind once the kind itself is created.) infs->infs_name_in_log = log_name; infs->alias_variable = NULL; Assertions::Assemblies::initialise_assemblies_data(&(infs->assemblies)); - for (int i=0; i<MAX_PLUGINS; i++) infs->additional_data_for_plugins[i] = NULL; + for (int i=0; i<MAX_COMPILER_FEATURES; i++) infs->additional_data_for_features[i] = NULL; PluginCalls::new_subject_notify(infs); } @@ -627,29 +627,25 @@ for an individual subject. } } -

    §28. Plugin data. See Chapter 3: Plugins (in core), but to recap, plugins are inessential components -of Inform which might or might not be in use for any given compilation run. -

    - -

    If a plugin is in use, it may need to attach data of its own to a subject, -and the following macro does that. name should be the name of the plugin, +

    §28. Feature data. If a feature is in use, it may need to attach data of its own to a subject, +and the following macro does that. name should be the name of the feature, say spatial; creator a function to create and initialise the data structure, returning a pointer to it.

    -
    define ATTACH_PLUGIN_DATA_TO_SUBJECT(name, S, val)
    -    (S)->additional_data_for_plugins[name##_plugin->allocation_id] = (void *) (val);
    +
    define ATTACH_FEATURE_DATA_TO_SUBJECT(name, S, val)
    +    (S)->additional_data_for_features[name##_feature->allocation_id] = (void *) (val);
     

    §29. Then, to access that same data, the following — though in practice each plugin will define further macros to make more abbreviated forms. Many of -the plugins from the if module are concerned only with instances — rooms +the features from the if module are concerned only with instances — rooms and doors, say — so DATA_ON_INSTANCE_PCALL pays its way.

    -
    define PLUGIN_DATA_ON_SUBJECT(name, S)
    -    ((name##_data *) (S)->additional_data_for_plugins[name##_plugin->allocation_id])
    -define PLUGIN_DATA_ON_INSTANCE(name, I)
    -    PLUGIN_DATA_ON_SUBJECT(name, Instances::as_subject(I))
    +
    define FEATURE_DATA_ON_SUBJECT(name, S)
    +    ((name##_data *) (S)->additional_data_for_features[name##_feature->allocation_id])
    +define FEATURE_DATA_ON_INSTANCE(name, I)
    +    FEATURE_DATA_ON_SUBJECT(name, Instances::as_subject(I))