[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Does READ-CHAR echo?



    Date: Fri, 26 Jul 85 15:02 EDT
    From: Kent M Pitman <KMP@SCRC-STONY-BROOK.ARPA>

    I could not find any place in CLtL where it says whether READ-CHAR echos
    the character that it has read. Likewise for PEEK-CHAR. Also, there is
    no discussion of whether UNREAD-CHAR should unecho the character.

The manual says on page 328 that READ-CHAR from the terminal echos.  I don't
know why this isn't repeated on page 379.  The manual should say that
UNREAD-CHAR doesn't unecho characters; it implies it by saying that UNREAD-CHAR
is only for parsers and can only back up one character.

    I note that Symbolics Common Lisp has (somewhat arbitrarily, I guess)
    decided that READ-CHAR echos, PEEK-CHAR does not echo, and UNREAD-CHAR
    does not un-echo the character. 

PEEK-CHAR echos characters it eats, but not the one it leaves in the stream's
input buffer.  Yes, the manual ought to say something about echoing in PEEK-CHAR.

				    This has the odd effect that:
 
     (PROGN (PEEK-CHAR) (UNREAD-CHAR (READ-CHAR)) (READ-CHAR))

    echos the character twice.

This is a bug in our operating system, not in Common Lisp.  The problem is
that if instead you had written

     (PROGN (PEEK-CHAR) (UNREAD-CHAR (READ-CHAR)) (PRINT 'FOO) (READ-CHAR))

then it really was supposed to echo it twice, once before the FOO and again
after it.  It's somewhat difficult to fix your example without breaking this
one.

    Does anyone have any thoughts about whether we should think about adding
    functions called PEEK-CHAR-NO-ECHO, READ-CHAR-NO-ECHO, and UNREAD-CHAR-NO-ECHO?
    Or maybe there should be WITH-INPUT-ECHO and WITHOUT-INPUT-ECHO special forms
    which affect calls to the character readers within the dynamic scope of their
    body.

I don't see anything about this in the manual, but I remember discussions of the
Common Lisp committee at which we decided that Common Lisp (first edition) wasn't
going to try to be a language you could write a display editor in.  The problem
is that this quickly gets you mired in a host of operating-system dependencies.
We decided it was better to have to go outside the portable language to do the
terminal input and output sections of your display editor; of course all the
difficult parts could be written in Common Lisp.

In addition to the ways of reading one character of input with echoing you
suggested (different function, dynamically-scoped state), one should also
mention using a different stream, adding a fifth optional argument to READ-CHAR,
and providing functions to turn an echoing "mode" on and off.  I can't guess which
implementors would have difficulty getting their operating system to conform to
which of these methods.

    Date: Fri, 26 Jul 85 17:21 EDT
    From: Robert W. Kerns <RWK@SCRC-YUKON.ARPA>

    I think the only one needed would be READ-CHAR-NO-ECHO.

I agree.

    [From: KMP]
    I kind of assume that we all agree that READ and READ-LINE should echo
    the characters as they come in from an interactive terminal. Perhaps,
    we should state that explicitly in the next edition of the manual.

Page 328.

    Date: Fri, 26 Jul 85 16:13:10 pdt
    From: mips!earl@Glacier (Earl Killian)

    Does READ-CHAR echo, or does the terminal handler, which supplied the
    character in the first place, echo?  Echoing is terminal-specific
    (you don't want READ-CHAR from a file to echo) so it makes more sense
    to talk about what the terminal handler does.  

See the carefully evasive language on page 328.

						   This starts to get
    into the controversy over whether you want to echo the character when
    it is typed ("interrupt level") or when it is read, or try to rise
    above these simple alternatives to do the right thing.

Here comes the morass of operating-system dependencies!  In some systems these
concepts aren't even meaningful.  In some others the implementor of Common Lisp
has no control over these affairs.