123456789101112131415161718192021222324252627282930313233343536 |
- ;;; The sort package -- sorted predicates
- ;;; Olin Shivers 10/98.
- ;;;
- ;;; (list-sorted? < lis) -> boolean
- ;;; (vector-sorted? < v [start end]) -> boolean
- (define (list-sorted? < list)
- (or (not (pair? list))
- (let lp ((prev (car list)) (tail (cdr list)))
- (or (not (pair? tail))
- (let ((next (car tail)))
- (and (not (< next prev))
- (lp next (cdr tail))))))))
- (define (vector-sorted? elt< v . maybe-start+end)
- (call-with-values
- (lambda () (vector-start+end v maybe-start+end))
- (lambda (start end)
- (or (>= start end) ; Empty range
- (let lp ((i (+ start 1)) (vi-1 (vector-ref v start)))
- (or (>= i end)
- (let ((vi (vector-ref v i)))
- (and (not (elt< vi vi-1))
- (lp (+ i 1) vi)))))))))
- ;;; Copyright and porting non-notices
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; Give me a break. It's fifteen lines of code. I place this code in the
- ;;; public domain; help yourself.
- ;;;
- ;;; If your Scheme has a faster mechanism for handling optional arguments
- ;;; (e.g., Chez), you should definitely port over to it. Note that argument
- ;;; defaulting and error-checking are interleaved -- you don't have to
- ;;; error-check defaulted START/END args to see if they are fixnums that are
- ;;; legal vector indices for the corresponding vector, etc.
|