LispValue read_comma_token(PushbackReader stream) throws EOFException
  {
    LispValue newCell          = NIL;
    LispValue newQuotedList    = NIL;
    LispValue identifier       = NIL;
    int  intCh;
    char ch;

    if (BackQuoteLevel <= 0)
    {
      System.err.println(";; *** ERROR: Comma not inside backquote.");
      return NIL;
    }

    try { intCh = inputReader.read(); }
    catch (IOException e) { return NIL; }

    if (intCh < 0)  { throw new EOFException("Premature end of LISP input."); }
    else
      ch = (char) intCh;

    // Apparently read() doesn't do translation.
    if (ch == '\r')  ch = '\n';

    if (isAtSign(ch))
      identifier = COMMA_ATSIGN_FN;
    else if (isPeriod(ch))
      identifier = COMMA_DOT_FN;
    else
    {
      identifier = COMMA_FN;
      unread(ch);
    }

    newQuotedList = cons(identifier,
                         cons(NIL, NIL));

    newCell = read();

    cdr(newQuotedList).rplaca(newCell);
    return(newQuotedList);
  }