我们正在尝试使用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-options
在with-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
应该表现得像追加,如果有的话。我将进一步调查并提供反馈。
我曾与R6RS的一位编辑交谈过,它似乎没有一种可移植的方式来指定"追加模式"。当然,我们在。net中有这个功能,所以我将通过添加另一个file-options
来修复这个问题。我还会考虑为"简单io"过程添加一些重载来处理这个问题,因为使用上面的代码相当乏味。谢谢你发现这个问题!
我已经解决了这个问题。从TFS版本114008开始,append
被添加到file-options
。此外,with-output-to-file
、call-with-output-file
和open-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)
是一个简单的方法,可以让你接近你想要的。