(define-struct directory (name contents))
;A directory is a (make-directory String (list-of files)
;A file is one of:
; a * String (containing the name of the file; non-empty and does not contain
"/"
;* a Directory
我想做的是一个将目录和文件名作为字符串使用的函数。然后该函数应生成文件路径,每个文件或目录以“/”分隔。
示例目录:
(define a1 (make-directory "a1" (list "a1.pdf" "a1q1.rkt" "a1q2.rkt" "a1q3.rkt")))
(define a2 (make-directory "a2" (list "a2.pdf")))
(define assns (make-directory "assns" (list a1 a2)))
(define labs (make-directory "labs" (list "lab01.pdf" "lab02.pdf")))
(define final (make-directory "final" empty))
(define cs115 (make-directory "cs115" (list assns labs final "style.pdf" "survivial.pdf")))
例如
(path cs115 "a2.pdf")
应该产生
"cs115/assns/a2/a2.pdf"
我目前拥有的:
(define (find dir name)
(cond
[(string=? (directory-name dir) name) name]
[(member? name (directory-contents dir))
(string-append (directory-name dir) "/" name)]
[(cons? (directory-contents dir))
(content-list (directory-name dir)(directory-contents dir) name)]
))
(define (content-list dir-name dir-list name)
(cond
[(empty? dir-list)
(content-list dir-name (rest dir-list) name)]
[(equal? (first dir-list) name)
(string-append dir-name "/" (first dir-list))]
[(directory? (first dir-list))
(find (first dir-list) name)]
[else (content-list dir-name (rest dir-list) name)]
))
问候, 山姆
最佳答案
这会找到所需名称的文件,并使用您提供的示例通过测试。
#lang racket/base
(require racket/match
racket/string
rackunit)
(struct directory (name ;string?
contents)) ;(listof (or/c string? directory?))
(define a1 (directory "a1" (list "a1.pdf" "a1q1.rkt" "a1q2.rkt" "a1q3.rkt")))
(define a2 (directory "a2" (list "a2.pdf")))
(define assns (directory "assns" (list a1 a2)))
(define labs (directory "labs" (list "lab01.pdf" "lab02.pdf")))
(define final (directory "final" '()))
(define cs115 (directory "cs115" (list assns labs final "style.pdf" "survivial.pdf")))
;; path-to : directory? string? -> (or/c string? #f)
(define (path-to dir desired-filename)
(let loop ([dirnames (list (directory-name dir))]
[contents (directory-contents dir)])
(for/or ([x (in-list contents)])
(match x
[(directory dirname contents) (loop (cons dirname dirnames) contents)]
[(and fn (== desired-filename)) (string-join (reverse (cons fn dirnames)) "/")]
[_ #f]))))
(check-equal? (path-to cs115 "a2.pdf")
"cs115/assns/a2/a2.pdf")
关于scheme - scheme/racket/中的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31503947/