Function UNREAD-CHAR
unread-char character &optional input-stream => nil
character - 文字。 input-streamから読み込んだ最後の文字でなければなりません。
input-stream - 入力ストリーム指定子。デフォルトは標準入力。
unread-charは、characterをinput-streamの前に戻し、 ふたたびinput-streamの次の文字になるようにします。
input-streamがechoストリームのとき、 input-stream上ですでに実施された文字のエコーの取り消しは行いません。 しかしunread-charによるinput-stream上で置き換えられた文字は、 あとでread-charによって再びエコーされ内容にするために 印がつけられます。
同じストリームに対してunread-charを二度続けて、 read-char(または暗黙的に文字の読み込みを行う他の入力操作)を 介入させることなく実行したときはエラーです。
peek-charかread-charの呼び出しは、前の文字を渡します。 peek-charによって返却されたものの前のどんな文字について unread-charを実行した結果は指定されていません (peek-charのpeek-typeがnilでは なかったときに渡された場合を含む)。 とくに、peek-charのあとのunread-charの 呼び出しの結果は指定されていません。
(with-input-from-string (is "0123")
(dotimes (i 6)
(let ((c (read-char is)))
(if (evenp i) (format t "~&~S ~S~%" i c) (unread-char c is)))))
>> 0 #\0
>> 2 #\1
>> 4 #\2
=> NIL*standard-input*, *terminal-io*
なし。
peek-char, read-char, 21.1. ストリームの説明
unread-charは、 Lispリーダーやその他の構文解析を実行するときに input-streamからひとつの文字を先読みできるような 効率的な仕組みの提供を目的としています。