scheme - scheme/racket/中的文件路径

标签 scheme lisp racket filepath

(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/

相关文章:

scheme - Racket "eval"一个数据

recursion - 递归地编码近似序列。 DrRacket,方案

lisp - 这个 xkcd 代码有什么作用?

variables - Scheme 中的未绑定(bind)变量

scheme - 为什么 DrRacket 似乎将此识别为尾调用?

c - 在 Racket 中,我可以在调用另一个函数后导出函数吗?

scheme - 我需要帮助解决方案表达式

function - 如何在方案中重新创建申请

function - 方案/ Racket : Fold with booleans

list - 方案/ Racket 中的功能和列表