Re: Sorted indexes and (string<?) in Jade

Subject: Re: Sorted indexes and (string<?) in Jade
From: Heiko Kirschke <Heiko.Kirschke@xxxxxxx>
Date: Tue, 15 Sep 1998 12:16:59 +0200
  > From: Toby Speight <Toby.Speight@xxxxxxxxxxxxxx>
  > Date: 15 Sep 1998 10:50:27 +0100
  > 
  > Jade doesn't support the string<? primitive, nor any of the related
  > functions.  I was hoping to use this to sort an index I've created, and
  > so I'd be interested to hear what other people use as a workaround.

My first idea was to work character by character on the strings to
compare, using the (char-property numeric-equiv: ...) [8.5.8.7,
8.5.8.1] for a numeric comparision between the `code' of both
characters. Unfortuately, jade returns always #f on char-property.

So, I wrote a function which returns the ASCII code of a character
(and ignoring the fact that jade uses Unicode internally)-: This I've
used to do character-by-character comparisions; these
character-by-character comparisions in turn I've used to define string
comparisions. The code uses some functions from the DSSSL procedure
library.

;; ======================================================================
;; 1998/09/09 HK: character encoding functions
(define default-character-numeric-equiv
  '((#\  . 32) (#\! . 33) (#\" . 34) (#\# . 35) (#\$ . 36)
    (#\% . 37) (#\& . 38) (#\' . 39) (#\( . 40) (#\) . 41)
    (#\* . 42) (#\+ . 43) (#\, . 44) (#\- . 45) (#\. . 46)
    (#\/ . 47) (#\0 . 48) (#\1 . 49) (#\2 . 50) (#\3 . 51)
    (#\4 . 52) (#\5 . 53) (#\6 . 54) (#\7 . 55) (#\8 . 56)
    (#\9 . 57) (#\: . 58) (#\; . 59) (#\< . 60) (#\= . 61)
    (#\> . 62) (#\? . 63) (#\@ . 64) (#\A . 65) (#\B . 66)
    (#\C . 67) (#\D . 68) (#\E . 69) (#\F . 70) (#\G . 71)
    (#\H . 72) (#\I . 73) (#\J . 74) (#\K . 75) (#\L . 76)
    (#\M . 77) (#\N . 78) (#\O . 79) (#\P . 80) (#\Q . 81)
    (#\R . 82) (#\S . 83) (#\T . 84) (#\U . 85) (#\V . 86)
    (#\W . 87) (#\X . 88) (#\Y . 89) (#\Z . 90) (#\[ . 91)
    (#\\ . 92) (#\] . 93) (#\^ . 94) (#\_ . 95) (#\` . 96)
    (#\a . 97) (#\b . 98) (#\c . 99) (#\d . 100) (#\e . 101)
    (#\f . 102) (#\g . 103) (#\h . 104) (#\i . 105) (#\j . 106)
    (#\k . 107) (#\l . 108) (#\m . 109) (#\n . 110) (#\o . 111)
    (#\p . 112) (#\q . 113) (#\r . 114) (#\s . 115) (#\t . 116)
    (#\u . 117) (#\v . 118) (#\w . 119) (#\x . 120) (#\y . 121)
    (#\z . 122) (#\{ . 123) (#\| . 124) (#\} . 125) (#\~ . 126)))

(define (char-property-numeric-equiv char)
  (let ((pair (assoc char default-character-numeric-equiv)))
    (if pair (cdr pair)	#f)))

;; ======================================================================
;; 1998/09/09 HK: character comparision functions

(define (char-less? char-1 char-2)
  (< (char-property-numeric-equiv char-1)
     (char-property-numeric-equiv char-2)))

(define (char-less-equal? char-1 char-2)
  (not (char-greater? char-1 char-2)))

(define (char-greater? char-1 char-2)
  (> (char-property-numeric-equiv char-1)
     (char-property-numeric-equiv char-2)))

(define (char-greater-equal? char-1 char-2)
  (not (char-less? char-1 char-2)))

(define (char-ci-less? char-1 char-2)
  (< (char-property-numeric-equiv (case-fold-down-char char-1))
     (char-property-numeric-equiv (case-fold-down-char char-2))))

(define (char-ci-less-equal? char-1 char-2)
  (not (char-ci-greater? char-1 char-2)))

(define (char-ci-greater? char-1 char-2)
  (> (char-property-numeric-equiv (case-fold-down-char char-1))
     (char-property-numeric-equiv (case-fold-down-char char-2))))

(define (char-ci-greater-equal? char-1 char-2)
  (not (char-ci-less? char-1 char-2)))

;; ======================================================================
;; 1998/09/09 HK: string comparision functions

(define (string-less? string-1 string-2)
  (let ((string-length-1 (string-length string-1))
	(string-length-2 (string-length string-2)))
    (let loop ((i 0))
      (cond
       ((>= i string-length-1)
	#t)
       ((>= i string-length-2)
	#f)
       ((char=? (string-ref string-1 i) (string-ref string-2 i))
	(loop (+ i 1)))
       (#t
	(char-less? (string-ref string-1 i) (string-ref string-2 i)))))))

(define (string-less-equal? string-1 string-2)
  (not (string-greater? string-1 string-2)))

(define (string-greater? string-1 string-2)
  (let ((string-length-1 (string-length string-1))
	(string-length-2 (string-length string-2)))
    (let loop ((i 0))
      (cond
       ((>= i string-length-1)
	#f)
       ((>= i string-length-2)
	#t)
       ((char=? (string-ref string-1 i) (string-ref string-2 i))
	(loop (+ i 1)))
       (#t
	(char-greater? (string-ref string-1 i) (string-ref string-2 i)))))))
       
(define (string-greater-equal? string-1 string-2)
  (not (string-less? string-1 string-2)))

(define (string-ci-less? string-1 string-2)
  (let ((string-length-1 (string-length string-1))
	(string-length-2 (string-length string-2)))
    (let loop ((i 0))
      (cond
       ((>= i string-length-1)
	#t)
       ((>= i string-length-2)
	#f)
       ((char=? (case-fold-down-char (string-ref string-1 i))
		(case-fold-down-char (string-ref string-2 i)))
	(loop (+ i 1)))
       (#t
	(char-ci-less? (string-ref string-1 i) (string-ref string-2 i)))))))

(define (string-ci-less-equal? string-1 string-2)
  (not (string-ci-greater? string-1 string-2)))

(define (string-ci-greater? string-1 string-2)
  (let ((string-length-1 (string-length string-1))
	(string-length-2 (string-length string-2)))
    (let loop ((i 0))
      (cond
       ((>= i string-length-1)
	#f)
       ((>= i string-length-2)
	#t)
       ((char=? (case-fold-down-char (string-ref string-1 i))
		(case-fold-down-char (string-ref string-2 i)))
	(loop (+ i 1)))
       (#t
	(char-ci-greater? (string-ref string-1 i) (string-ref string-2 i)))))))

(define (string-ci-greater-equal? string-1 string-2)
  (not (string-ci-less? string-1 string-2)))

  > I know it's a lot of work to build a collation engine (even simply
  > using the Unicode collation algorithm; more if it must support
  > (define-language) in the future), but does anyone have plans to
  > implement such a thing?

I'd like to ask that question urgently, too.

-- 
Viele Gruesse, Heiko


 DSSSList info and archive:  http://www.mulberrytech.com/dsssl/dssslist


Current Thread
  • Sorted indexes and (string<?) in Jade
    • Toby Speight - from mail1.ability.netby web4-1.ability.net (8.8.5/8.6.12) with ESMTP id FAA21400Tue, 15 Sep 1998 05:44:32 -0400 (EDT)
      • Heiko Kirschke - from mail1.ability.netby web4-1.ability.net (8.8.5/8.6.12) with ESMTP id GAA21929Tue, 15 Sep 1998 06:11:04 -0400 (EDT) <=
        • Toby Speight - from mail1.ability.netby web4-1.ability.net (8.8.5/8.6.12) with ESMTP id GAA23924Tue, 15 Sep 1998 06:56:37 -0400 (EDT)
          • Matthias Clasen - from mail1.ability.netby web4-1.ability.net (8.8.5/8.6.12) with ESMTP id HAA24258Tue, 15 Sep 1998 07:15:03 -0400 (EDT)
      • Matthias Clasen - from mail1.ability.netby web4-1.ability.net (8.8.5/8.6.12) with ESMTP id HAA24498Tue, 15 Sep 1998 07:25:09 -0400 (EDT)
        • Steve Tinney - from mail1.ability.netby web4-1.ability.net (8.8.5/8.6.12) with ESMTP id KAA28239Tue, 15 Sep 1998 10:03:53 -0400 (EDT)