Sorting

The :std/sort library provides sorting facilities using Olin's withdrawn SRFI-32 implementation.

To use the bindings from this module:

(import :std/sort)

sort

(sort seq less?) -> sequence

  seq   := list or vector
  less? := comparison procedure

Sorts a sequence (a list or vector) and returns a new sorted sequence, using the less? procedure to compare elements. The procedure uses merge sort for lists and heap sort for vectors, which does not produce a stable sort.

Examples:

> (sort [2 5 1] <)
(1 2 5)

sort!

(sort! seq less?) -> sequence

  seq   := list or vector
  less? := comparison procedure

Like sort, but the procedure is allowed to reuse/modify the original sequence to produce its output.

stable-sort

(stable-sort seq less?) -> sequence

  seq   := list or vector
  less? := comparison procedure

Like sort, but it uses merge sort for vectors as well, which produces a stable sort.

stable-sort!

(stable-sort! seq less?) -> sequence

  seq   := list or vector
  less? := comparison procedure

Like stable-sort, but the procedure is allowed to reuse/modify the original sequence to produce its output.

Symbolic Comparisons

Often times there is a need to sort using symbolic comparisons. The :std/misc/symbol library implements caching versions of symbolic comparisons using the string representation.

To use the bindings from this module:

(import :std/misc/symbol)

symbol<?

(symbol<? x y) -> bool

  x,y := symbol

Compares two symbols' string representation using string<?. The string representation is globally cached.

symbol<=?

Similar to symbol<?, using string<=?

symbol>=?

Similar to symbol<?, using string>=?

symbol>?

Similar to symbol<?, using string>?

compare-symbol<?

(compare-symbol<? (mx? #f)) -> lambda (symbol symbol) -> bool

  mx? := bool; use a mutex to protect the cache

Create a locally scoped caching symbol<?-like comparison with its own cache.

compare-symbol<=?

Similar to compare-symbol<? using string<=?.

compare-symbol>=?

Similar to compare-symbol<? using string>=?.

compare-symbol>?

Similar to compare-symbol<? using string>?.

keyword<?

(keyword<? x y) -> bool

  x,y := keyword

Compares two keywords' string representation using string<?. The string representation is globally cached.

keyword<=?

Similar to keyword<?, using string<=?

keyword>=?

Similar to keyword<?, using string>=?

keyword>?

Similar to keyword<?, using string>?

compare-keyword<?

(compare-keyword<? (mx? #f)) -> lambda (keyword keyword) -> bool

  mx? := bool; use a mutex to protect the cache

Create a locally scoped caching keyword<?-like comparison with its own cache.

compare-keyword<=?

Similar to compare-keyword<? using string<=?.

compare-keyword>=?

Similar to compare-keyword<? using string>=?.

compare-keyword>?

Similar to compare-keyword<? using string>?.

compare-symbolic

(compare-symbolic string-e cmp-e mx?) -> lambda (symbol symbol) -> bool

  string-e := lambda (obj) -> string
  cmp-e := lambda (symbol symbol) -> bool
  mx?   := bool; use a mutex to protect the cache

Create a generic caching symbolic comparison function.

For instance:

symbol<? == (compare-symbolic symbol->string string? #t)