我有一些代码可以在当前目录中找到特定类型的最近修改的文件(见下文)。我的问题是:是否有更简洁、也许更惯用 Racket 的方式来表达这段代码?这个想法相当简单:获取目录中某种类型的所有文件,然后从中选择最近修改的一个。我尝试了一个使用 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)))
最佳答案
一些 Racket 函数可能会在这里帮助您,filename-extension
和 argmax
:
注意 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)))
关于scheme - Racket - 最简洁的列表理解方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21153330/