A subset of allowable symbols (which we'll call subsyms) may be assigned
arbitrary string values.  This is roughly equivalent to C preprocessor
#define macros.  When as encounters one of these
symbols, the symbol is replaced in the input stream by its string value. 
Subsym names must begin with a letter.
   
Subsyms may be defined using the .asg and .eval directives
(See .asg,
See .eval.
   
Expansion is recursive until a previously encountered symbol is seen, at which point substitution stops.
In this example, x is replaced with SYM2; SYM2 is replaced with SYM1, and SYM1 is replaced with x. At this point, x has already been encountered and the substitution stops.
      .asg   "x",SYM1
      .asg   "SYM1",SYM2
      .asg   "SYM2",x
      add    x,a             ; final code assembled is "add  x, a"
   Macro parameters are converted to subsyms; a side effect of this is the normal
as '\ARG' dereferencing syntax is unnecessary.  Subsyms
defined within a macro will have global scope, unless the .var
directive is used to identify the subsym as a local macro variable
see .var.
   
Substitution may be forced in situations where replacement might be ambiguous by placing colons on either side of the subsym. The following code:
      .eval  "10",x
     LAB:X:  add     #x, a
   When assembled becomes:
LAB10 add #10, a
Smaller parts of the string assigned to a subsym may be accessed with the following syntax:
:symbol(char_index)::symbol(start,length):