eintr: Sorting
14.9.1 Sorting Lists
--------------------
Emacs contains a function to sort lists, called (as you might guess)
‘sort’. The ‘sort’ function takes two arguments, the list to be sorted,
and a predicate that determines whether the first of two list elements
is less than the second.
As we saw earlier (Using the Wrong Type Object as an Argument
Wrong Type of Argument.), a predicate is a function that determines
whether some property is true or false. The ‘sort’ function will
reorder a list according to whatever property the predicate uses; this
means that ‘sort’ can be used to sort non-numeric lists by non-numeric
criteria—it can, for example, alphabetize a list.
The ‘<’ function is used when sorting a numeric list. For example,
(sort '(4 8 21 17 33 7 21 7) '<)
produces this:
(4 7 7 8 17 21 21 33)
(Note that in this example, both the arguments are quoted so that the
symbols are not evaluated before being passed to ‘sort’ as arguments.)
Sorting the list returned by the ‘recursive-lengths-list-many-files’
function is straightforward; it uses the ‘<’ function:
(sort
(recursive-lengths-list-many-files
'("./lisp/macros.el"
"./lisp/mailalias.el"
"./lisp/makesum.el"))
'<)
which produces:
(29 32 38 85 90 95 178 180 181 218 263 283 321 324 480)
(Note that in this example, the first argument to ‘sort’ is not quoted,
since the expression must be evaluated so as to produce the list that is
passed to ‘sort’.)