3

我们正在尝试使用 IronScheme 构建一个日志文件,并且我们已经使用球拍为其编写了代码。它在球拍中运行良好,但 IronScheme 会引发错误。这是我们目前所拥有的:

(define write-to-log
(lambda(whatToWrite)
(with-output-to-file "robot-log.txt"
(lambda () (printf (string-append whatToWrite "\r\n" ))) #:exists 'append)))

看看我们在使用 with-output-to-file 时如何使用“exists”可选参数。我们不确定如何使此可选参数与 IronScheme 一起使用。有什么方法可以让这个工作,或替代方法?

请注意,我们希望将字符串附加到现有的 .txt 文件中。如果我们不使用可选参数,则会抛出一个错误,说明文件已经存在。

4

2 回答 2

1

IronScheme 支持 R6RS :)

file-options不可用with-output-to-file,所以你需要使用open-file-output-port

示例(不正确):

(let ((p (open-file-output-port "robot-log.txt" (file-options no-create))))
  (fprintf p "~a\r\n" whatToWrite)
  (close-port p))

更新:

以上将不起作用。看来您可能在 IronScheme 中发现了一个错误。虽然从 R6RS 中不清楚什么file-options应该表现得像附加,如果有的话。我将进行更多调查并提供反馈。

更新 2:

我已经与 R6RS 的一位编辑交谈过,它似乎没有一种可移植的方式来指定“附加模式”。我们当然可以在 .NET 中使用此功能,因此我将通过添加另一个file-options用于附加来解决此问题。我还会考虑为“简单 io”过程添加一些重载来处理这个问题,因为使用上面的代码相当乏味。感谢您发现问题!

更新 3:

我已经解决了这个问题。从 TFS rev 114008 开始,append已添加到file-options. 此外,with-output-to-filecall-with-output-fileopen-output-file一个额外的可选参数来指示“附加模式”。您可以从http://build.ironscheme.net/获取最新版本。

例子:

(with-output-to-file "test.txt" (lambda () (displayln "world")) #t)
于 2015-05-23T17:09:53.777 回答
0

据我了解 IronScheme 基于 R5RS。来自R5RS 文档

对于with-output-to-file,如果文件已存在,则未指定效果。

所以抛出错误肯定是符合规范的,不应期望 Racket 代码的可移植性。

警告:此代码在不同的 R5RS 实现上运行,而不是 IronScheme

如果您只想追加到 R5RS 中的现有文件:

(define my-file (open-output-file "robotlog.txt"))
(display (string-append what-to-write "\r\n") my-file)
(close-output-port my-file)

是一种简单的方法,可以让你接近你想要的。

于 2015-05-23T00:27:34.130 回答