lisp:捕获标准输出和标准错误,将其存储在单独的变量中

标签 lisp common-lisp sbcl

我有一个函数,它返回一个值并将数据打印到标准输出和标准错误。我无法修改此功能。我现在想执行此函数,捕获打印到 stdout 和 stderr 的数据,并将其存储在两个单独的变量中。如果可能,我还想将函数的返回值存储在第三个变量中。

我遇到了 (with-output-to-string (*standard-output*) ...) 但这不会让我同时捕获 stdout 和 stderr。我有哪些选择?

最佳答案

您可以只使用 let 将流绑定(bind)到输出字符串流。例如:

(defun print-stuff (x y)
  (format t "standard output ~a" x)
  (format *error-output* "error output ~a" y)
  (+ x y))

(defun capture (x y)
  (let ((*standard-output* (make-string-output-stream))
        (*error-output* (make-string-output-stream)))
    (values (print-stuff x y)
            (get-output-stream-string *standard-output*)
            (get-output-stream-string *error-output*))))


(capture 43 12)
; => 55
;    "standard output 43"
;    "error output 12"

关于lisp:捕获标准输出和标准错误,将其存储在单独的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35333715/

相关文章:

emacs - 在 Emacs 上同时运行 Clojure 和其他 Lisp

lisp - SBCL 多线程写入标准输出

common-lisp - Lisp 中如何判断文件类型

vector - 如何保护矢量不被调整大小?

linux - 在 Common Lisp 中使用外部库或包的例子

recursion - 不确定为什么 let 函数没有正确返回 sbcl lisp 中的值

lisp - Common Lisp 中的属性列表是否引用某些全局状态?

networking - 为什么我在 Racket 上的网络服务器不会多次接收数据?

在 lisp 中重构 "show-list"函数

clojure - Lisp 形式和 Lisp 表达式是一回事吗?