Scheme 球拍-最简洁的方式做清单的理解?

Scheme 球拍-最简洁的方式做清单的理解?,scheme,racket,Scheme,Racket,我有一些代码,可以在当前目录中查找最近修改的特定类型的文件(见下文)。我的问题是:是否有一种更简洁、也许更惯用的方式来表达这段代码?想法相当简单:获取目录中某一类型的所有文件,然后从中选择最近修改过的文件。我尝试了一种类型为的cwd路径变体,它使用了*/list的,看起来可读性较差。我觉得我错过了什么。谁能启发我 #lang racket (define FILETYPE ".pdf") (define (cwd-paths-of-type filetype) (filter (

我有一些代码,可以在当前目录中查找最近修改的特定类型的文件(见下文)。我的问题是:是否有一种更简洁、也许更惯用的方式来表达这段代码?想法相当简单:获取目录中某一类型的所有文件,然后从中选择最近修改过的文件。我尝试了一种类型为的
cwd路径变体,它使用了*/list
,看起来可读性较差。我觉得我错过了什么。谁能启发我

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

这是编写最后一个mod路径的另一种方法,不使用map、filter和apply,而是一种迭代方法。也就是说,不必两次使用这些函数

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

一些球拍功能可能会对您有所帮助,并且:

请注意,
filename extension
的结果是a,但如果必须使用字符串,则很容易转换

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

argmax
是我一直在寻找的,我想!谢谢<代码>文件扩展名
也很有用。我正在寻找一个名为
文件名后缀
的函数。