diff --git a/pkgs/racket-doc/scribblings/reference/contracts.scrbl b/pkgs/racket-doc/scribblings/reference/contracts.scrbl index d4c6ad9dab..ce4671ae86 100644 --- a/pkgs/racket-doc/scribblings/reference/contracts.scrbl +++ b/pkgs/racket-doc/scribblings/reference/contracts.scrbl @@ -253,6 +253,12 @@ An alias for @racket[between/c].} Returns a flat contract that requires the input to be an exact integer between @racket[j] and @racket[k], inclusive.} +@defproc[(char-in [a char?] [b char?]) flat-contract?]{ + +Returns a flat contract that requires the input to be a character whose +code point number is between the code point numbers of @racket[a] and +@racket[b], inclusive.} + @defthing[natural-number/c flat-contract?]{ diff --git a/pkgs/racket-test/tests/racket/contract/flat-contracts.rkt b/pkgs/racket-test/tests/racket/contract/flat-contracts.rkt index bcf8f95ccb..178a91c6ea 100644 --- a/pkgs/racket-test/tests/racket/contract/flat-contracts.rkt +++ b/pkgs/racket-test/tests/racket/contract/flat-contracts.rkt @@ -41,6 +41,10 @@ (test-flat-contract '(integer-in 0 10) 10 3/2) (test-flat-contract '(integer-in 0 10) 1 1.0) (test-flat-contract '(integer-in 1 1) 1 1.0) + (test-flat-contract '(char-in #\a #\z) #\a #\Z) + (test-flat-contract '(char-in #\a #\z) #\z #\A) + (test-flat-contract '(char-in #\a #\z) #\b "b") + (test-flat-contract '(char-in #\a #\a) #\a #\b) (test-flat-contract '(real-in 1 10) 3/2 20) (test-flat-contract '(string-len/c 3) "ab" "abc") (test-flat-contract 'natural-number/c 5 -1) diff --git a/racket/collects/racket/contract/private/misc.rkt b/racket/collects/racket/contract/private/misc.rkt index 5cf3d9eedc..11a357e9a2 100644 --- a/racket/collects/racket/contract/private/misc.rkt +++ b/racket/collects/racket/contract/private/misc.rkt @@ -17,6 +17,7 @@ not/c =/c >=/c <=/c /c between/c integer-in + char-in real-in natural-number/c string-len/c @@ -550,6 +551,16 @@ (and/c start exact?) (integer-in-ctc start end))) +(define (char-in a b) + (check-two-args 'char-in a b char? char?) + (let* ([x (char->integer a)] + [y (char->integer b)] + [ctc (integer-in x y)]) + (flat-named-contract + `(char-in ,a ,b) + (λ (c) (and (char? c) + (ctc (char->integer c))))))) + (define/final-prop (real-in start end) (check-two-args 'real-in start end real? real?) (make-real-in-s start end))