[armedbear-devel] Using print and read together.

Pascal J. Bourguignon pjb at informatimago.com
Mon Jun 13 14:05:13 UTC 2011

Ted Kosan <ted.kosan at gmail.com> writes:

> I am currently working through the "Land of Lisp" book by Conrad
> Barski and I am using ABCL to run all of the code in the book. In the
> following code, the prompt that is printed by 'print' 

No.  This is a misconception.  PRINT doesn't print anything. 
It's FORCE-OUTPUT that does.

> is not seen until after 'read' returns:

Of course, since you didn't issue any FORCE-OUTPUT.  Now, in the case of
interactive I/O, you may want to use FINISH-OUTPUT instead of
FORCE-OUTPUT.  FINISH-OUTPUT calls FORCE-OUTPUT and then waits for the
output to be completed, thus ensuring that the reading doesn't start
before the prompt is written.  You should even call CLEAR-INPUT before
read, to ensure that all input before the READ is discarded.

> (defun add-five()
>     (print "Pleaser enter a number:")
>     (let ((num (read)))
>         (print "When I add five I get")
>         (print (+ num 5))))
> Is it possible to configure ABCL to have the output from 'print' be
> visible immediately so that it can be used to prompt the user to input
> some information?

Conforming interactive code should be written as:

    (defun add-five ()
      (terpri) (princ "Pleaser enter a number: ")
      (let ((num (read)))
        (princ "When I add five I get ")
        (princ (+ num 5))
        (terpri) (terpri)

    CL-USER(4): (add-five) 42

    Pleaser enter a number: 11

    When I add five I get 16


Notice: with slime, the 42 might be retained by slime, and send after to
swank for evaluation, so it might still be read by swank REPL after the
function add-file having cleared the input returns.  

__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.

More information about the armedbear-devel mailing list