cadena-anexar a archivos en un directorio con Scheme

Antes que nada, tenga en cuenta que esta es una pregunta de tarea, por lo que no estoy buscando un código directo ni nada de eso, solo alguien que tal vez me ayude con mi lógica.

La tarea está en DrRacket. La pregunta pregunta:

Dado un sistema de archivos, que hemos definido como una estructura con dos campos, nombre y contenido, donde el contenido es una lista de directorios o archivos; escriba una función que cree un nombre de archivo ".bak" para cada archivo en el directorio y lo coloque inmediatamente después del archivo.

Estoy totalmente perdido. Mi lógica es la siguiente: si lo primero en la lista de contenido es un archivo, simplemente rehaga el directorio con ese archivo y un nuevo archivo con ".bak" adjunto. Esto es lo más lejos que puedo llegar: no veo cómo resolver las cosas si hay un subdirectorio, O cómo avanzar más abajo en la lista.

Aquí está mi código atroz:

(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)))]))

¿Alguien puede ayudarme a razonar esto?

preguntado el 08 de noviembre de 11 a las 17:11

¡Gracias por editar! ¡Tendré que aprender a hacerlo yo mismo correctamente! -

Creo que deberíamos comenzar con un ejemplo de un sistema de archivos válido de acuerdo con las reglas de las instrucciones. ¿Puede proporcionar uno que muestre algunos archivos y subdirectorios? -

Tengo problemas con el retorno de carro ... ¿Al presionar Enter, se publica automáticamente la edición / comentario? -

@MarkSoric: presione shift-enter para hacer una nueva línea. -

2 Respuestas

La Certificación de Catequista de contents parte de tu FileSystem es una lista que contiene archivos o directorios (que son listas que contienen ....).

Este es un problema básico de cruce de árboles en el que tiene tres casos, como señaló:

  1. la lista esta vacía
  2. el primer elemento de la lista es un archivo
  3. el primer elemento de la lista es un directorio

Entonces necesitas una acción para cada caso:

  1. hecho
  2. mantenga ese nombre de archivo, cree un nuevo nombre de archivo y continúe procesando el resto de la lista
  3. mantener ese directorio, volver a leerlo y continuar procesando el resto de la lista

Por ejemplo:

(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

respondido 08 nov., 11:21

En principio, entiendo lo que quiero hacer. Es la sintaxis de rehacer un directorio completo con nuevos archivos lo que me deprime. - Mark Soric

@MarkSoric: eso es lo que hace este código. Mira las acciones para (file? ...) y (dir? ...) - la recursividad naturalmente se encarga de rehacer un directorio completo. - Matt Fenwick

Extraño ... Tenía algo muy similar en cuanto al código cuando probé el problema por primera vez y no funcionó; ¡obviamente tuve un pequeño cambio que hizo que lo que tenía fuera inútil! - Mark Soric

Creo que mi problema es este: puedo hacer lo que hiciste en una lista, es cuando tengo que crear la misma estructura de directorio que estoy fallando. - Mark Soric

@MarkSoric - la recursividad natural se encarga de preservar la estructura del directorio - vea el caso de dir?? Se repite no solo en el resto de la lista, sino Además, en el primer elemento de la lista. Y luego devuelve los resultados en los mismos lugares exactos. Si necesita un recurso para entender la recursividad, le sugiero ccs.neu.edu/home/matthias/BTLS - el pequeño intrigante. - Matt Fenwick

Necesita aclarar la definición de sus datos. Usted escribe:

"Dado un sistema de archivos, que hemos definido como una estructura con dos campos, nombre y contenido, donde el contenido es una lista de directorios o archivos; escriba una función que cree un nombre de archivo" .bak "para cada archivo en el directorio y colóquelo inmediatamente después del archivo ".

Esto deja en claro qué es un sistema de archivos ... si sabe qué son "directorios" y "archivos". Debe aclarar esto escribiendo definiciones de datos para "directorio" y "archivo". Cada uno de estos debe ser una oración separada. Pueden ser realmente simples, por ejemplo, "Un archivo se representa como una cadena".

Después de hacer esto, escriba algunos ejemplos de FileSystems.

respondido 08 nov., 11:21

Un sistema de archivos es en realidad solo un directorio. Tiene la misma estructura y utilizo los mismos constructores para crearlo. Quiero dar un ejemplo de un FS y un archivo, ¡pero no puedo presionar Enter sin publicar mi comentario! - Mark Soric

Bien, parece que tienes algunos ejemplos. A continuación, necesita algunos casos de prueba. Aquí hay una especie de momento de "parto" en el que no puedes entender por qué los casos de prueba son necesarios y, de repente, te das cuenta de que los casos de prueba contienen la solución. - John Clements

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.