Добавить строку в существующий текстовый файл в IronScheme

Мы пытаемся создать файл журнала с помощью IronScheme и написали для него код с помощью рэкета. В рэкете работает нормально, а IronScheme выдает ошибку. Это то, что мы имеем до сих пор:

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

Посмотрите, как мы используем необязательный параметр «exists» при использовании with-output-to-file. Мы не знаем, как заставить этот необязательный параметр работать с IronScheme. Есть ли способы заставить это работать или альтернативные методы?

Обратите внимание, что мы хотели бы добавить строку к существующему файлу .txt. Если мы не используем необязательный аргумент, выдается ошибка о том, что файл уже существует.


person Robert    schedule 22.05.2015    source источник
comment
Какую ошибку выдает?   -  person ben rudgers    schedule 23.05.2015
comment
Несоответствие арности. Он не ожидает аргумента exists   -  person Robert    schedule 23.05.2015
comment
Неудивительно, поскольку стандарт Scheme не определяет никаких аргументов ключевого слова для with-output-to-file.   -  person ben rudgers    schedule 23.05.2015


Ответы (2)


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. Однако из R6RS неясно, что file-options должно вести себя как добавление, если оно вообще есть. Я буду исследовать больше и дам обратную связь.

Обновление 2:

Я разговаривал с одним из редакторов R6RS, и, похоже, у него нет портативного способа указать «режим добавления». У нас, конечно, это доступно в .NET, поэтому я исправлю проблему, добавив еще один file-options для добавления. Я также подумаю о добавлении некоторых перегрузок для процедур «простого ввода-вывода», чтобы справиться с этим, поскольку использование приведенного выше кода довольно утомительно. Спасибо, что заметили проблему!

Обновление 3:

Я обратился к этому вопросу. Начиная с версии 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)
person leppie    schedule 23.05.2015
comment
Спасибо за ответ! С тех пор мы нашли обходной путь, теперь мы перезаписываем все и обрабатываем это по-другому при чтении. - person Robert; 25.05.2015
comment
@Robert: Все еще расследую. Приведенный выше код неверен. - person leppie; 25.05.2015
comment
Ух ты! Спасибо, что так быстро решили проблему :) - person Robert; 28.05.2015
comment
@Robert: я стараюсь оказывать поддержку в течение 24 часов :D - person leppie; 28.05.2015

Насколько я понимаю, 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)

Это простой подход, который может приблизить вас к тому, что вы хотите.

person ben rudgers    schedule 23.05.2015
comment
Спасибо за ответ! К сожалению, этот код всегда будет пытаться создать новый файл, и если файл существует, он выдает ошибку. (i/o-файл-уже-существует) - person Robert; 23.05.2015
comment
@Robert Если мой пример кода выдает ошибку с существующим файлом, проблема может быть просто в нестандартном характере Iron Scheme. - person ben rudgers; 23.05.2015