scheme - Racket - 最简洁的列表理解方式?

标签 scheme racket

我有一些代码可以在当前目录中找到特定类型的最近修改的文件(见下文)。我的问题是:是否有更简洁、也许更惯用 Racket 的方式来表达这段代码?这个想法相当简单:获取目录中某种类型的所有文件,然后从中选择最近修改的一个。我尝试了一个使用 for*/listcwd-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-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)))

关于scheme - Racket - 最简洁的列表理解方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21153330/

相关文章:

functional-programming - 如何使用 2 个参数创建左折叠?

scheme - Racket:如何使用 foldr 编写 foldl

emacs - 使用 plt-r5rs 而不是 Racket 调用 Geiser?

lisp - 如何检测可以应用尾调用优化的函数?

lisp - Scheme中 `define`的返回值是多少?

lisp - 元循环评估器,实现环境

lisp - 需要 Scheme 程序来打印数字名称

scheme - Racket 累加器列表功能

module - 两个 Racket 模块碰撞

python - Racket 程序的代码可视化工具