docs: function handleBindingAssignment(forms) {
    var which = sl.valueOf(forms[0]);
    if (forms.length != 3)  {
      forms.error("Binding assignment expects lhs " + which + " rhs");
    }
    var target = forms[1];
    var reactor = forms[2];
  
    // extract the "cell" arguments
    // note: the expression may use a call to a named function e.g.:
    //   feedback #= feedbackmsg(score);
    // or might use an anonymous function e.g.:
    //   feedback #= function(score) {if?(score > 9) "You won!" else "Try again."};
    // or
    //   feedback #= (score) => {if?(score > 9) "You won!" else "Try again."};
    var cells;
    var invokereactorfn;
    if(sl.valueOf(reactor[0]) === "function" || sl.valueOf(reactor[0]) === "=>") {
      // grab the args from e.g. (function (score) {...})
      cells = reactor[1];
  
      // note here we must create a *call* to the anonymous function
      // also note the argument name(s) are assumed to *be* the cell variable names
      invokereactorfn = sl.list(reactor);
      invokereactorfn.pushFromArray(cells);
    }
    else {
      // slice just the args from e.g. (feedbackmsg score)
      cells = sl.listFromArray(reactor.slice(1));
  
      // note here the code provided was already a *call* which is what we need.
      // also note the argument name(s) are assumed to *be* the cell variable names
      invokereactorfn = reactor;
    }
  
    // We return an s-expression *form* (like a macro) not generated js
    // It uses #react to register code forms inserted (later) by the transpiler
    // it's like (#react after set (cell1, cell2) (set tgt (reactorfn cell1 cell2)))
    var registrar = sl.list("#react");
    registrar.push(which === "#=" ? "after" : "before");
    // the "mutators" set/++/+=/etc. are in the context to make them easy to change
    registrar.push(sl.listFromArray(this.mutators));
    registrar.push(cells);
    registrar.push(sl.list("set", target, invokereactorfn));
  
    return registrar;
  }