;; Generate a less than or equal predicate from the ;; enumeration-order. If p is the generated predicate, ;; (p x y) is true if and only if (selector x) comes before ;; (or at the same position) as (selector y) in the ;; enumeration-order. Thus, (selector x) is assumed to give a ;; value in enumeration-order. Comparison with elements in the ;; enumeration-list is done with eq? (define (generate-leq enumeration-order selector) (lambda (x y) ; x and y supposed to be elements in enumeration order (let ((x-index (list-index (selector x) enumeration-order)) (y-index (list-index (selector y) enumeration-order))) (<= x-index y-index)))) ; A helping function of generate-leq. ; Return the position of e in lst. First is 1 ; compare with eq? ; if e is not member of lst return (+ 1 (length lst)) (define (list-index e lst) (cond ((null? lst) 1) ((eq? (car lst) e) 1) (else (+ 1 (list-index e (cdr lst))))))