From d40c22be251a04e0f173965b4ba5ef3d270899a6 Mon Sep 17 00:00:00 2001 From: Jakub Jankiewicz Date: Mon, 5 Feb 2024 16:54:44 +0100 Subject: [PATCH] add R7RS `string<...>?` and `string-ci<...>?` functions #298 --- CHANGELOG.md | 2 +- dist/std.min.scm | 12 +++++ dist/std.scm | 120 +++++++++++++++++++++++++++++++++++++++++++++++ dist/std.xcb | Bin 110142 -> 111919 bytes lib/R7RS.scm | 120 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 253 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2febbe3e..9ea364eb 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ * add `continuations?` function * add `iterator->array` function * add immutable strings as in R7RS spec [#285](https://github.com/jcubic/lips/issues/285) -* add R7RS compatible `char<...>?` functions [#298](https://github.com/jcubic/lips/issues/298) +* add R7RS `char<...>?` and `string<...>?` functions [#298](https://github.com/jcubic/lips/issues/298) * improve syntax-rule exception message (appending macro code) ### Bugfix * fix `let-values` to allow binding to list [#281](https://github.com/jcubic/lips/issues/281) diff --git a/dist/std.min.scm b/dist/std.min.scm index 02c6695c..caf88b6b 100644 --- a/dist/std.min.scm +++ b/dist/std.min.scm @@ -340,6 +340,18 @@ (define (char-ci>? . chars) "(char-ci (%char-ci-vector-cmp "char-civector chars)) (every (lambda (a) (= a 1))))) (define (char-ci<=? . chars) "(char-ci (%char-ci-vector-cmp "char-civector chars)) (every (lambda (a) (< a 1))))) (define (char-ci>=? . chars) "(char-ci (%char-ci-vector-cmp "char-civector chars)) (every (lambda (a) (> a -1))))) +(define (%string-vector-cmp name strings) "(%string-cmp name chars)\u000A\u000AFunction that compares each pair of strings from vector chars and a vector\u000Aof numbers. 0 if they are equal, -1 if it is smaller and 1 if is larger.\u000AThe function compares the codepoints of the character." (let* ((len (vector-length strings)) (max (- len 1)) (result (vector)) (i 0)) (while (< i max) (let* ((str1 (vector-ref strings i)) (j (+ i 1)) (str2 (vector-ref strings j))) (typecheck name str1 "string" i) (typecheck name str2 "string" j) (result.push (--> str1 (cmp str2)))) (set! i (+ i 1))) result)) +(define (string=? . strings) "(string=? string1 string2 ...)\u000A\u000AChecks if all strings are equal." (--> (%string-vector-cmp "string=?" (list->vector strings)) (every (lambda (a) (= a 0))))) +(define (string (%string-vector-cmp "stringvector strings)) (every (lambda (a) (= a -1))))) +(define (string>? . strings) "(string (%string-vector-cmp "string>?" (list->vector strings)) (every (lambda (a) (= a 1))))) +(define (string<=? . strings) "(string (%string-vector-cmp "string<=?" (list->vector strings)) (every (lambda (a) (< a 1))))) +(define (string>=? . strings) "(string (%string-vector-cmp "string>=?" (list->vector strings)) (every (lambda (a) (> a -1))))) +(define (%string-ci-vector-cmp name strings) "(%string-ci-cmp name strings)\u000A\u000AFunction that compares each pair from vector of strings ignoring case and\u000Areturns array of numbers 0 if they are equal, -1 if it is smaller and 1 if is larger.\u000AThe function compares the codepoints of the character." (%string-vector-cmp name (--> strings (map string-downcase)))) +(define (string-ci=? . strings) "(string-ci=? string1 string2 ...)\u000A\u000AChecks if all strings are equal, ignoring the case." (--> (%string-ci-vector-cmp "string-ci=?" (list->vector strings)) (every (lambda (a) (= a 0))))) +(define (string-ci (%string-ci-vector-cmp "string-civector strings)) (every (lambda (a) (= a -1))))) +(define (string-ci>? . strings) "(string-ci>? string1 string2 ...)\u000A\u000AReturns true if strings are monotonically decreasing, ignoring the case" (--> (%string-ci-vector-cmp "string-ci>?" (list->vector strings)) (every (lambda (a) (= a 1))))) +(define (string-ci<=? . strings) "(string-ci<=? string1 string2 ...)\u000A\u000AReturns true if strings are monotonically non-decreasing, ignoring the case." (--> (%string-ci-vector-cmp "string-ci<=?" (list->vector strings)) (every (lambda (a) (< a 1))))) +(define (string-ci>=? . strings) "(string-ci>=? string1 string2 ...)\u000A\u000AReturns true if strings are monotonically non-increasing, ignoring the case." (--> (%string-ci-vector-cmp "string-ci<=?" (list->vector strings)) (every (lambda (a) (> a -1))))) (define make-bytevector make-u8vector) (define bytevector u8vector) (define bytevector? u8vector?) diff --git a/dist/std.scm b/dist/std.scm index 23468d14..d900d055 100644 --- a/dist/std.scm +++ b/dist/std.scm @@ -4461,6 +4461,126 @@ (--> (%char-ci-vector-cmp "char-civector chars)) (every (lambda (a) (> a -1))))) +;; ----------------------------------------------------------------------------- +(define (%string-vector-cmp name strings) + "(%string-cmp name chars) + + Function that compares each pair of strings from vector chars and a vector + of numbers. 0 if they are equal, -1 if it is smaller and 1 if is larger. + The function compares the codepoints of the character." + (let* ((len (vector-length strings)) + (max (- len 1)) + (result (vector)) + (i 0)) + (while (< i max) + (let* ((str1 (vector-ref strings i)) + (j (+ i 1)) + (str2 (vector-ref strings j))) + (typecheck name str1 "string" i) + (typecheck name str2 "string" j) + (result.push (--> str1 (cmp str2)))) + (set! i (+ i 1))) + result)) + +;; ----------------------------------------------------------------------------- +(define (string=? . strings) + "(string=? string1 string2 ...) + + Checks if all strings are equal." + (--> (%string-vector-cmp "string=?" (list->vector strings)) + (every (lambda (a) + (= a 0))))) + +;; ----------------------------------------------------------------------------- +(define (string (%string-vector-cmp "stringvector strings)) + (every (lambda (a) + (= a -1))))) + +;; ----------------------------------------------------------------------------- +(define (string>? . strings) + "(string (%string-vector-cmp "string>?" (list->vector strings)) + (every (lambda (a) + (= a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string<=? . strings) + "(string (%string-vector-cmp "string<=?" (list->vector strings)) + (every (lambda (a) + (< a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string>=? . strings) + "(string (%string-vector-cmp "string>=?" (list->vector strings)) + (every (lambda (a) + (> a -1))))) + +;; ----------------------------------------------------------------------------- +(define (%string-ci-vector-cmp name strings) + "(%string-ci-cmp name strings) + + Function that compares each pair from vector of strings ignoring case and + returns array of numbers 0 if they are equal, -1 if it is smaller and 1 if is larger. + The function compares the codepoints of the character." + (%string-vector-cmp name (--> strings (map string-downcase)))) + +;; ----------------------------------------------------------------------------- +(define (string-ci=? . strings) + "(string-ci=? string1 string2 ...) + + Checks if all strings are equal, ignoring the case." + (--> (%string-ci-vector-cmp "string-ci=?" (list->vector strings)) + (every (lambda (a) + (= a 0))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci (%string-ci-vector-cmp "string-civector strings)) + (every (lambda (a) + (= a -1))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci>? . strings) + "(string-ci>? string1 string2 ...) + + Returns true if strings are monotonically decreasing, ignoring the case" + (--> (%string-ci-vector-cmp "string-ci>?" (list->vector strings)) + (every (lambda (a) + (= a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci<=? . strings) + "(string-ci<=? string1 string2 ...) + + Returns true if strings are monotonically non-decreasing, ignoring the case." + (--> (%string-ci-vector-cmp "string-ci<=?" (list->vector strings)) + (every (lambda (a) + (< a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci>=? . strings) + "(string-ci>=? string1 string2 ...) + + Returns true if strings are monotonically non-increasing, ignoring the case." + (--> (%string-ci-vector-cmp "string-ci<=?" (list->vector strings)) + (every (lambda (a) + (> a -1))))) + ;; ----------------------------------------------------------------------------- (define make-bytevector make-u8vector) (define bytevector u8vector) diff --git a/dist/std.xcb b/dist/std.xcb index 7623e61c5b10a0482477bb16f1542de001a4648a..26a7a94bd5e5e922bb0d3631c17c9ef530515fdd 100644 GIT binary patch delta 19018 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 delta 17214 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 E2NE (%char-ci-vector-cmp "char-civector chars)) (every (lambda (a) (> a -1))))) +;; ----------------------------------------------------------------------------- +(define (%string-vector-cmp name strings) + "(%string-cmp name chars) + + Function that compares each pair of strings from vector chars and a vector + of numbers. 0 if they are equal, -1 if it is smaller and 1 if is larger. + The function compares the codepoints of the character." + (let* ((len (vector-length strings)) + (max (- len 1)) + (result (vector)) + (i 0)) + (while (< i max) + (let* ((str1 (vector-ref strings i)) + (j (+ i 1)) + (str2 (vector-ref strings j))) + (typecheck name str1 "string" i) + (typecheck name str2 "string" j) + (result.push (--> str1 (cmp str2)))) + (set! i (+ i 1))) + result)) + +;; ----------------------------------------------------------------------------- +(define (string=? . strings) + "(string=? string1 string2 ...) + + Checks if all strings are equal." + (--> (%string-vector-cmp "string=?" (list->vector strings)) + (every (lambda (a) + (= a 0))))) + +;; ----------------------------------------------------------------------------- +(define (string (%string-vector-cmp "stringvector strings)) + (every (lambda (a) + (= a -1))))) + +;; ----------------------------------------------------------------------------- +(define (string>? . strings) + "(string (%string-vector-cmp "string>?" (list->vector strings)) + (every (lambda (a) + (= a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string<=? . strings) + "(string (%string-vector-cmp "string<=?" (list->vector strings)) + (every (lambda (a) + (< a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string>=? . strings) + "(string (%string-vector-cmp "string>=?" (list->vector strings)) + (every (lambda (a) + (> a -1))))) + +;; ----------------------------------------------------------------------------- +(define (%string-ci-vector-cmp name strings) + "(%string-ci-cmp name strings) + + Function that compares each pair from vector of strings ignoring case and + returns array of numbers 0 if they are equal, -1 if it is smaller and 1 if is larger. + The function compares the codepoints of the character." + (%string-vector-cmp name (--> strings (map string-downcase)))) + +;; ----------------------------------------------------------------------------- +(define (string-ci=? . strings) + "(string-ci=? string1 string2 ...) + + Checks if all strings are equal, ignoring the case." + (--> (%string-ci-vector-cmp "string-ci=?" (list->vector strings)) + (every (lambda (a) + (= a 0))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci (%string-ci-vector-cmp "string-civector strings)) + (every (lambda (a) + (= a -1))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci>? . strings) + "(string-ci>? string1 string2 ...) + + Returns true if strings are monotonically decreasing, ignoring the case" + (--> (%string-ci-vector-cmp "string-ci>?" (list->vector strings)) + (every (lambda (a) + (= a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci<=? . strings) + "(string-ci<=? string1 string2 ...) + + Returns true if strings are monotonically non-decreasing, ignoring the case." + (--> (%string-ci-vector-cmp "string-ci<=?" (list->vector strings)) + (every (lambda (a) + (< a 1))))) + +;; ----------------------------------------------------------------------------- +(define (string-ci>=? . strings) + "(string-ci>=? string1 string2 ...) + + Returns true if strings are monotonically non-increasing, ignoring the case." + (--> (%string-ci-vector-cmp "string-ci<=?" (list->vector strings)) + (every (lambda (a) + (> a -1))))) + ;; ----------------------------------------------------------------------------- (define make-bytevector make-u8vector) (define bytevector u8vector)