Prototype variables are names giving an index into a structured block of memory. They are not identical to normal BASIC variables, but may look and act in a very similar manner.
All values are stored byte-aligned, which is efficient with memory, but is a touch slower than word-aligned.

integer%a 4-byte integer - !index
string$a 5-byte SIB - $!index
string$[n]a string in a buffer of length n+1 within the block - $index
string!an indirected string - $!index
byte?a 1-byte integer - ?index
float|a 5-byte floating point number - |index
substr{proto}a substructure to be created from a previously defined prototype
substr{}an indirected substructure
array?(n)an array with n+1 elements
types ? = % $ ? | !
array#(n)a bit array with n+1 elements
array?()an indirected array
types ? = % $ |
array(n){proto}an array of n+1 substructures

all types of string are read with string$, so the names must differ.
strings are terminated by CR(13) when written but will be read when terminated by NULL(0), LF(10) or CR(13); strings should not contain these characters.
a buffered string longer than the length of the buffer will be truncated.
a substructure is referenced by its name only: substr.
a floating point variable must have the '|' suffix.
an attempt is made to check that the characters of a variable name comform to BASIC rules, but it cannot be guaranteed.