6.2.901.900
Predicates
These functions allow for easy construction of predicates - functions that take
an input and return a boolean - for use with contracts and filter variants. This
library makes it easy to define predicates in a point-free style, meaning that
you can construct new predicates in terms of old predicates without defining them as
functions with arguments.
source code: https://github.com/jackfirth/predicates
1 Logic Predicate Constructors
Combines each pred into a single predicate that returns #t for its
if all the original preds return #t for the input.
Examples: |
> (define small-positive-number? (and? number? (λ (x) (< 0 x 10)))) | | > (small-positive-number? 6) | #t | > (small-positive-number? 123) | #f | > (small-positive-number? 'foo) | #f |
|
Combines each pred into a single predicate that returns #t for its
input if any of the original preds return #t for the input.
Examples: |
> (define symbol-or-string? (or? symbol? string?)) | | > (symbol-or-string? 'symbol) | #t | > (symbol-or-string? "string") | #t | > (symbol-or-string? 123) | #f |
|
Returns a new predicate that returns #t for its input if the original
predicate returns #f for the input.
Examples: |
> (define nonzero? (not? zero?)) | | > (nonzero? 8) | #t | > (nonzero? 0) | #f | > (nonzero? -5) | #t |
|
Combines each pred into a single function that accepts any number of
arguments and returns #t if the first pred returns #t
for the first argument, and the second pred returns #t for the
second argument, and so on for each pred and each argument.
Examples: |
> (define number-and-string? (and?* number? string?)) | | > (number-and-string? 5 "foo") | #t | > (number-and-string? 5 'neither) | #f | > (number-and-string? 'neither "foo") | #f | > (number-and-string? 'neither 'neither) | #f |
|
Combines each
pred into a single function in a manner similar to
and?*, except the resulting function returns
#t if any of
the
preds return
#t for their argument.
Examples: |
> (define number-or-string? (or?* number? string?)) | | > (number-or-string? 5 "foo") | #t | > (number-or-string? 5 'neither) | #t | > (number-or-string? 'neither "foo") | #t | > (number-or-string? 'neither 'neither) | #f |
|
2 Comparison Predicate Constructors
Returns a predicate that returns
#t for any input that is
eq?
to
v.
Examples: |
> (define eq-foo? (eq?? 'foo)) | | > (eq-foo? 'foo) | #t | > (eq-foo? 8) | #f | > (eq-foo? 'bar) | #f |
|
Returns a predicate that returns
#t for any input that is
eqv?
to
v.
Examples: |
> (define eqv-7? (eqv?? 7)) | | > (eqv-7? 7) | #t | > (eqv-7? 8) | #f | > (eqv-7? 'foo) | #f |
|
Returns a predicate that returns
#t for any input that is
equal?
to
v.
Examples: |
> (define foo-bar-baz? (equal?? '(foo bar baz))) | | > (foo-bar-baz? '(foo bar baz)) | #t | > (foo-bar-baz? '(foo foo foo)) | #f | > (foo-bar-baz? 8) | #f |
|
Returns a predicate that returns
#t for any input that is
=
to
v.
Examples: |
> (define 7? (=? 7)) | | > (7? 7) | #t | > (7? (+ 3 4)) | #t | > (7? 0) | #f |
|
Returns a predicate that returns
#t for any real input that is
<
than
v.
Examples: |
> (define <10? (<? 10)) | | > (<10? 5) | #t | > (<10? 15) | #f | > (<10? -5) | #t |
|
Returns a predicate that returns
#t for any real input that is
>
than
v.
Examples: |
> (define >10? (>? 10)) | | > (>10? 15) | #t | > (>10? 5) | #f |
|
Returns a predicate that returns
#t for any real input that is
<=
to
v.
Examples: |
> (define <=10? (<=? 10)) | | > (<=10? 10) | #t | > (<=10? 5) | #t | > (<=10? 15) | #f | > (<=10? -5) | #t |
|
Returns a predicate that returns
#t for any real input that is
>=
to
v.
Examples: |
> (define >=10? (>=? 10)) | | > (>=10? 10) | #t | > (>=10? 15) | #t | > (>=10? 5) | #f |
|
3 List Predicates
Returns
#t if
v is
null?, and returns
#f otherwise.
Equivalent to
(not? null?).
Returns
#t if
v is a list containing at least one element, and returns
#f otherwise. Equivalent to
(and? list? (not? null?)).
Returns a predicate that returns #t for any list with more than n
elements.
Examples: |
> (define more-than-four-elements? (length>? 4)) | | > (more-than-four-elements? '(foo bar baz bar foo)) | #t | > (more-than-four-elements? '(foo bar baz bar)) | #f | > (more-than-four-elements? '()) | #f | > (more-than-four-elements? null) | #f |
|
Returns a predicate that returns #t for any list with n elements.
Examples: |
> (define four-element-list? (length=? 4)) | | > (four-element-list? '(foo bar baz bar)) | #t | > (four-element-list? '(foo bar baz bar foo)) | #f | > (four-element-list? '(foo bar baz)) | #f | > (four-element-list? '()) | #f |
|
Returns a predicate that returns #t for any list with fewer than n
elements.
Examples: |
> (define less-than-four-elements? (length<? 4)) | | > (less-than-four-elements? '(foo bar baz)) | #t | > (less-than-four-elements? '(foo bar baz bar)) | #f | > (less-than-four-elements? '()) | #t |
|
Returns a predicate that returns
#t for any list whose first, second, third,
or fourth item satisfies
(and? pred ...), depending on the procedure chosen.
Examples: |
> (define second-is-number? (second? number?)) | | > (second-is-number? '(foo 4 bar baz)) | #t | > (second-is-number? '(foo bar baz)) | #f | > (second-is-number? '(5 5)) | #t |
|
Returns a predicate that returns
#t for any list for which the
rest
of the list satisfies
pred.
Examples: |
> (define rest-numbers? (rest? (all? number?))) | | > (rest-numbers? '(foo 1 2 3)) | #t | > (rest-numbers? '(foo 1)) | #t | > (rest-numbers? '(foo)) | #t | > (rest-numbers? '(foo bar baz)) | #f | > (rest-numbers? '(foo bar 1)) | #f |
|
Returns a predicate that returns #t for any list for which every element in
the list satisfies pred.
Examples: |
> (define all-numbers? (all? number?)) | | > (all-numbers? '(1 2 3 4)) | #t | > (all-numbers? '(1 2 foo 4)) | #f | > (all-numbers? '()) | #t |
|
Returns a predicate that returns #t for any value that is a list with one
element for each pred whose first element satisfies the first pred,
second element satisfies the second pred, and so on for each pred.
Examples: |
> (define num-sym-num? (listof? number? symbol? number?)) | | > (num-sym-num? '(1 foo 2)) | #t | > (num-sym-num? '(1 2 3)) | #f | > (num-sym-num? '(foo bar baz)) | #f | > (num-sym-num? '(1 foo)) | #f | > (num-sym-num? '(1 foo 2 bar)) | #f | > (num-sym-num? 'foo) | #f |
|
Similar to listof? but returns #t for lists with extra elements
Examples: |
> (define starts-with-num-sym? (list-with-head? number? symbol?)) | | > (starts-with-num-sym? '(1 foo 2 3 4 5)) | #t | > (starts-with-num-sym? '(1 foo)) | #t | > (starts-with-num-sym? '(foo bar baz)) | #f | > (starts-with-num-sym? '(1 2 3)) | #f | > (starts-with-num-sym? '()) | #f | > (starts-with-num-sym? 5) | #f |
|
4 Conditional Combinators
(if? pred f [g]) → (-> any? any?)
|
pred : (-> any? boolean?) |
f : (-> any? any?) |
g : (-> any? any?) = identity |
Returns a function that, for an input
v, returns
(if (pred v) (f v) (g v)).
(when? pred f) → (-> any? any?)
|
pred : (-> any? boolean?) |
f : (-> any? any?) |
Returns a function that, for an input
v, returns
(when (pred v) (f v)).
Examples: |
> (define displayln-when-even? (when? even? displayln)) | | > (displayln-when-even? 5) | | > (displayln-when-even? 4) | 4 | | > (displayln-when-even? 10) | 10 | |
|
(unless? pred f) → (-> any? any?)
|
pred : (-> any? boolean?) |
f : (-> any? any?) |
Returns a function that, for an input
v, returns
(unless (pred v) (f v)).
Examples: |
> (define displayln-unless-even? (unless? even? displayln)) | | > (displayln-unless-even? 5) | 5 | | > (displayln-unless-even? 4) | | > (displayln-unless-even? 10) | |
|
(while? pred f) → (-> any? any?)
|
pred : (-> any? boolean?) |
f : (-> any? any?) |
Returns a function that, for an input v, returns just v if (p v)
is false, otherwise it recursively calls itself with (f v).
Examples: |
| | > (while-negative-add10 -7) | 3 | > (while-negative-add10 -23) | 7 | > (while-negative-add10 15) | 15 |
|
(until? pred f) → (-> any? any?)
|
pred : (-> any? boolean?) |
f : (-> any? any?) |
Examples: |
| | > (until-negative-sub10 7) | -3 | > (until-negative-sub10 23) | -7 | > (until-negative-sub10 -15) | -15 |
|
Like
while? except that
f is guaranteed to be called at least once.
Similar to the relationship between
while and
do ... while loops in
imperative languages. Equivalent to
(compose (while? p f) f).
Examples: |
| | > (do-while-negative-add10 -7) | 3 | > (do-while-negative-add10 -23) | 7 | > (do-while-negative-add10 15) | 25 |
|
Examples: |
| | > (do-until-negative-sub10 7) | -3 | > (do-until-negative-sub10 23) | -7 | > (do-until-negative-sub10 -15) | -25 |
|
5 Miscellaneous
Returns #t if v is not #f, and #f otherwise.
Useful to turn "truthy" functions into predicates that only return #t
or #f.
Returns a procedure that’s like f, but returns either #t or
#f based on whether f returns false. Essentially, this procedure
turns functions that rely on returning "truthy" values into function that only
return a boolean.
Returns a predicate that determins in its input is a real number between
low
and
high. If
exclusive? is
#t, then values
= to
low or
high will return
#f.
Examples: |
> (define zero-to-ten? (in-range? 0 10)) | | > (zero-to-ten? 5) | #t | > (zero-to-ten? 0) | #t | > (zero-to-ten? 10) | #t | > (zero-to-ten? 15) | #f | > (zero-to-ten? -100) | #f | > (define between-zero-and-ten? (in-range? 0 10 #t)) | | > (between-zero-and-ten? 5) | #t | > (between-zero-and-ten? 0) | #f | > (between-zero-and-ten? 10) | #f |
|