1

我是 Scheme 的新手,今天我遇到了以下我无法解决的问题。对于代表文件系统的树的节点,我有以下表示:

(directory_name content) 用于目录
file_name 用于文件
(directory_name null) 用于空目录

例如, ("etc/" (("network/" ("interfaces")))) 是路径 etc/network/interfaces 的树。

我要做的是编写一个函数,该函数将这种树和目录/文件名作为参数,并返回它的路径(如果有的话)。如果目录/文件不存在,则返回#f。

例如:

(define tree '("/"
               (("etc/" ("network/" ("interfaces")))
                ("root/" null))))

假设函数的名称是 get-path,通过运行 (get-path tree "interfaces") 它将输出 "/etc/network/interfaces"。

我想要的只是一个想法,如果你能给我一个,我将不胜感激。

4

1 回答 1

0

这里给你一个答案。我对目录/文件使用符号而不是字符串,并稍微更改了树格式。

(define tree '(root (etc (passwd) (profile)) (usr (bin) (lib))))

(define (get-path tree name)
  (define (reverse-if l) (and l (reverse l)))
  (reverse-if
   (let descending ((tree tree) (path '()))
     (and (not (null? tree))
          (let ((root (car tree))
                (subs (cdr tree)))
            (if (eq? root name)
                (cons root path)
                (let looking ((subs subs))
                  (and (not (null? subs))
                       (or (descending (car subs) (cons root path))
                           (looking (cdr subs)))))))))))

有一些结果:

> (get-path tree 'etc)
(root etc)
> (get-path tree 'bin)
(root usr bin)
> (get-path tree 'profile)
(root etc profile)
> (get-path tree 'foo)
#f
>
于 2013-03-14T23:12:11.083 回答