3

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 ファイルに文字列を追加したいことに注意してください。オプションの引数を使用しない場合、ファイルが既に存在するというエラーがスローされます。

4

2 に答える 2

1

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 "~a\r\n" whatToWrite)
  (close-port p))

アップデート:

上記は機能しません。IronScheme でバグを見つけたようです。file-optionsR6RS からは、append のように振る舞うべきものがあるとしても、明確ではありません。もう少し調査して、フィードバックを提供します。

更新 2:

R6RS の編集者の 1 人に話を聞いたところ、「追加モード」を指定する移植可能な方法がないようです。もちろん、これは .NET で利用できるので、追加file-options用に別のものを追加して問題を修正します。上記のコードを使用するのはかなり面倒なので、これに対処するために「単純な io」プロシージャにいくつかのオーバーロードを追加することも考えます。問題を見つけてくれてありがとう!

更新 3:

私はこの問題に対処しました。TFS rev 114008 から、appendに追加されましたfile-options。また、with-output-to-fileおよびcall-with-output-fileopen-output-fileは、「追加モード」を示す追加のオプション パラメータがあります。最新のビルドはhttp://build.ironscheme.net/から入手できます。

例:

(with-output-to-file "test.txt" (lambda () (displayln "world")) #t)
于 2015-05-23T17:09:53.777 に答える
0

IronScheme は R5RS に基づいていると理解しています。R5RSのドキュメントから:

forwith-output-to-fileの場合、ファイルが既に存在する場合の効果は規定されていません。

そのため、エラーをスローすることは、Racket コードの仕様と移植性に確実に一致するものではありません。

警告: このコードは、 IronScheme ではなく、別の R5RS 実装で実行されました

R5RS の既存のファイルに追加するだけの場合:

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

あなたが望むものにあなたを近づけるかもしれない単純なアプローチです.

于 2015-05-23T00:27:34.130 に答える