docs: private void compileAssignment(Sequence sequence, TokenList tokens, TokenList.Token t0) {
          // see if it is assign or a range
          List<Variable> range = parseAssignRange(sequence, tokens, t0);
  
          TokenList.Token t1 = t0.next;
          if (t1.getType() != Type.SYMBOL || t1.getSymbol() != Symbol.ASSIGN)
              throw new ParseError("Expected assignment operator next");
  
          // Parse the right side of the equation
          TokenList tokensRight = tokens.extractSubList(t1.next, tokens.last);
          compileTokens(sequence, tokensRight);
          if (tokensRight.getLast().getType() != Type.VARIABLE)
              throw new RuntimeException("BUG the last token must be a variable");
  
          // copy the results into the output
          Variable variableRight = tokensRight.getFirst().getVariable();
          if (range == null) {
              // no range, so copy results into the entire output matrix
              sequence.output = createVariableInferred(t0, variableRight);
              sequence.addOperation(Operation.copy(variableRight, sequence.output));
          } else {
              // a sub-matrix range is specified.  Copy into that inner part
              if (t0.getType() == Type.WORD) {
                  throw new ParseError("Can't do lazy variable initialization with submatrices. " + t0.getWord());
              }
              sequence.addOperation(Operation.copy(variableRight, t0.getVariable(), range));
          }
      }