Add a char-in flat contract

This commit is contained in:
Alexis King 2015-05-08 12:48:55 -07:00 committed by Robby Findler
parent 7d434d266e
commit aa4c57bf9a
3 changed files with 21 additions and 0 deletions

View File

@ -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?]{

View File

@ -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)

View File

@ -17,6 +17,7 @@
not/c
=/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))