code: function getOperatorSpecFor(atomOrStr, dialects) {
  
    var opSpec;
  
    var atom = typeof atomOrStr !== 'string' ? atomOrStr : undefined;
    var str = typeof atomOrStr === 'string' ? atomOrStr : undefined;
    var sym = str || sl.valueOf(atom);
  
    // make sure and check the atom first - it takes precedence
    if(atom) {
      // was this form "dynamically" marked as needing to be transformed?
      opSpec = atom.operator;
    }
  
    if(!opSpec) {
      // no - was it "statically" marked i.e. via it's symbol in a readtab?
      dialects.find(function(dialect) {
        if(dialect.readtab.__operatorsymbols.indexOf(sym) !== -1) {
          var readfn = (!Array.isArray(dialect.readtab.__operators[sym]) ?
                            dialect.readtab.__operators[sym] :
                            dialect.readtab.__operators[sym][0]);
          opSpec = readfn.operator;
          return true;
        }
        return false;
      });
    }
  
    if(opSpec &&
      !opSpec.infix && !opSpec.prefix && !opSpec.postfix)
    {
      if(opSpec.type) {
        var reformedOpSpec = {};
        reformedOpSpec[opSpec.type] = opSpec;
        opSpec = reformedOpSpec;
      }
      else {
        sl.lexerOf(atom).error("Malformed operator precedence specification for " + sym);
      }
    }
  
    return opSpec;
  }
docs: get the "operator spec" for the form (if any).
  this is an object of the form e.g.
  {
  type: infix,
  read: reader.infix2prefix,
  precedence: 15,
  options: {altprefix: 'arrowfn'}
  }
  
  @parm atomOrStr an atom or a symbol string
  @param dialects the "stack" of current dialects