docs: function atom(value, options) {
  
    // is this a list or already wrapped atom?
    if(isList(value) || (!isPrimitive(value) && value.__isatom)) {
      // nothing to be done!
      return value;
    }
  
    // also they can pass just a token if they want
    // (though it better be a string or symbol - we don't type convert)
    if(!options && value && isToken(value)) {
      options = {token: value};
      value = value.text;
    }
  
    options = options || {};
    var atomized = {};
  
    // if they gave the token
    if(options.token) {
      // they can override the token category if they choose:
      options.token.category = options.category || options.token.category;
  
      // just pull the token info right into us:
      utils.mergeInto(atomized, options.token);
  
      // An end token... (e.g. the end of a list such as (), [], {})
      if(options.tokenType === "end") {
        // gets it's line/col from the "end" versions:
        atomized.line = options.token.endLine;
        atomized.col = options.token.endCol;
        delete atomized.endLine;
        delete atomized.endCol;
      }
    }
  
    atomized.value = value;
    atomized.parent = options.parent;
    atomized.toString = function() { return toString(atomized); };
    atomized.toQuotedString = function() { return addQuotes(toString(atomized)); };
    atomized.toUnquotedString = function() { return stripQuotes(toString(atomized)); };
    atomized.toJSON = function() { return toJSON(atomized); };
    atomized.error = function(msg, locator) {
        lexerOf(atomized).error(msg, locator || atomized);
    };
    atomized.transform = options.transform;
    atomized.__isatom = true;
    return atomized;
  }