```ts
export function readSexpr(text: string): number | string | any[] {
  if (typeof text !== 'string' || !text.trim()) throw new Error('Invalid input');

  const tokenize = (input: string) => {
    return input.match(/-?\d+|[+\-*/!?a-zA-Z0-9]+|\(|\)|\s+/g).filter(Boolean);
  };

  const parseAtom = (token: string): number | string => {
    if (/^-?\d+$/.test(token)) return parseInt(token, 10);
    return token;
  };

  const parseList = (tokens: string[]): any[] => {
    tokens.shift(); // Remove '('
    const result: any[] = [];
    while (tokens[0] !== ')') {
      if (tokens[0] === '(') {
        result.push(parseList(tokens));
      } else {
        result.push(parseAtom(tokens.shift()!));
      }
    }
    tokens.shift(); // Remove ')'
    return result;
  };

  const tokens = tokenize(text);
  const parsed = parseList(tokens);

  if (tokens.length > 0) throw new Error('Extra characters after expression');

  return parsed;
}
```