在IronScheme中向现有的文本文件追加字符串



我们正在尝试使用IronScheme构建一个日志文件,并且我们已经使用racket编写了一个代码。它在球拍中工作得很好,但是IronScheme抛出一个错误。这是我们目前得到的:

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

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

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

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 "~arn" whatToWrite)
  (close-port p))

更新:

上面的不能工作。看起来你可能在IronScheme中发现了一个bug。这是不清楚的,虽然从R6RS什么file-options应该表现得像追加,如果有的话。我将进一步调查并提供反馈。

更新2:

我曾与R6RS的一位编辑交谈过,它似乎没有一种可移植的方式来指定"追加模式"。当然,我们在。net中有这个功能,所以我将通过添加另一个file-options来修复这个问题。我还会考虑为"简单io"过程添加一些重载来处理这个问题,因为使用上面的代码相当乏味。谢谢你发现这个问题!

更新3:

我已经解决了这个问题。从TFS版本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)

我理解IronScheme是基于R5RS的。来自R5RS文档:

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

因此抛出一个错误肯定是符合规范的,并且不应该期望球拍代码的可移植性。

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

如果您只是想在R5RS中添加一个现有文件:

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

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

最新更新