如何在 SBCL/Common Lisp 中与进程输入/输出交互

2024-01-03

我有一个文本文件,每行一个句子。我想使用 hunspell (-s 选项)对每行中的世界进行词形还原。由于我想分别获得每行的引理,因此将整个文本文件提交给 hunspell 是没有意义的。我确实需要一行接一行地发送,并为每一行提供 hunspell 输出。

遵循以下答案如何在 Steel Bank Common Lisp 中处理输入和输出流? https://stackoverflow.com/q/2353353/121095,我能够一行又一行地发送 hunspell 的整个文本文件,但我无法捕获每一行的 hunspell 输出。在发送另一行之前如何与发送行并读取输出的进程进行交互?

我当前读取整个文本文件的代码是

(defun parse-spell-sb (file-in)
  (with-open-file (in file-in)
    (let ((p (sb-ext:run-program "/opt/local/bin/hunspell" (list "-i" "UTF-8" "-s" "-d" "pt_BR") 
                 :input in :output :stream :wait nil)))
      (when p
        (unwind-protect 
          (with-open-stream (o (process-output p)) 
            (loop 
         :for line := (read-line o nil nil) 
         :while line 
         :collect line)) 
          (process-close p))))))

这段代码再次为我提供了整个文本文件的 hunspell 输出。我想分别为每个输入行提供 hunspell 的输出。

任何想法?


我想您要运行的程序存在缓冲问题。例如:

(defun program-stream (program &optional args)
  (let ((process (sb-ext:run-program program args
                                     :input :stream
                                     :output :stream
                                     :wait nil
                                     :search t)))
    (when process
      (make-two-way-stream (sb-ext:process-output process)
                           (sb-ext:process-input process)))))

现在,在我的系统上,这将适用于cat:

CL-USER> (defparameter *stream* (program-stream "cat"))
*STREAM*
CL-USER> (format *stream* "foo bar baz~%")
NIL
CL-USER> (finish-output *stream*)       ; will hang without this
NIL
CL-USER> (read-line *stream*)
"foo bar baz"
NIL
CL-USER> (close *stream*)
T

注意finish-output http://clhs.lisp.se/Body/f_finish.htm– 如果没有这个,读取将会挂起。 (还有force-output http://clhs.lisp.se/Body/f_finish.htm.)

交互模式下的 Python 也可以工作:

