diff --git a/docs/core-module/1-cp.html b/docs/core-module/1-cp.html
index 6dfb22814..9c3e6b473 100644
--- a/docs/core-module/1-cp.html
+++ b/docs/core-module/1-cp.html
@@ -261,7 +261,7 @@ We begin with core itself.
enuminternal_test_case_CLASSenumkind_interaction_CLASSenumlabel_namespace_CLASS
-enumlist_together_routine_CLASS
+enumgroup_together_function_CLASSenumnascent_array_CLASSenumplugin_CLASSenumproperty_of_value_storage_CLASS
@@ -283,7 +283,7 @@ We begin with core itself.
DECLARE_CLASS(internal_test_case)DECLARE_CLASS(kind_interaction)DECLARE_CLASS(label_namespace)
-DECLARE_CLASS(list_together_routine)
+DECLARE_CLASS(group_together_function)DECLARE_CLASS(nascent_array)DECLARE_CLASS(plugin)DECLARE_CLASS(property_of_value_storage)
diff --git a/docs/core-module/1-htc.html b/docs/core-module/1-htc.html
index f1b5f4de1..24a5493c0 100644
--- a/docs/core-module/1-htc.html
+++ b/docs/core-module/1-htc.html
@@ -446,7 +446,7 @@ other's bodies. But I think the term "coroutine" is reasonable just the same.
repeat = FALSE; iterations++;if (PhraseRequests::compilation_coroutine() > 0) repeat = TRUE;
-if (ListTogether::compilation_coroutine() > 0) repeat = TRUE;
+if (GroupTogether::compilation_coroutine() > 0) repeat = TRUE;if (LoopingOverScope::compilation_coroutine() > 0) repeat = TRUE;if (Responses::compilation_coroutine() > 0) repeat = TRUE;if (TextSubstitutions::compilation_coroutine() > 0) repeat = TRUE;
diff --git a/docs/imperative-module/5-cii.html b/docs/imperative-module/5-cii.html
index 1f32769da..a91166bd5 100644
--- a/docs/imperative-module/5-cii.html
+++ b/docs/imperative-module/5-cii.html
@@ -1807,10 +1807,10 @@ the "group... together" phrases.
if (ist->inline_subcommand == unarticled_ISINSC) {
-inter_name *iname = ListTogether::new(FALSE);
+inter_name *iname = GroupTogether::new(FALSE);EmitCode::val_iname(K_value, iname); } elseif (ist->inline_subcommand == articled_ISINSC) {
-inter_name *iname = ListTogether::new(TRUE);
+inter_name *iname = GroupTogether::new(TRUE);EmitCode::val_iname(K_value, iname); } elseStandardProblems::inline_problem(_p_(PM_InlineListTogether),idb, ist->owner->parent_schema->converted_from,
diff --git a/docs/runtime-module/2-ea.html b/docs/runtime-module/2-ea.html
index 0dd9cd080..779e160b3 100644
--- a/docs/runtime-module/2-ea.html
+++ b/docs/runtime-module/2-ea.html
@@ -92,7 +92,7 @@ enforced; it's fine to store arbitrary data with
-packaging_stateEmitArrays::begin(inter_name *name, kind *K) {
+packaging_stateEmitArrays::begin(inter_name *name, kind *K) {packaging_statesave = Packaging::enter_home_of(name);EmitArrays::begin_inner(name, K, FALSE);returnsave;
@@ -162,7 +162,7 @@ which would be a typesafe list in I7, so they can be absolutely any data,
EmitArrays::entry_inner(LITERAL_IVAL, N);}
-voidEmitArrays::iname_entry(inter_name *iname) {
+voidEmitArrays::iname_entry(inter_name *iname) {inter_symbol *alias;if (iname == NULL) alias = Emit::get_veneer_symbol(NOTHING_VSYMB);elsealias = InterNames::to_symbol(iname);
@@ -213,7 +213,7 @@ difference to compiled code.
-voidEmitArrays::end(packaging_statesave) {
+voidEmitArrays::end(packaging_statesave) {EmitArrays::end_inner();Packaging::exit(Emit::tree(), save);}
diff --git a/docs/runtime-module/2-ec.html b/docs/runtime-module/2-ec.html
index 402f60325..bc5631bea 100644
--- a/docs/runtime-module/2-ec.html
+++ b/docs/runtime-module/2-ec.html
@@ -108,10 +108,10 @@ instruction last emitted, not after it.
● EmitCode::up then returns us back to where we were.
enumLITERALS_HAPenumTEXT_LITERAL_HL
@@ -1320,9 +1299,10 @@ that the compiler can refer to it.
enumBOX_QUOTATIONS_HAPenumBOX_FLAG_HLenumBOX_QUOTATION_FN_HL
-enumTEXT_SUBSTITUTIONS_HAP
+enumGROUPS_TOGETHER_HAP
+enumGROUP_TOGETHER_FN_HL
-
§8.1.48. Establish enclosed matter8.1.48 =
+
§8.1.46. Establish enclosed matter8.1.46 =
@@ -1343,11 +1323,14 @@ that the compiler can refer to it.
H_C_U(BOX_FLAG_HL, I"quotation_flag")H_F_U(BOX_QUOTATION_FN_HL, I"quotation_fn")H_END
+H_BEGIN_AP(GROUPS_TOGETHER_HAP, I"group_together", I"_group_together")
+H_F_U(GROUP_TOGETHER_FN_HL, I"group_together_fn")
+H_ENDH_C_U(RTP_HL, I"rtp")H_END
§1. This section exists to support phrases such as:
-
-
-
-
To group (OS - description of objects) together giving articles: ...
-
-
-
For obscure reasons to do with the Inform 6 property list_together
-(see DM4 for details), each such usage needs to define a small I6
-routine. The code here manages that.
-
-
-
The only data stored is a single bit, saying whether to give articles or not:
+
§1. This section exists to support usages such as:
-typedefstructlist_together_routine {
-structinter_name *ltr_array_iname;
-structinter_name *ltr_routine_iname;
-intarticles_bit; if false, add NOARTICLE_BIT to the I6 listing style
-CLASS_DEFINITION
-} list_together_routine;
+groupcontainerstogether;
+groupkeystogether, givingarticles;
+groupcoinstogetheras"filthy lucre";
-
The structure list_together_routine is private to this section.
-
§2. Creation. When the inline compiler wants a new LTR, it calls the following, which
-prints the name of a routine to be compiled later.
+
At the Inter level, the different groupings of an object are stored in a text
+property called list_together.1 That's fine for the "filthy lucre" case,
+but for the other two usages we will have to make a text substitution, in order
+to have a valid value here. It's those substitutions which concern us here:
A critical point is that even if the GTF functions do the same thing as each
+other (and they likely do — there are only two possibilities), we need to
+compile a different function each time, so that BasicInformKit can
+distinguish them as values. Thus:
+
+ small block:
+ ----------------> CONSTANT_PACKED_TEXT_STORAGE
+ GTF function 1
+ ----------------> CONSTANT_PACKED_TEXT_STORAGE
+ GTF function 2
+
+
even though GTF functions 1 and 2 are identical; we need them to be at different
+addresses in memory.
+
+
+
1 For backwards compatibility with Inform 6, where this same feature was called
+"list together" and not "group together".
+ ↩
+
+typedefstructgroup_together_function {
+structinter_name *text_value_iname;
+structinter_name *printing_fn_iname;
+intarticles_bit; list with indefinite articles, or not
+CLASS_DEFINITION
+} group_together_function;
+
+
The structure group_together_function is private to this section.
§3. Compilation. And here's later. Note that there are only two possible routines made
-here, and we keep compiling them over and over, with different names. That
-looks wasteful, but we do it so that the routine addresses can be used as
-distinct values of the list_together property at run-time, because this
-is significant to the run-time list-printing code.
+
§3. And here we work through the queue of GTFs waiting to be compiled:
diff --git a/docs/runtime-module/4-ll.html b/docs/runtime-module/4-ll.html
index edb53585c..ccb74cd4a 100644
--- a/docs/runtime-module/4-ll.html
+++ b/docs/runtime-module/4-ll.html
@@ -303,7 +303,7 @@ not in creation order, as a simple
diff --git a/docs/runtime-module/4-rl.html b/docs/runtime-module/4-rl.html
index 57223e296..d5f6fb1b7 100644
--- a/docs/runtime-module/4-rl.html
+++ b/docs/runtime-module/4-rl.html
@@ -122,7 +122,7 @@ See Relations at Run Time and }
diff --git a/docs/runtime-module/4-rsp.html b/docs/runtime-module/4-rsp.html
index 95e04d691..fb11fdefd 100644
--- a/docs/runtime-module/4-rsp.html
+++ b/docs/runtime-module/4-rsp.html
@@ -552,7 +552,7 @@ it responds.
diff --git a/docs/runtime-module/4-sal.html b/docs/runtime-module/4-sal.html
index 0ea5f61bd..3efcf1e36 100644
--- a/docs/runtime-module/4-sal.html
+++ b/docs/runtime-module/4-sal.html
@@ -163,7 +163,7 @@ therefore always 0 for literal actions.
}
diff --git a/docs/runtime-module/4-tl.html b/docs/runtime-module/4-tl.html
index 98af16769..9e19c2135 100644
--- a/docs/runtime-module/4-tl.html
+++ b/docs/runtime-module/4-tl.html
@@ -112,7 +112,7 @@ it will always be a function.
-inter_name *TextLiterals::small_block(inter_name *content) {
+inter_name *TextLiterals::small_block(inter_name *content) {inter_name *small_block = Enclosures::new_small_block_for_constant();TextLiterals::compile_value_to(small_block, content);returnsmall_block;
@@ -192,7 +192,7 @@ much later in the process. See }
diff --git a/docs/runtime-module/4-ts.html b/docs/runtime-module/4-ts.html
index 0e3b9a29c..0d8a2bb7a 100644
--- a/docs/runtime-module/4-ts.html
+++ b/docs/runtime-module/4-ts.html
@@ -482,7 +482,7 @@ local names being used in substitutions, since this often confuses newcomers:
}
diff --git a/docs/runtime-module/5-act.html b/docs/runtime-module/5-act.html
index 278a37962..c985865ae 100644
--- a/docs/runtime-module/5-act.html
+++ b/docs/runtime-module/5-act.html
@@ -234,7 +234,7 @@ function togglePopup(material_id) {
}
diff --git a/docs/runtime-module/5-adj.html b/docs/runtime-module/5-adj.html
index 18a069895..aa2a880d9 100644
--- a/docs/runtime-module/5-adj.html
+++ b/docs/runtime-module/5-adj.html
@@ -544,7 +544,7 @@ objects, if there is one; otherwise the first-declared meaning.
}
diff --git a/docs/runtime-module/5-chr.html b/docs/runtime-module/5-chr.html
index 85c525a18..4c21dc488 100644
--- a/docs/runtime-module/5-chr.html
+++ b/docs/runtime-module/5-chr.html
@@ -923,7 +923,7 @@ times".
}
diff --git a/docs/runtime-module/5-epv.html b/docs/runtime-module/5-epv.html
index 5a24c9b0c..2ce5d4d89 100644
--- a/docs/runtime-module/5-epv.html
+++ b/docs/runtime-module/5-epv.html
@@ -385,7 +385,7 @@ the property-permission symbol accordingly:
}
diff --git a/docs/runtime-module/5-es.html b/docs/runtime-module/5-es.html
index e26c245ba..58a9eea55 100644
--- a/docs/runtime-module/5-es.html
+++ b/docs/runtime-module/5-es.html
@@ -89,7 +89,7 @@ they provide values different from each other and from all other functions.
}
diff --git a/docs/runtime-module/5-ic.html b/docs/runtime-module/5-ic.html
index 561636039..5e538eded 100644
--- a/docs/runtime-module/5-ic.html
+++ b/docs/runtime-module/5-ic.html
@@ -502,7 +502,7 @@ constants, and use the Link constants to progress; we stop at }
diff --git a/docs/runtime-module/5-ins.html b/docs/runtime-module/5-ins.html
index 54bf9e8bc..f2222d1d1 100644
--- a/docs/runtime-module/5-ins.html
+++ b/docs/runtime-module/5-ins.html
@@ -158,7 +158,7 @@ declarations) and finally return }
diff --git a/docs/runtime-module/5-lpart.html b/docs/runtime-module/5-lpart.html
index f70308106..e6ed5e3ce 100644
--- a/docs/runtime-module/5-lpart.html
+++ b/docs/runtime-module/5-lpart.html
@@ -1536,7 +1536,7 @@ the sorting measure.
}
diff --git a/docs/runtime-module/5-msr.html b/docs/runtime-module/5-msr.html
index 4c0c0209b..b1d70bdd0 100644
--- a/docs/runtime-module/5-msr.html
+++ b/docs/runtime-module/5-msr.html
@@ -127,7 +127,7 @@
The structure measurement_compilation_data is private to this section.
diff --git a/docs/runtime-module/5-ni.html b/docs/runtime-module/5-ni.html
index 8dfd9aa7d..8df2810e7 100644
--- a/docs/runtime-module/5-ni.html
+++ b/docs/runtime-module/5-ni.html
@@ -159,7 +159,7 @@ instance, the Standard Rules want the player-character object to be called
}
diff --git a/docs/runtime-module/5-prp.html b/docs/runtime-module/5-prp.html
index ff87fdd3b..eaedd0d64 100644
--- a/docs/runtime-module/5-prp.html
+++ b/docs/runtime-module/5-prp.html
@@ -591,7 +591,7 @@ answer now.
}
diff --git a/docs/runtime-module/5-rart.html b/docs/runtime-module/5-rart.html
index 9bdbc5a48..6e377c8ab 100644
--- a/docs/runtime-module/5-rart.html
+++ b/docs/runtime-module/5-rart.html
@@ -2158,7 +2158,7 @@ matches the specific necessary kind of object if there is one.
}
diff --git a/docs/runtime-module/5-rls.html b/docs/runtime-module/5-rls.html
index c390db0f0..58cd54a79 100644
--- a/docs/runtime-module/5-rls.html
+++ b/docs/runtime-module/5-rls.html
@@ -1356,7 +1356,7 @@ with the default outcome return (see above).
diff --git a/docs/runtime-module/5-rsfk.html b/docs/runtime-module/5-rsfk.html
index 8b5fc25bd..f63842615 100644
--- a/docs/runtime-module/5-rsfk.html
+++ b/docs/runtime-module/5-rsfk.html
@@ -2209,7 +2209,7 @@ and it seems best to reject the extra complexity needed.