Excellent and incredibly thorough comments all. Thank you for them.
Before getting into the details, let's tackle the main theme: Because
the text format is supposed to be able to encode all the same data as
the binary format (sans comment and whitespace considerations), I
thought the syntax should be able to easily represent everything that
Lisp/Scheme can generate.
For example, it's trivial to call (string->symbol x), and the simplest
thing to do in a binary format is to just write out (string->utf8
(symbol->string x)) for any symbol we might find, without limiting the
range of characters. In order for the text S-expression format to be
identical in range, it has to have vertical-bar notation for symbols.
Same goes for the consing dot: it the binary format has pairs, then the
text format has to have them too. Here it would be simple enough to
leave out pairs from both the text and the binary format, and only allow
proper lists. But that limits the ability send Lisp code which often
uses dotted pairs. Perhaps dotted lists can be one of the special data
types like #dotted{(1 2 3) 4}. Not elegant, but it's one option.
List vs vector, and characters vs 1-letter strings, are issues similar
to consing dot: the format makes a distinction because Lisps make a
distinction. There's no broader point behind it.