Binary search (upper bound) added by sytse on Tue Dec 10 09:28:59 2019

(put-appl 'char-set-contains? '(cset char) '\#ignore
  (lambda (cset ch)
    (unless (kernel-char-set? cset)
      (signal 'kernel-type-error (list 'char-set? cset)))
    (unless (kernel-char? ch)
      (signal 'kernel-type-error (list 'char? ch)))
    (setq cset (cddr cset))
    (setq ch (cdr ch))
    (if (eq cset [])
        '\#f
      ;; An 'upper bound' algorithm: find the location of
      ;; the first number that's bigger than ch.
      (let ((beg 0)
            (rem (length cset)))
        (while (> rem 0)
          (let* ((step   (/ rem 2))
                 (middle (+ beg step)))
            (if (<= (aref cset middle) ch)
                (setq beg (1+ middle)
                      rem (- rem (1+ step)))
              (setq rem step))))
        (if (eq (% beg 2) 0) '\#f '\#t)))))