如何在 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 中与进程输入/输出交互 的相关文章

  • 为什么函数 apply 会抱怨长列表?

    作为一些欧拉阵痛 http projecteuler net 我正在尝试编写一个埃拉托斯特尼筛法 https en wikipedia org wiki Sieve of Eratosthenes带有因式分解轮 到目前为止我的代码是 def
  • 学习一种 Lisp 有助于学习另一种 Lisp 吗?

    学习不同的 Lisp 语言之间有协同作用吗 我目前正在学习 Emacs Lisp 因为它在我的日常 Emacs 使用中立即有用 但是我对所有 Lisp 都很着迷 所以也许有一天我会学习和使用其他语言 当我开始深入研究 Common Lisp
  • Common Lisp 中的 comma-comma-at

    我对 comma comma at 的作用感到困惑 使用 comma comma at 的示例如下定义 Lisp 宏时是否需要使用双引号 双逗号 https stackoverflow com questions 17938242 is t
  • Common Lisp:编译与评估

    在带有 sbcl 的 Emacs Slime 上 一旦我在文件中定义了一个函数 或多个 我有两个选择 评估 例如与 C M x eval defun 汇编 例如使用 C c M k 编译文件 第二个也生成一个 fasl 文件 两者有何区别
  • Common Lisp 类型与类的区别

    在帖子中Common Lisp 类层次结构 https stackoverflow com questions 42514204 common lisp class hierarchy Rainer Joswig 和 Joshua Tayl
  • Lisp 多次格式化一个字符

    我正在寻找一种输出字符的方法 多次使用格式 这可能吗 有人可以填写吗 在里面 的 这样这个例子就可以工作了吗 let n 3 format nil 应该返回 gt 很高兴看到这么多解决方案 到目前为止 A 迭代结构提供了一个简洁的解决方案
  • Common LISP 和 Stack 中的数字类型边界在 GHCI 中流动

    第一个问题 Common LISP 和 Haskell 的新手 请友善 我在 Common LISP 中有一个函数 下面的代码 旨在判断三角形的面积是否是整数 整数 defun area int p a b c let s a b c 2
  • 更改列表的第 n 个元素

    我想更改列表的第 n 个元素并返回一个新列表 我想到了三个相当不优雅的解决方案 defun set nth1 list n value let list2 copy seq list setf elt list2 n value list2
  • 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
  • Jupyter 和 Common Lisp

    我正在尝试安装cl jupyter https github com fredokun cl jupyter common lisp 内核Jupyter http jupyter org 我无法让它工作 当我打开一个新的 lisp 笔记本
  • Common Lisp 中的属性列表是否引用某些全局状态?

    下面的代码有z作为局部变量 但它的行为就像全局变量一样 defun foo m let z stuff nil push m getf z stuff print z foo 1 foo 2 foo 3 我希望输出是 STUFF 1 STU
  • 如何在类Unix操作系统下方便的运行SBCL代码?

    David James 写了问题和答案 我将对其进行编辑以符合 Stackoverflow 标准 使用 SBCL 您可以将 Lisp 代码编译为机器代码 像 Java net C 甚至 C 一样 您将需要运行时 所以有两种方法来编译 Com
  • CLISP - 反转简单列表

    我必须反转简单 单维 列表的元素 我知道有一个内置的反向函数 但我不能用它来做这个 这是我的尝试 defun LISTREVERSE LISTR cond lt length LISTR 2 LISTR listr is 1 atom or
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • 宏扩展可以包含(声明...)表达式吗?

    Common Lisp Hyperspec 规定 宏形式不能扩展为声明 声明表达式必须显示为它们引用的形式的实际子表达式 我对 扩展到 的含义感到困惑 由于显而易见的原因 如下宏将不起作用 defmacro optimize fully d
  • 在Emacs中,这个错误是什么意思? “警告:运行时需要 cl 包”

    我正在字节编译一个模块 它给了我这个警告 Warning cl package required at runtime 为什么这是一个警告 我很清楚我正在使用cl包裹 事实上有一个 require cl 模块中的语句 使用有什么问题吗cl
  • 解决斐波那契数列的 Lisp 方法

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

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun

随机推荐

  • 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