Как скрыть (прочитать) вывод в Common Lisp - PullRequest
3 голосов
/ 07 января 2020

Я пишу функцию ввода пароля, я бы сделал это как Unix / Linux стиль ввода пароля, ввод, но без печати на экране. Или напечатайте "*" на экране тоже хорошо.

Я нашел этот вопрос " обычный шрифт, как маскировать ввод с клавиатуры ", это то, что я хочу, но функции отвечают учитывая echo-on и echo-off дают мне пани c, когда я запускаю их в своей слизи. (Однако они прошли компиляцию).

Я кодирую в emacs / slime, а pani c происходит в слизи (сообщения об ошибках ниже). В моем плане я запусту этот единственный скрипт в терминале по sbcl --load ./this-script.lisp.

Сообщение об ошибке:

#<TWO-WAY-STREAM
  :INPUT-STREAM #<SB-SYS:FD-STREAM for "standard input" {1004AA8933}>
  :OUTPUT-STREAM #<SB-SYS:FD-STREAM for "standard output" {1004AA8A63}>>
    fell through ETYPECASE expression.
Wanted one of (FILE-STREAM FIXNUM).
   [Condition of type SB-KERNEL:CASE-FAILURE]

Кто-нибудь знает, как сделать это сейчас?

Спасибо.

версия sbcl: SBCL 2.0.0 macOS: 10.15.2

1 Ответ

1 голос
/ 08 января 2020

Если вы запускаете slime непосредственно из emacs (даже если emacs запускается с -nw), нет терминала для управления с term ios. В этом случае sb-sys:*tty* связан с двусторонним потоком, который не является ни file-stream, ни fixnum. Вот почему код терпит неудачу.

Если ваш код должен иметь возможность работать в разных пользовательских интерфейсах (фактические emacs GUI, GTK и т. Д. c.), Тогда вам нужно управлять внешним интерфейсом и специальные способы запроса пароля (например, в emacs есть функция read-passwd, но вы должны вызывать код emacs из sbcl, который по умолчанию запрещен; и, вероятно, пароль должен быть зашифрован во время передачи между emacs и sbcl); это намного больше работы, и нет простого ответа.

Если вы хотите написать приложение, которое должно работать исключительно в терминале, но во время разработки вы хотите написать код из emacs, используя Slime, тогда вы можете просто изменить способ запуска Slime:

  • Запустить sbcl с терминала
  • Запустить сервер swank

    (ql:quickload :swank)
    (swank:create-server)
    
  • Из emacs, используйте slime-connect для подключения к этому серверу

Тогда sb-sys:*tty* будет обозначать терминал, и код должен работать как задумано. Один и тот же код выполняется во всех случаях (разработка и фактическое использование).

...