如何隐藏(读取)Common Lisp中的输出

问题描述 投票:2回答:1

我正在编写密码输入功能,我希望它像Unix / Linux密码输入样式一样,输入但不在屏幕上打印任何内容。或者,也可以在屏幕上打印“ *”。

我发现了这个问题“ common lisp, how to mask keyboard input”,这是我想要的,但是当我在软泥中运行它们时,给定的echo-onecho-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 lisp common-lisp sbcl slime
1个回答
1
投票

如果直接从emacs运行slime(即使emacs以-nw启动),也没有可以通过termios控制的终端。在那种情况下,sb-sys:*tty*绑定到既不是file-stream也不是fixnum的双向流。这就是代码失败的原因。

如果您的代码应该能够在不同的用户界面(实际的emacs GUI,GTK等)中运行,那么您需要管理前端和专用的方式来提示输入密码(例如emacs具有read-passwd功能,但您必须从sbcl调用emacs代码,默认情况下是禁止的;在emacs和sbcl之间的传输期间,密码可能应该加密);这是很多工作,没有简单的答案。

[如果只想编写只在终端中运行的应用程序,但是在开发过程中,您想使用Slime从emacs进行编码,则只需更改启动Slime的方式即可:

  • 从终端开始sbcl
  • 运行swank服务器

    (ql:quickload :swank)
    (swank:create-server)
    
  • 从emacs,使用slime-connect连接到该服务器

然后,sb-sys:*tty*将指定终端,并且代码应按预期工作。在所有情况下(开发和实际使用)都运行相同的代码。

© www.soinside.com 2019 - 2024. All rights reserved.