Inform 7 Home Page / Documentation
§22.6. Generic phrases
The following looks quite innocent:
To say (V - value) twice: say "[V]. [V], I say!"
It's clear at a glance what this is intended to do, but at a second glance things aren't so straightforward. "Value" is not itself a kind - it's too big and unspecific. For instance, if we were to allow a variable to be just "a value", we could freely set it to 12 one minute and to "dahlias" the next, and such a variable would be dangerous since we would never know what could safely be done with its contents. A phrase like this one is called "generic", because it's not so much a single, actual phrase as a recipe to make phrases. (Inform automatically works out which kinds we need the phrase for, and creates a version of the phrase for those kinds.)
So "value" is not a kind, but a kind of kind. Inform has several of these:
value, arithmetic value, enumerated value, sayable value
These act as ways to say "a value of any kind matching this can go here". For example, "value" is a way to say "any kind at all"; "arithmetic value" is any kind which arithmetic can be performed on (any kind with the little calculator icon in the Arithmetic part of the Kinds index); and so on. If we write:
To double (V - arithmetic value): say "[V times 2]."
the restriction to "arithmetic value" means that although "double 3", "double 6 kg", etc., would be matched, "double the Entire Game" would not - you can't perform arithmetic on scenes. Similarly, it would have been tidier to write:
To say (V - sayable value) twice: say "[V]. [V], I say!"
because then Inform will make it clearer why "say X twice" won't work if X is one of those rare values which it can't say (an activity, for instance).
The Kinds index shows which kinds match against which of these "kinds of kind". For instance, it shows that "time"
Matches: value, arithmetic value, sayable value
which means that time is something we can do arithmetic on, and can say.