Filesystems 字符串附加到具有Scheme的目录中的文件

Filesystems 字符串附加到具有Scheme的目录中的文件,filesystems,scheme,tree-traversal,Filesystems,Scheme,Tree Traversal,请注意,首先,这是一个家庭作业问题,所以我不是在寻找直接的代码或类似的东西,只是希望有人可以帮助我的逻辑 作业正在进行中。问题是: 给定一个文件系统,我们将其定义为具有两个字段(名称和内容)的结构,其中内容是目录或文件的列表;编写一个函数,为目录中的每个文件创建一个“.bak”文件名,并将其放在文件后面 我完全迷路了。我的逻辑如下:如果内容列表中的第一件事是一个文件,只需使用该文件和附加了“.bak”的新文件重新生成目录。这是我所能做到的——如果有子目录,我看不出如何解决问题,也看不到如何进一步

请注意,首先,这是一个家庭作业问题,所以我不是在寻找直接的代码或类似的东西,只是希望有人可以帮助我的逻辑

作业正在进行中。问题是:

给定一个文件系统,我们将其定义为具有两个字段(名称和内容)的结构,其中内容是目录或文件的列表;编写一个函数,为目录中的每个文件创建一个“.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)))]))

有人能帮我解释一下吗?

您的
文件系统的
内容部分是一个包含文件或目录的列表(这些列表包含……)

这是一个基本的树遍历问题,您有三种情况,如您所述:

  • 列表为空
  • 列表中的第一个元素是文件
  • 列表中的第一个元素是目录
  • 然后,您需要针对每种情况采取行动:

  • 完成
  • 保留该文件名,创建新文件名,然后继续处理列表的其余部分
  • 保留该目录,在其上递归,并继续处理列表的其余部分
  • 例如:

    (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
    

    您需要澄清您的数据定义。你写道:

    “给定一个文件系统,我们将其定义为一个包含两个字段的结构,名称和内容,其中内容是目录或文件的列表;编写一个函数,为目录中的每个文件创建一个“.bak”文件名,并将其立即放在文件后面。”

    这清楚地说明了什么是文件系统。。。如果你知道什么是“目录”和“文件”。您需要通过编写“目录”和“文件”的数据定义来澄清这一点。每一个都应该是一个单独的句子。它们可能非常简单,例如“文件表示为字符串”


    完成此操作后,请编写一些文件系统示例。

    谢谢您的编辑!我必须学会如何正确地自己做!我认为我们应该根据说明中的规则从一个有效文件系统的示例开始。你能提供一个显示一些文件和子目录吗?我在回车时遇到了麻烦。。。按Enter键是否会自动发布编辑/评论?@MarkSoric--按shift Enter键可以换行。原则上,我知道我想做什么。这是用新文件重新创建一个完整目录的语法让我失望。@MarkSoric——这就是代码的作用。查看
    (文件?…)
    (目录?…)
    的操作——递归自然会重新创建整个目录。奇怪。。。当我第一次尝试这个问题的时候,我有一个非常类似的代码,但它不起作用-我显然有一个小小的改变,使我所拥有的变得无用!我想我的问题是:我可以做你在列表上做的事情,当我必须创建相同的目录结构时,我失败了。@MarkSoric--自然递归负责保存目录的结构--参见
    dir?
    ?它不仅在列表的其余部分递归,而且在列表的第一个元素上递归。然后将结果放回完全相同的位置。如果你需要一个资源来理解递归,我建议你——一个小小的Schemer。文件系统实际上只是一个目录。它具有相同的结构,我使用相同的构造函数来创建它。我想给出一个FS和一个文件的例子,但我不能在不发布我的评论的情况下按Enter键!好的,听起来你有一些例子。接下来,您需要一些测试用例。这里有一种“分娩”的时刻,你无法理解为什么测试用例是必要的,然后突然你意识到测试用例包含了解决方案。