CL-USER> (defparameter *stream* (program-stream "python" '("-i")))
*STREAM*
CL-USER> (loop while (read-char-no-hang *stream*)) ; skip startup message
NIL
CL-USER> (format *stream* "1+2~%")
NIL
CL-USER> (finish-output *stream*)
NIL
CL-USER> (read-line *stream*)
"3"
NIL
CL-USER> (close *stream*)
T

但如果你在没有-i选项(或类似的选项,例如-u),你可能会运气不好,因为缓冲正在进行。例如,在我的系统上,读取tr将挂起:

CL-USER> (defparameter *stream* (program-stream "tr" '("a-z" "A-Z")))
*STREAM*
CL-USER> (format *stream* "foo bar baz~%")
NIL
CL-USER> (finish-output *stream*)
NIL
CL-USER> (read-line *stream*)          ; hangs
; Evaluation aborted on NIL.
CL-USER> (read-char-no-hang *stream*)
NIL
CL-USER> (close *stream*)
T

Since tr不提供关闭缓冲的开关,我们将使用 pty 包装器来包装调用(在本例中unbuffer从预期):

CL-USER> (defparameter *stream* (program-stream "unbuffer"
                                                '("-p" "tr" "a-z" "A-Z")))
*STREAM*
CL-USER> (format *stream* "foo bar baz~%")
NIL
CL-USER> (finish-output *stream*)
NIL
CL-USER> (read-line *stream*)
"FOO BAR BAZ
"
NIL
CL-USER> (close *stream*)
T

所以,长话短说:尝试使用finish-output在阅读之前在流上。如果这不起作用,请检查阻止缓冲的命令行选项。如果仍然不起作用,您可以尝试将程序包装在某种 pty 包装器中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SBCL/Common Lisp 中与进程输入/输出交互 的相关文章

  • 更改列表的第 n 个元素

    我想更改列表的第 n 个元素并返回一个新列表 我想到了三个相当不优雅的解决方案 defun set nth1 list n value let list2 copy seq list setf elt list2 n value list2
  • 使 clos 对象可在 lisp 中打印

    如果你想让 common lisp 中的 CLOS 对象可打印 可读打印 你如何在不使用除了 print 和 read 之外的任何东西的情况下做到这一点 至少在我的解决方案中 有两个部分可以做到这一点 但是您将需要这个功能 感谢 cl pr
  • 如何使用 common lisp 确定操作系统和主机名?

    为了让我的 sbclrc 文件在我使用的两台计算机上工作 我想要一种从 sbcl 中获取主机名和 或操作系统的方法 我知道我可以设置然后查找环境变量 但是有更直接的方法吗 Update 我将问题更改为引用 common lisp 因为 Ke
  • 如何从字符串创建关键字符号? [复制]

    这个问题在这里已经有答案了 从字符串创建符号非常简单 intern test gt test 我正在努力创造keywordplist 的符号 寻找类似的东西 XXXX test gt test 注意 intern test 不产生keywo
  • LISP - 小数点后的数字

    有谁知道如何在 Lisp 中指定浮点数小数点后的位数 假设我在 REPL 上打印此命令 CL USER 3 gt format t 15f float 1 7 I get 0 142857150000000 但是该数字四舍五入到小数点后第
  • LISP:关键字参数,提供-p

    目前我正在学习 Peter Seibel 的 Practical Common Lisp 在 实用 一个简单的数据库 一章中 http www gigamonkeys com book practical a simple database
  • 如何使用 SBCL 正确保存 Common Lisp 图像?

    如果我想创建我的程序的 Lisp 映像 我该如何正确地做到这一点 有什么先决条件吗 它与 QUICKLISP 配合得很好吗 现在 如果我启动 SBCL 仅预加载 QUICKLISP 并保存图像 save lisp and die core
  • 如何使用 Common Lisp 获得列表的所有可能排列?

    我正在尝试编写一个 Common Lisp 函数 该函数将给出列表的所有可能排列 每个元素仅使用一次 例如 列表 1 2 3 将给出输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我已经写过一些有用的东西 但它
  • Common Lisp 重新启动到条件绑定

    我在空闲时间学习 Common Lisp 并对条件系统有疑问 当我们在 common lisp 中处理错误时 我们在处理程序中指定错误类型来确定要处理哪个错误 在引发和处理错误之间 我可以进行一些重新启动 例如使用 restart case
  • Common Lisp 中的 LET 与 LET*

    我理解 LET 和 LET 并行绑定与顺序绑定 之间的区别 并且作为理论上的问题 它非常有意义 但有没有什么情况你曾经真正需要过 LET 在我最近查看的所有 Lisp 代码中 您可以将每个 LET 替换为 LET 而无需进行任何更改 编辑
  • Common Lisp 中重置状态

    新手 Common Lisp 问题在这里 有没有办法重置环境状态 我的意思是 是否有一些命令可以使 REPL 恢复到启动后的相同状态 即取消所有变量 函数等 或者如果这不在 Common Lisp 标准中 是否有一些扩展在 SBCL 我使用
  • 对于案例,这些表达案例的方法中哪种最好?

    这些都有效 defun testcaseexpr thecase case thecase foo format t matched foo bar format t matched bar funk format t matched fu
  • 有没有一种简单的方法可以使用 Common Lisp 中的 Python 库?

    在编写 Common Lisp 代码时我真正怀念的一件事是访问 Python 库 包括标准库和第三方模块 CLPython 提供了 Python 功能的有限子集 这阻止了大多数库的使用 因此这对我来说并不是很有用 我希望能够从 Common
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 递归分割列表函数 LISP

    split list 函数接受一个列表并返回一个由两个列表组成的列表 其中两个列表由输入的交替元素组成 我写了以下内容 defun split list L cond endp L list NIL NIL t let X split li
  • 在 cl-mongo 中实现 MongoDB SASL 身份验证

    我已经从 fons 分叉了 cl mongo common lisp MongoDB 库 存储库 因为它已经不再维护并且不支持 SCRAM SHA 1 登录过程 这是我的叉子 https github com mprelude cl mon
  • Lisp:使用语法糖访问递归哈希

    我正在尝试构建一个函数 或宏 来简化哈希表深处数据的获取和设置 也就是说 哈希中的哈希 哈希中的哈希等 我不认为我可以用宏来做到这一点 而且我不知道如何用 eval 来做到这一点 我希望能够执行以下操作 gethashdeep HEROES
  • 如何从 SBCL 解释器将特定函数写入文件?

    假设我在没有 SLIME 的情况下玩过 SBCL 没有任何简单的解释器 现在我想将几个函数保存在一个文件中 不是核心图像 只是文本形式的一些代码 我该怎么做呢 有两种方法可以做到这一点 使用DRIBBLE and or FUNCTION L
  • Common Lisp:循环列表中连续对的最佳方法是什么?

    有时我需要循环遍历列表中的连续对 我现在的做法是 loop for x on lst while not null cdr x do something on car x and cadr x 我想知道是否有更好的 内置的方法来做到这一点

随机推荐

  • HTML5 画布:调整图像大小

    我正在尝试将图像放置在画布上而不调整其大小 我认为 drawImage img x y 可以解决问题 但它会拉伸图像以填充画布 另外 向 drawImage img x y width height 提供图像的尺寸似乎不起作用 这是我的代码
  • 如何从Openfire获取群聊的离线消息

    有什么办法可以进入xmpp我得到的离线消息MultiUserChat 当我的用户登录并加入房间时 我想要实现群聊 like WhatsApp 还有其他方法可以实现这个请建议 提前致谢 至少在ejjaberd当您进入聊天组时 您必须输入您的最
  • 使用 Jsoup 和适当的 cookie 登录 Facebook

    我目前正在尝试自动废弃我自己的主页以及我登录 Facebook 时可以访问的其他可能页面 但是 在使用下面的代码并设置 cookie 后 我似乎无法 登录 Connection Response res Jsoup connect http
  • 为什么在链表中间插入是O(1)?

    根据维基百科关于链接列表的文章 http en wikipedia org wiki Linked list Linked lists vs arrays 在链表中间插入被认为是 O 1 我认为这将是 O n 您是否不需要找到可能靠近列表末
  • 如何选择DI容器? [复制]

    这个问题在这里已经有答案了 可能的重复 主要 C DI IoC 框架如何比较 https stackoverflow com questions 4581791 how do the major c sharp di ioc framewo
  • .War 可以在 Windows 上部署,但无法在 Linux 服务器 (Tomcat 7) 上部署

    正如标题所介绍的 我尝试使用 Tomcat 7 部署的 War 文件无法在运行 Linux 的计算机上运行 它确实可以在 Windows 上运行 并且当然可以使用 Tomcat 7 进行部署 我试图单独追踪这个问题并在网络上搜索相关问题 包
  • 回显但保留双引号

    我正在尝试创建一个脚本 它将变量 文本回显到文件中 该脚本的一个片段是 echo SUBJECT Text here EMAIL email protected cdn cgi l email protection EMAILMESSAGE
  • 如何修复实体和 POJO 必须有可用的公共构造函数

    当我尝试在使用 sqlite 数据库时启动我的应用程序时 出现此错误 我在不同的文件中有 3 个数据类 Entity tableName movies data class MovieNews PrimaryKey autoGenerate
  • 由于尝试调用虚拟方法“java.lang.String android.content.Context.getPackageName()”,意图失败

    我拥有的 我有一个 RecyclerView 其中包含酒吧 咖啡店的图像 ETC 我想要的 当您单击这些图像之一时 我会向您显示所选位置的信息 但是在您单击所选图像时 应用程序崩溃并显示此错误 尝试调用虚拟方法 java lang Stri
  • 单击 JTextField 中的图标并清除其内容

    我正在尝试创建一个带有图像和提示的 JTextField 文本字段的功能是一个搜索字段 用于搜索一些书籍 现在 我想走得更远一点 我想赋予图像一个功能 例如 如果我单击图像 文本字段中的文本应该被清除 为了实现此实现 我创建了一个新类并使用
  • JS Analytics 电子商务回调

    我找不到任何地方如何使用hitCallback谷歌分析参数ecommerce send 在文档中 它唯一的例子是send pageview 这是我尝试过的代码 ga ecommerce send hitCallback function w
  • 在 python 中使用多个参数进行日志记录

    在 python 日志记录模块中 日志的格式如下 formatter logging Formatter asctime s name s levelname s message s simple example py applicatio
  • 为什么 Angular Guards canActivate 方法总是返回 false?

    我在登录后对用户进行基本身份验证 但发生了奇怪的行为 canActivate 返回 false 即使它是在正确的时间调用的 in 登录组件 private login this authService login this loginFor
  • 加载目录中的所有图像

    我的目录中有某些图像 我想加载所有这些图像来进行一些处理 我尝试使用load功能 imagefiles dir F SIFT Yantao demo data jpg nfiles length imagefiles Number of f
  • 单一资源的 Rails 嵌套路由

    我在单一资源上有一个嵌套路线 map resource account controller gt users do page page resources feeds end 我正在尝试制作一个表单来添加提要 我从这个开始 undefin
  • 一个 EC2 实例下的多个 WordPress 多站点 (AWS)

    我们正在尝试为一个 EC2 实例下的多站点配置 DNS 路由 具体来说 我们正在设置 WordPress 多站点的开发 测试和 UAT 环境 我们在这个网络上只有 2 个站点 主站点和一个网站 现在 我已成功将生产站点 在不同的 EC2 实
  • 在 Qt GUI 事件线程中检测到“我正在运行”

    我有这个功能来更新一些 GUI 的东西 void SavedConnections renderList Do GUI stuff Must run in Qt thread 我需要确保该函数不会从其他线程调用 我打算做的是将其推迟到事件循
  • Firebase 规则:如何阻止匿名访问?

    阅读 Firebase 规则文档 https firebase google com docs storage security 我找不到任何有关如何阻止匿名访问特定集合或文档的信息 换句话说 我想阻止未登录的用户 也想阻止以匿名身份登录的
  • 如何在反射中迭代列表

    我有一个名为 Students 的属性 其类型为List
  • 如何在 SBCL/Common Lisp 中与进程输入/输出交互

    我有一个文本文件 每行一个句子 我想使用 hunspell s 选项 对每行中的世界进行词形还原 由于我想分别获得每行的引理 因此将整个文本文件提交给 hunspell 是没有意义的 我确实需要一行接一行地发送 并为每一行提供 hunspe