For the non encode/decode category
while $asc($) is disallowed (a literal "$"), $asc($true) is allowed (as $true is built-in)
Correct. For this category, you may not use literal strings with a few exceptions mentioned below.
given a built-in string function $builtin1(): while $builtin1($builtin2 $+ $builtin3) is allowed, $builtin1($builtin2 $builtin3) is not, because it would be using a literal space as part of the input
A literal space is an exception becuase it MUST
be sandwiched between non space values for the space to have any impact on code evaluation. Though not directly returned by a built in identifier it requires the use of other identifers to alter the processing.
The other (known) exception to literal string usage is the pattern portion of reg/sub/ex calls. This exception is made because a reg/sub/ex pattern does not, in any direct way, become part of the returned result; instead the pattern is more of a directive than a literal. The other rules(no numbers) still apply to the pattern though.