У меня есть функция, которая принимает список, а затем запрашивает у пользователя имя файла. этот список должен быть записан в путь по умолчанию, сохраненный как имя файла

Что-то вроде (псевдокод):

(define storeme
  (lambda (lst)  
    (write-list lst filename default-path)))

Не знаю, как заставить это работать. "write" принимает только 2 аргумента для объекта записи & [output-port]. Благодарность

0
GeorgeCostanza 7 Апр 2014 в 19:11
1
Ищите open-file-output-port (или друзей)
 – 
leppie
7 Апр 2014 в 19:16

2 ответа

Лучший ответ

Вы должны привязать выходной порт к переменной

Что-то типа

(define storeme
 (lambda (lst)
   (let* ((filename (prompt-for-filename)) ;;the prompt routine should retrun #f
          (output                           ;for invalid filenames or user cancellations
            (open-file-output-port ;;routine may vary be implementation and scheme revision
               (string-append *default-path* filename))))
    (begin (if filename 
               (begin (write lst output) (display-each "List Stored in " filename))
               (display "List not stored"))
           (close-output-port output)))))
0
WorBlux 7 Апр 2014 в 20:58

Вам нужен полный путь откуда-то, предположим, что он у вас есть. Определите свою функцию как:

(define store-me-at
  (lambda (lst path)
    (with-output-to-file path (lambda () (write lst)))))

При использовании with-output-to-file current-output-port устанавливается за вас, поэтому write не требует аргумента port.

Выполнение этого с помощью with-output-to-file гарантирует, что port, открытый для path, всегда будет закрыт, даже если есть нелокальный выход (или другие тонкости, связанные с call/cc и связанным с ним использованием ). Если вы просто используете open-output-file, а затем close-ouput-port, вы не получите такой гарантии.

1
GoZoner 7 Апр 2014 в 21:39