read-char
nicht benötigen Sie geben zu drücken. ZB
CL-USER> (with-input-from-string (x "hello")
(print (read-char x)))
#\h
Und falls Sie eine Eingabe in SBCL von der Kommandozeile senden, wird es ohne eine neue Zeile zu lesen:
$ echo -n hello | sbcl --eval "(print (read-char))"
…
#\h
Nach dem Lesen und #\h
Druck, sah SBCL die ello
:
*
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD
"initial thread" RUNNING
{1002979011}>:
The variable ELLO is unbound.
ich denke, dies zu bestätigen genug ist, dass es sich um eine nicht read-char
Bedürfnisse newline, aber eher, dass die Pufferung der Eingabe ist das Problem. Ich denke, das ist das gleiche Problem (oder Nicht-Problem), das in einem comp.lang.lisp-Thread von 2008 beschrieben wird: Re: A problem with read-char. Der Benutzer fragt:
Ist es möglich, in С read-char verhalten sich wie getch zu machen, wenn mit interaktiven Strom (Standard-Eingang) zu arbeiten? In SBCL read-char will "Enter" -Taste, um von REPL zu lösen, in C getchar kehrt sofort zurück, nachdem Benutzer die Taste auf der Tastatur drücken. Wahrscheinlich ist es möglich, den Code auszuführen, der read-char mit direktem Konsolenzugriff verwendet, neben REPL?
Es gibt vier Antworten (siehe thread index zu allen von ihnen zu bekommen). Diese erklären , warum dieses Verhalten beobachtet wird (nämlich, dass der Lisp-Prozess keine rohe Eingabe vom Terminal erhält, sondern gepufferte Eingabe). Pascal Bourguignon described the problem, und eine Möglichkeit, dies mit CLISP zu handhaben (aber das viel alle Hilfe bietet keine, abgesehen von den üblichen guten Rat) über in SBCL um diese Arbeit:
Der Unterschied besteht darin, dass Flüche in das Terminal setzt Rohmodus in der Lage die Zeichen von der Tastatur eins nach dem anderen zu empfangen, anstelle von Verlassen des Terminals im gekochten Modus, wo der Unix-Treiber Zeilen und Griffe Backspace puffert, neben anderen Feinheiten.
...
Nun weiß ich nicht, über SBCL, (lesen Sie das Handbuch von SBCL). Ich habe nur die Implementierungshinweise von CLISP in meine Wetware geladen. In CLISP können Sie den EXT: WITH-KEYBOARD-Makro verwenden (während die grundlegenden Ausgabefunktionen von Curses vom SCREEN-Paket bereitgestellt werden).
Rob Warnock's response enthalten einige Abhilfe Code für CMUCL, die für SBCL könnte oder könnte nicht funktionieren:
ich folgendes für CMUCL für eine Anwendung einmal geschrieben, die wollte in der Lage sein ein einzelnes Zeichen Antwort eingeben um eine Aufforderung ohne den Terminal-Bildschirm vermasselt:
(defun read-char-no-echo-cbreak (&optional (stream *query-io*))
(with-alien ((old (struct termios))
(new (struct termios)))
(let ((e0 (unix-tcgetattr 0 old))
(e1 (unix-tcgetattr 0 new))
(bits (logior tty-icanon tty-echo tty-echoe
tty-echok tty-echonl)))
(declare (ignorable e0 e1)) ;[probably should test for error here]
(unwind-protect
(progn
(setf (slot new 'c-lflag) (logandc2 (slot old 'c-lflag) bits))
(setf (deref (slot new 'c-cc) vmin) 1)
(setf (deref (slot new 'c-cc) vtime) 0)
(unix-tcsetattr 0 tcsadrain new)
(read-char stream))
(unix-tcsetattr 0 tcsadrain old)))))
SBCL hat wahrscheinlich erheblich von CMUCL in diesem Bereich abwich, aber sollte etwas Ähnliches mit SBCL machbar sein. Starten Sie durch in der SB-UNIX suchen oder vielleicht die SB-POSIX-Pakete ...
User vippstar's response einen Link zu versehen, was tragbare Lösung die sein könnte
Da Sie etwas tun wollen, dass möglicherweise nicht tragbar zu einem Mikrocontroller (aber die Benefit ist die viel mehr UI), verwenden Sie eine Nicht-Standard-Bibliothek, wie CL-ncurses.
Ausgezeichnet, genau was ich dachte, als ich die Frage sah. Jetzt muss ich keine Antwort schreiben. – Vatine