【问题标题】:How to hidden (read) output in Common Lisp如何在 Common Lisp 中隐藏(读取)输出
【发布时间】:2020-04-24 10:57:57
【问题描述】:

我正在写一个密码输入函数,我会让它像 Unix/Linux 密码输入风格,输入但不打印任何东西在屏幕上。或者,在屏幕上打印“*”也可以。

我发现了这个问题“common lisp, how to mask keyboard input”,这是我想要的,但是当我在我的粘液中运行它们时,给出的函数答案给了echo-onecho-off 让我感到恐慌。 (但是,他们通过了编译)。

我在 emacs/slime 中编码,而恐慌发生在 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.0 macOS:10.15.2

【问题讨论】:

  • 您需要告诉我们您是如何使用它的吗?在终端中,在终端中的 emacs/slime 中,在某些 GUI 中,......其中每一个都可能使用不同的方法来显示内容。
  • 对不起。我只是添加我运行它的方式。
  • 错误消息说代码需要一个fixnum或一个文件流,但双向流不是文件流(Slime重新绑定输入/输出流,这就是为什么有双向流)。但是“sb-sys:*tty*”不应该受到影响,所以我想如果你把 Slime 从问题中删除,它也应该会失败?您是否尝试直接在终端中运行脚本(即sbcl --load ...)?
  • 我刚试过,你是对的,sbcl —load 工作正常。那么我有什么方法可以在粘液中运行它吗?或者在 slime 中运行时不要运行 echo-off/on?谢谢。
  • 我使用#-swank 来检测正在运行的环境。如果在粘液中,请不要运行 echo-on/off。有没有更好的办法。

标签: emacs lisp common-lisp sbcl slime


【解决方案1】:

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

如果您的代码应该能够在不同的用户界面(实际的 emacs GUI、GTK 等)中运行,那么您需要管理前端和专用的密码提示方式(例如,emacs 有一个 @987654327 @函数,但是你必须从sbcl调用emacs代码,默认情况下是禁止的;并且密码应该在emacs和sbcl之间传输过程中加密);这还有很多工作要做,而且没有简单的答案。

如果您只想编写一个应该专门在终端中运行的应用程序,但在开发过程中您想使用 Slime 从 emacs 编写代码,那么您可以简单地更改启动 Slime 的方式:

  • 从终端启动 sbcl
  • 运行一个漂亮的服务器

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

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

【讨论】:

  • 感谢您的回复。我比较了slimesbcl features 列表,发现只有粘液有swank。所以我使用#-swank 来避免粘液中的echo-on/off 函数。有用。而且我认为这可能是制作此功能的最简单方法。
  • @ccQpein 我会说图像中出现的“swank”(即使未使用)与从终端运行的 sbcl 无关;所以如果可能会解决您的问题,但只是偶然。一种更强大的方法是处理(echo off),并仅在前一个(echo off) 成功时在退出时调用(echo on) (?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多