我正在编写密码输入功能,我希望它像Unix / Linux密码输入样式一样,输入但不在屏幕上打印任何内容。或者,也可以在屏幕上打印“ *”。
我发现了这个问题“ common lisp, how to mask keyboard input”,这是我想要的,但是当我在软泥中运行它们时,给定的echo-on
和echo-off
给出的函数让我感到恐慌。 (但是,他们通过了编译)。
我使用emacs / slime进行编码,并且恐慌发生在粘液中(以下错误消息)。在我的计划中,我将通过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.0macOS:10.15.2
如果直接从emacs运行slime
(即使emacs以-nw
启动),也没有可以通过termios控制的终端。在那种情况下,sb-sys:*tty*
绑定到既不是file-stream
也不是fixnum
的双向流。这就是代码失败的原因。
如果您的代码应该能够在不同的用户界面(实际的emacs GUI,GTK等)中运行,那么您需要管理前端和专用的方式来提示输入密码(例如emacs具有read-passwd
功能,但您必须从sbcl调用emacs代码,默认情况下是禁止的;在emacs和sbcl之间的传输期间,密码可能应该加密);这是很多工作,没有简单的答案。
[如果只想编写只在终端中运行的应用程序,但是在开发过程中,您想使用Slime从emacs进行编码,则只需更改启动Slime的方式即可:
运行swank服务器
(ql:quickload :swank)
(swank:create-server)
从emacs,使用slime-connect
连接到该服务器
然后,sb-sys:*tty*
将指定终端,并且代码应按预期工作。在所有情况下(开发和实际使用)都运行相同的代码。