From d4527d23dc4ce2c3af3e41144bf0bc2d595700a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Nieper-Wi=C3=9Fkirchen?= Date: Sat, 2 May 2020 21:05:19 +0200 Subject: [PATCH] Implement SRFI 162. --- lib/srfi/125/test.sld | 7 --- lib/srfi/128.sld | 14 +++++- lib/srfi/128/162-impl.scm | 93 +++++++++++++++++++++++++++++++++++++++ lib/srfi/128/test.sld | 26 ++++++++--- 4 files changed, 124 insertions(+), 16 deletions(-) create mode 100644 lib/srfi/128/162-impl.scm diff --git a/lib/srfi/125/test.sld b/lib/srfi/125/test.sld index 3265f243..6cba1d2e 100644 --- a/lib/srfi/125/test.sld +++ b/lib/srfi/125/test.sld @@ -5,15 +5,8 @@ (chibi test)) (begin (define (run-tests) - (define default-comparator (make-default-comparator)) (define number-comparator (make-comparator real? = < (lambda (x . o) (exact (abs (round x)))))) - (define string-comparator - (make-comparator string? string=? string? <=? >=? ;;Syntax: - comparator-if<=>) - (include "128/comparators.scm")) + comparator-if<=> + ;;SRFI 162: + comparator-max comparator-min + comparator-max-in-list comparator-min-in-list + default-comparator boolean-comparator real-comparator + char-comparator char-ci-comparator + string-comparator string-ci-comparator + list-comparator vector-comparator + eq-comparator eqv-comparator equal-comparator) + (include "128/comparators.scm") + (include "128/162-impl.scm") + ) diff --git a/lib/srfi/128/162-impl.scm b/lib/srfi/128/162-impl.scm new file mode 100644 index 00000000..5244eaae --- /dev/null +++ b/lib/srfi/128/162-impl.scm @@ -0,0 +1,93 @@ +(define (comparator-max-in-list comp list) + (let ((< (comparator-ordering-predicate comp))) + (let loop ((max (car list)) (list (cdr list))) + (if (null? list) + max + (if (< max (car list)) + (loop (car list) (cdr list)) + (loop max (cdr list))))))) + +(define (comparator-min-in-list comp list) + (let ((< (comparator-ordering-predicate comp))) + (let loop ((min (car list)) (list (cdr list))) + (if (null? list) + min + (if (< min (car list)) + (loop min (cdr list)) + (loop (car list) (cdr list))))))) + +(define (comparator-max comp . args) + (comparator-max-in-list comp args)) + +(define (comparator-min comp . args) + (comparator-min-in-list comp args)) + +#; +(define default-comparator ;Defined in comparators.scm + (make-default-comparator)) + +(define boolean-comparator + (make-comparator + boolean? + boolean=? + (lambda (x y) (and (not x) y)) + boolean-hash)) + +(define real-comparator + (make-comparator + real? + = + < + number-hash)) + +(define char-comparator + (make-comparator + char? + char=? + charinteger c))))) + +(define char-ci-comparator + (make-comparator + char? + char-ci=? + char-ciinteger (char-downcase c)))))) + +(define string-comparator + (make-comparator + string? + string=? + string