chicken scheme - 我如何临时捕获发送到标准输出的数据

chicken scheme - how do i temporarily capture data sent to standard output

我有一个程序调用 (display "foo")

我想为它编写一个单元测试,以确认它向那里发送了正确的数据,但是 display 将其输入发送到标准输出:

(define (display x #!optional (port ##sys#standard-output))
  (##sys#check-output-port port #t 'display)
  (##sys#print x #f port) )

问题: 在其他语言中,我可能会将标准输出重新定义为仅写入变量的内容,然后在测试后将其重新设置。在 chicken 中这样做是正确的吗?如果是这样,如何?如果不是,那么正确的做法是什么?

注意:将其他内容作为第二个参数传递给显示不是一个选项,因为我必须更改我正在单元测试的方法才能这样做。

port 是可选的第二个参数,默认 到标准输出。

您可以执行以下两项操作之一将其发送到字符串。第一种方法是创建一个字符串端口并将其作为可选参数传递给 display,而不是标准输出端口:

(use ports)
(call-with-output-string
  (lambda (my-string-port)
    (display "foo" my-string-port)))

第二种是将当前输出端口临时绑定到一个字符串端口:

(use ports)
(with-output-to-string
  (lambda () (display "foo")))

第二种方法在调用不接受端口参数的过程时最有用,例如 print

您可以在 manual section about string ports 中找到它。