2016-07-21 5 views
0

Мне нужно написать числовой список в файл и поместить return в конец строки.LISP - написать список в файл

Я пробовал с этим кодом, но работал только для первого элемента списка.

(defun write-segment (filename segment) 
    (cond ((null segment) 
     (with-open-file (out filename 
           :direction :output 
           :if-exists :append 
           :if-does-not-exist :create) 
      (format out "~%"))) 
     (T (with-open-file (out filename 
           :direction :output 
           :if-exists :append 
           :if-does-not-exist :create) 
      (format out "~D " (first segment)) 
      (write-segment filename (cdr segment)))))) 

Некоторые из них могут помочь мне решить эту проблему?

+2

Ваш код нечитабельно - исправьте углубление. – sds

+3

Вы открываете файл для каждого элемента списка. Это чудовищно неэффективно. – sds

ответ

0

Из описания и код, я не уверен на 100%, если следующее подходит то, что вы после этого, но я буду стараться в любом случае. Код в этом фрагменте идет список числовых значений и записывает их в выходной файл:

(defun write-numeric-list(filename l) 
    (with-open-file (out filename :direction :output :if-exists :append :if-does-not-exist :create) 
    (dolist (segment l) 
     (format out "~D " segment)) 
    (format out "~%"))) 

Пример вызова:

(write-numeric-list "output.txt" (list 1 2 -42)) 

Этот код открывает выходной файл только один раз для всего списка, а один раз для каждого элемента списка, как в исходной версии. Вы можете настроить параметры :if-exists и :if-does-not-exist в зависимости от предусловий в вашей конкретной ситуации.

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

(defun write-numeric-list(filename l) 
    (with-open-file (out filename :direction :output :if-exists :append :if-does-not-exist :create) 
    (format out "~{~D ~}~%" l))) 
+0

Для дополнительного значения hack, управление форматом может быть '' ~ {~ D ~^~} ~% "' – tfb

-1

Кажется, что вы хотите сделать это рекурсивным. Я хотел бы сделать это так, то

(defun write-segment (filename segment) 
    (labels 
     ((do-write (out segment) 
     (cond ((null segment) (format out "~%")) 
       (t (format out "~D " (car segment)) 
        (do-write out (cdr segment)))))) 
    (with-open-file (out filename 
        :direction :output 
        :if-exists :append 
        :if-does-not-exist :create) 
    (do-write out segment)))) 
+0

Стек переполнения. –

+0

добавление к существующему файлу. –

2

насчет из Добавив% в поток, как это:

(with-open-file (str "filename.txt" 
        :direction :output 
        :if-exists :supersede 
        :if-does-not-exist :create) 
    (format str "~A~%" '(1 2 3 4 5))) 

В вашем случае я буду делать что-то вроде идти througth списка и записи в поток , что-то вроде этого, будьте осторожны с дополнительным возвратом, также вы можете добавить элемент управления, прежде чем открывать файл, если yuo не хочет ничего делать, если список пуст.

(defun write-non-empty-list-to-a-file (file-name lst) 
    "writes a non empty list to a file if the list is empty creates the file with a return" 
    (with-open-file (str file-name 
        :direction :output 
        :if-exists :supersede 
        :if-does-not-exist :create) 
    (dolist (e lst) 
     (format str "~A~%" e)) 
    (format str "~%")));this if you want an extra return 
+0

Или, может быть, '(format str" ~ {~ A ~% ~} ~% "lst)' – coredump

Смежные вопросы