строка-добавление к файлам в каталоге со схемой - PullRequest
4 голосов
/ 08 ноября 2011

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

Задание в DrRacket,Вопрос задается следующим образом:

Имеется файловая система, которую мы определили как структуру с двумя полями, именем и содержимым, где содержимое представляет собой список каталогов или файлов;напишите функцию, которая создаст имя файла «.bak» для каждого файла в каталоге, и поместите его сразу после файла.

Я полностью потерян.Моя логика такова: если первым в списке содержимого является файл, просто переделайте каталог с этим файлом и добавьте новый файл с добавлением «.bak».Это насколько я могу понять - я не понимаю, как все устроить, если есть подкаталог ИЛИ как двигаться дальше вниз по списку.

Вот мой зверский код:

(define (backup my-fs)
   (cond
     [(empty? (dir-contents my-fs)) empty]
     [(file? (first (dir-contents my-fs))) (make-dir (dir-name my-fs) (append      (backup-list (first (dir-contents my-fs)))(rest (dir-contents my-fs))))]
     [(dir? (first (dir-contents my-fs))) (backup (first (dir-contents my-fs)))]))

Может кто-нибудь помочь мне объяснить это?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

contents часть вашего FileSystem представляет собой список, содержащий файлы или каталоги (которые содержат списки, содержащие ....).

Это основная проблема обхода дерева, когда у вас есть три случая, как вы заметили:

  1. список пуст
  2. первый элемент в списке - это файл
  3. первый элемент в списке - это каталог

Затем вам нужно действие для каждого случая:

  1. done
  2. сохранить это имя файла, создать новое имя файла и продолжить обработку остальной части списка
  3. сохраните этот каталог, вернувшись к нему, и продолжите обработку остальной части списка

Например:

(define (traverse contents)
  (cond
    [(empty? contents) ... nothing to do ...]
    [(file? (first contents))              ;; if the first element's a file:
      (cons (first contents)               ;;   keep the file
       (cons (... make backup filename ... (first contents))  ;; make the backup
        (traverse (rest contents))))]      ;;   and recurse on the rest
    [(dir? (first contents)                ;; if the first element's a directory:
      (cons (traverse (first contents))    ;;   recurse on the first
            (traverse (rest contents)))])) ;;   and also recurse on the rest
1 голос
/ 08 ноября 2011

Вам необходимо уточнить определение данных. Вы пишете:

"Для заданной файловой системы, которую мы определили как структуру с двумя полями, именем и содержимым, где содержимое - это список каталогов или файлов; напишите функцию, которая создаст имя файла" .bak "для каждого файла. в каталоге и поместите его сразу после файла. "

Это проясняет, что такое файловая система ... если вы знаете, что такое "каталоги" и "файлы". Вы должны уточнить это, написав определения данных для «каталога» и «файла». Каждое из них должно быть отдельным предложением. Они могут быть очень простыми, например Msgstr "Файл представлен в виде строки".

После этого напишите несколько примеров файловых систем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...