Common lisp 如何在SBCL中设置终端流的charpos

Common lisp 如何在SBCL中设置终端流的charpos,common-lisp,sbcl,Common Lisp,Sbcl,我试图说服SBCL,在读取行之后,终端的charpos返回到0 例如,下面的代码 (progn) (格式*查询io*“输入:”) (强制输出*查询io*) (项目1) (读取行*查询io*) (写入(sb impl::charpos*查询io*)) 将打印7(或14、21,…取决于您运行它的次数),尽管afterread linecharpos应返回0 谢谢所以,事情是这样的 简单的方法: 如果您真的想确保达到左边距,您可以始终使用换行符 查波斯 SB-IMPL::CHARPOS是一个输出流左

我试图说服SBCL,在
读取行之后,终端的charpos返回到0

例如,下面的代码

(progn)
(格式*查询io*“输入:”)
(强制输出*查询io*)
(项目1)
(读取行*查询io*)
(写入(sb impl::charpos*查询io*))
将打印7(或14、21,…取决于您运行它的次数),尽管after
read line
charpos
应返回0


谢谢

所以,事情是这样的

简单的方法: 如果您真的想确保达到左边距,您可以始终使用
换行符

查波斯
SB-IMPL::CHARPOS
是一个输出流左边距的字符位置。它没有被记录或导出,但ANSI streams上的评论指出:

  :charpos           - Return current output position on the line.
当您将流混合在一起时,它不是屏幕上的光标位置,并且(正如您所发现的那样),它不会跟踪双向流的输入端

它的灰色流存取器是
流行列

返回下一个字符所在的列号 将被写入,如果这对该流没有意义,则为NIL。 行上的第一列编号为0。此函数用于 PPRINT和FORMAT~T指令的实现。每 已定义的字符输出流类,必须指定一个方法 为该功能定义,但允许 始终返回零

按你说的做 如果您想将
*query io*
包装为这样一种方式,即您可以为系统指定明显的输出列-例如,因为您期望另一个流(输入端的回音)发送了新行-您可以将其包装为您自己的灰色流类,并对该方法“应该”返回的内容进行内部计算。(基本上只是一个
defclass
,而
make-instance:after
streamline-column
的实现)

但是,总的来说,我认为这不是一个好主意

为什么我认为你不应该 请记住,
*query io*
可以从一个单独的窗口/小部件中提取输入,而不是从其输出出现的位置提取输入-例如,我见过一些例子,其中CLIM中的双向流将输出打印到上方窗格中,并从下方的小缓冲区收集输入(如许多Internet中继聊天程序),因此,如果您的目标是任何程度的可移植性,那么假设您对该流的输出和用户的输入将在屏幕上混合显示是不安全的

假设用户必须输入换行符才能完成输入也是不完全安全的——用户按下的返回键可能不会打印换行符是允许的;例如,它可能会清除他们的输入框。例如,他们也可能通过单击“确定”按钮完成输入


如果您确定
*查询io*
连接到一个具有屏幕编辑器的终端,即类似Gnome终端的终端,而不是Slime会话,则可以使用(如@coredump建议的)CL-Charms或类似于在窗口中准确定位光标的东西。

我想我找到了
sb kernel::charpos的定义,但我不确定它是如何工作的。另外,有趣的是,如果运行
rlwrap sbcl
,打印的值不会增加。是的,我也找到了这个函数(这就是我在上面的代码中调用的函数),但它没有匹配的
setf charpos
。如果你想避免打开一罐蠕虫,我建议使用,它依赖于libcurses。谢谢。这有助于理解一个表面上简单的情况是如何产生更深层次的复杂性的。如果你知道它将在哪里被使用,无论如何,一些表格将使你达到目的。但是,“生活是痛苦的,公主。任何一个不这么说的人都是想卖给你一些东西。”