2014-01-16 21 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的另一種方式,不使用map和filter,而是使用迭代方法。無需兩次使用這些功能,也就是說。

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