将字符串附加到 Iron Scheme 中的现有文本文件

Append string to existing textfile in IronScheme

我们正在尝试使用 IronScheme 构建一个日志文件,并且我们已经使用 racket 为其编写了代码。它在球拍中运行良好,但 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 文件。如果我们不使用可选参数,则会抛出一个错误,指出该文件已经存在。

据我了解,IronScheme 是基于 R5RS 的。来自 R5RS Documentation:

for with-output-to-file, the effect is unspecified if the file already exists.

所以抛出一个错误当然是符合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)

是一种可能让您接近您想要的结果的简单方法。

IronScheme 支持 R6RS :)

file-optionswith-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 应该表现得像追加,如果有的话。我会进一步调查并提供反馈。

更新二:

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

更新 3:

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

示例:

(with-output-to-file "test.txt" (lambda () (displayln "world")) #t)