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 に答える