2014-01-16 3 views
3

현재 디렉토리에서 특정 유형의 가장 최근에 수정 된 파일을 찾는 코드가 있습니다 (아래 참조). 내 질문은 : 더 간결하고, 아마도 더 관용적 인 라켓이 코드를 표현하는 방법이 있을까요? 아이디어는 매우 간단합니다. 특정 유형의 모든 파일을 디렉토리에서 가져 와서 가장 최근에 수정 한 파일을 선택하십시오. for*/list을 사용하여 cwd-paths-of-type 변형을 시도한 결과 읽기가 어려워 보였습니다. 나는 뭔가를 놓친 것 같은 기분이야. 누구나 나를 계몽시킬 수 있습니까?라켓 - 목록 간략화를위한 가장 간결한 방법은 무엇입니까?

#lang racket 

(define FILETYPE ".pdf") 

(define (cwd-paths-of-type filetype) 
    (filter 
    (lambda (p) 
     (define filename (path->string p)) 
     (and 
     (>= (string-length filename) 4) 
     (string=? 
      (substring filename (- (string-length filename) 4)) 
      filetype))) 
    (directory-list))) 

(define (last-mod-path paths) 
    (define last-mod-time 
    (apply 
     max 
     (map file-or-directory-modify-seconds paths))) 
    (first 
    (filter 
     (lambda (p) 
     (equal? 
      (file-or-directory-modify-seconds p) 
      last-mod-time)) 
     paths))) 

(displayln 
    (last-mod-path (cwd-paths-of-type FILETYPE))) 

답변

7

커플 filename-extensionargmax : filename-extension의 결과가 byte string이지만, 당신이 문자열을 사용해야하는 경우 변환이 용이하다는

참고.

(define FILETYPE #"pdf") 

(define (cwd-paths-of-type filetype) 
    (filter 
    (λ (p) 
    (define ext (filename-extension p)) 
    (and ext (bytes=? ext filetype))) 
    (directory-list))) 

(define (last-mod-path paths) (argmax file-or-directory-modify-seconds paths)) 

(displayln (last-mod-path (cwd-paths-of-type FILETYPE))) 
+0

argmax는 내가 찾고있는 것입니다. 감사. 'filename-extension'도 도움이됩니다. 나는'filename-suffix'와 같은 이름의 함수를 찾고있었습니다. – Yawar

0

이것은지도 및 필터를 사용하지 않고 last-mod-path를 작성하는 또 다른 방법이지만 적용 방법은 반복적입니다. 이러한 기능을 두 번 사용하지 않아도됩니다. 라켓 기능이 여기에 당신을 도울 수

(define (last-mod-path paths) 
    (if (null? (cdr paths)) (car paths) 
    (if (> (file-or-directory-modify-seconds (car paths)) 
      (file-or-directory-modify-seconds (last-mod-path (cdr paths)))) 
     (car paths) 
     (last-mod-path (cdr paths))))) 
관련 문제