首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Schwartzian变换的Lisp版本

Schwartzian变换的Lisp版本
EN

Code Review用户
提问于 2016-08-11 11:32:43
回答 2查看 944关注 0票数 14

施瓦茨想出后来我们称之为施瓦茨变换的东西时,他剽窃了Lisp的装饰类--取消装饰的成语。我所有的Lisp知识在九个半辈子都消失了,但我在SBCL上试了一试。我的目标是一个惯用的例子,我可以用在介绍施瓦茨变换的历史。

这是可行的(我知道我可以进一步推广它),但我想知道Lisp-y是如何实现的:

代码语言:javascript
复制
(require :sb-posix)
(defun schwartzian-files-mtime ( glob-pattern )
    (map
        'list
        #'cdr
        (stable-sort
            (map
                'list (
                    lambda (x) (
                        cons
                            (sb-posix:stat-mtime (sb-posix:stat x))
                            x
                        )
                    )
                (directory glob-pattern)
            )
            #'<
            :key
            #'car
        )
    )
)

(schwartzian-files-mtime "/etc/*")
EN

回答 2

Code Review用户

回答已采纳

发布于 2016-08-11 13:01:01

函数中没有足够的LISP是用于括号的样式(它们不应该单独作为一行的最后一个元素保留,它们应该放在所括形式的最后一行上)。另一个次要的问题是,您可以使用较短的mapcar而不是map 'list

下面是您的函数的一个版本(对于应用于数据和任何谓词的任何函数),它遵循在Common中使用的更传统的样式。

代码语言:javascript
复制
(defun schwartzian-transform (list costly-function predicate)
"sort a list of objects over the value of a function applied to them,
by applying the Schwartzian Transform (https://en.wikipedia.org/wiki/Schwartzian_transform)
the parameters are the list, the function, and the predicate for the sort." 
  (mapcar #'cdr
          (stable-sort (mapcar (lambda (x)
                                 (cons (funcall costly-function x) x))
                               list)
                       predicate
                       :key #'car)))

(require :sb-posix)
(schwartzian-transform
 (directory "/etc/*")
 (lambda (x) (sb-posix:stat-mtime (sb-posix:stat x)))
 #'<=)
票数 16
EN

Code Review用户

发布于 2016-08-11 18:30:48

当然,非常非语言性的是你的开头父母结束了这样的代码行。有了它,mapcar和显式#'lambda前面,它看起来就像

代码语言:javascript
复制
(defun schwartzian-files-mtime ( glob-pattern )
    (mapcar #'cdr
        (stable-sort
            (mapcar #'(lambda (x) 
                        (cons (sb-posix:stat-mtime (sb-posix:stat x))
                              x))
                    (directory glob-pattern))
            #'<
            :key #'car)))

这在我看来是很自然的,但可能仍然不存在。官方风格指南。它有一种“快速-n-脏”的感觉,就像你会当场涂鸦的东西(不像Randal的原始代码),也不是带有文档字符串的适当的生产代码等等。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/138428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档