I don’t think you’ll find anyplace it’s documented that you can’t make a list of topics. But in WI 22.1 you’ll find the list of base kinds, and the list of constructions (e.g., list of K), and the statement that variables can only be defined as one of those base kinds or something constructed from them, and topic isn’t a base kind. Similar information is in “Chart” in the Project Index.
But what about
the topic understood? That’s a variable! Yes, it’s a variable whose kind is snippet. I7 keeps you on your toes.
That’s not really another variant. Topics are represented internally as the exact same sort of thing that Inform 7 creates when you write Understand statements. You can write
Understand "paper" as the document. or
Understand "dusty/paper" as the document. The case without slashes just happens to have only one possible thing to match.
A dirty secret, except not that dirty or that secret: a deep understanding of Inform 7 requires understanding Inform 6. If you read the DM4, you’ll read about GPRs: general parsing routines. Topics are GPRs. “text1/text2/text3” as a topic compiles to something like:
range_from ! call parameter: word number of snippet start
range_words ! call parameter: snippet length
original_wn ! first word of text parsed
group_wn ! first word matched against A/B/C/... disjunction
w ! for use by individual grammar lines
rv ! for use by individual grammar lines
wn = range_from; original_wn = wn; rv = GPR_PREPOSITION;
group_wn = wn;
.group_156_1_1; wn = group_wn;
if (NextWordStopped() ~= 'text1') jump group_156_1_2;
.group_156_1_2; wn = group_wn;
if (NextWordStopped() ~= 'text2') jump group_156_1_3;
.group_156_1_3; wn = group_wn;
if (NextWordStopped() ~= 'text3') jump Fail_1;
if ((range_words==0) || (wn-range_from==range_words)) return rv;
.Fail_1; rv = GPR_PREPOSITION; wn = original_wn;
And that ultimately is why you can’t convert text to topics – I7 can’t create a function dynamically. And why it’s not meaningful to speak of converting topics to texts – a GPR could be arbitrarily complicated, and even in the “just match one string or not” case I7 can’t reach inside a function to see that that’s the case.