【问题标题】:Append string to existing textfile in IronScheme将字符串附加到 Iron Scheme 中的现有文本文件
【发布时间】:2015-08-04 06:56:41
【问题描述】:

我们正在尝试使用 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 文件中。如果我们不使用可选参数,则会抛出一个错误,说明文件已经存在。

【问题讨论】:

  • 它会抛出什么错误?
  • Arity 不匹配。它不期望“存在”论点
  • 这并不奇怪,因为 Scheme 标准没有为 with-output-to-file 指定任何关键字参数。

标签: file scheme append r6rs ironscheme


【解决方案1】:

据我了解 IronScheme 基于 R5RS。来自R5RS Documentation

对于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 如果我的示例代码对现有文件抛出错误,那么问题可能只是 Iron Scheme 的非标准性质。
【解决方案2】:

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 的行为应该像附加,如果有的话。我会进行更多调查并提供反馈。

更新 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:我努力在 24 小时内提供支持:D
猜你喜欢
  • 2023-01-11
  • 2014-02-25
  • 2011-12-27
  • 2011-03-08
  • 1970-01-01
  • 2014-11-18
  • 2016-03-07
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多