在IronScheme中将字符串追加到现有文本文件中

3
我们正在尝试使用IronScheme构建日志文件,并使用racket编写了一段代码。在 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 文件中。如果我们不使用可选参数,会抛出一个错误,说文件已经存在。


它会抛出什么错误? - ben rudgers
参数数量不匹配。它不期望“exists”参数。 - Robert
这并不奇怪,因为Scheme标准没有为 with-output-to-file 指定任何关键字参数。 - ben rudgers
2个回答

1
IronScheme支持R6RS :)
在with-output-to-file中不支持file-options,因此您需要使用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)

谢谢你的回答!自那以后,我们已经找到了一个解决方法,现在我们覆盖一切并在读取时以不同的方式处理它。 - Robert
@Robert:仍在调查中。上面的代码是错误的。 - leppie
1
哇!感谢您如此迅速地解决了这个问题 :) - Robert
1
@Robert:我努力在24小时内提供支持 :D - leppie

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)

这是一个简单的方法,可能会让你接近你想要的内容。


谢谢你的回答!不幸的是,这段代码总是会尝试创建一个新文件,如果文件已经存在,它就会抛出一个错误。(i/o-file-already-exists) - Robert
1
@Robert 如果我的示例代码在现有文件中抛出错误,那么问题可能仅仅是Iron Scheme的非标准性质。 - ben rudgers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接