Add tabulate/pv/boolean and tabulate*/pv/boolean.
This commit is contained in:
parent
c19d18122c
commit
1b22ba4a7e
2 changed files with 67 additions and 2 deletions
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
pseudovariadic-lambda pvλ pseudovariadic-define pvdefine
|
pseudovariadic-lambda pvλ pseudovariadic-define pvdefine
|
||||||
tabulate* tabulate*/strict tabulate*/pv tabulate tabulate/strict tabulate/pv)
|
tabulate* tabulate*/strict tabulate*/pv tabulate tabulate/strict tabulate/pv
|
||||||
|
tabulate*/pv/boolean tabulate/pv/boolean)
|
||||||
|
|
||||||
(module+ test
|
(module+ test
|
||||||
(require typed/rackunit))
|
(require typed/rackunit))
|
||||||
|
@ -147,6 +148,26 @@
|
||||||
(check-equal? (tabulate/pv (pvλ (x y) (and x y)) '((#f #t) (#f #t)))
|
(check-equal? (tabulate/pv (pvλ (x y) (and x y)) '((#f #t) (#f #t)))
|
||||||
'((#f #f #f) (#f #t #f) (#t #f #f) (#t #t #t)))))
|
'((#f #f #f) (#f #t #f) (#t #f #f) (#t #t #t)))))
|
||||||
|
|
||||||
|
(: tabulate/pv/boolean (-> Integer (-> Boolean * Boolean) (Listof (Listof Boolean))))
|
||||||
|
(define (tabulate/pv/boolean arity func)
|
||||||
|
(tabulate/pv func (make-list arity '(#f #t))))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(test-case "tabulate/pv/boolean"
|
||||||
|
(check-equal? (tabulate/pv/boolean 2 (pvλ (x y) (and x y)))
|
||||||
|
'((#f #f #f) (#f #t #f) (#t #f #f) (#t #t #t)))))
|
||||||
|
|
||||||
|
(: tabulate*/pv/boolean (-> Integer (Listof (-> Boolean * Boolean))
|
||||||
|
(Listof (Listof Boolean))))
|
||||||
|
(define (tabulate*/pv/boolean arity funcs)
|
||||||
|
(tabulate*/pv funcs (make-list arity '(#f #t))))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(test-case "tabulate*/pv/boolean"
|
||||||
|
(check-equal? (tabulate*/pv/boolean 2 (list (pvλ (x y) (and x y))
|
||||||
|
(pvλ (x y) (or x y))))
|
||||||
|
'((#f #f #f #f) (#f #t #f #t) (#t #f #f #t) (#t #t #t #t)))))
|
||||||
|
|
||||||
(module untyped racket
|
(module untyped racket
|
||||||
(module+ test
|
(module+ test
|
||||||
(require rackunit))
|
(require rackunit))
|
||||||
|
@ -207,7 +228,8 @@
|
||||||
(provide
|
(provide
|
||||||
pseudovariadic-lambda pvλ pseudovariadic-define pvdefine
|
pseudovariadic-lambda pvλ pseudovariadic-define pvdefine
|
||||||
tabulate* tabulate*/strict tabulate*/pv
|
tabulate* tabulate*/strict tabulate*/pv
|
||||||
tabulate tabulate/strict tabulate/pv)
|
tabulate tabulate/strict tabulate/pv
|
||||||
|
tabulate*/pv/boolean tabulate/pv/boolean)
|
||||||
|
|
||||||
(require (rename-in (submod 'typed untyped)
|
(require (rename-in (submod 'typed untyped)
|
||||||
[tabulate tabulate/untyped]
|
[tabulate tabulate/untyped]
|
||||||
|
|
|
@ -166,6 +166,49 @@ are @seclink["pseudovariadic"]{pseudovariadic}.
|
||||||
'((#f #t) (#f #t)))
|
'((#f #t) (#f #t)))
|
||||||
]}
|
]}
|
||||||
|
|
||||||
|
@defproc[(tabulate/pv/boolean [arity Integer] [func (-> Boolean * Boolean)])
|
||||||
|
(Listof (Listof Boolean))]{
|
||||||
|
|
||||||
|
Like @racket[tabulate/pv], but assumes the domains of all variables of the
|
||||||
|
function are Boolean. The arity of @racket[func] must be explicitly supplied.
|
||||||
|
|
||||||
|
@examples[#:eval functions-evaluator
|
||||||
|
(tabulate/pv/boolean 2 (pvλ (x y) (and x y)))
|
||||||
|
]
|
||||||
|
|
||||||
|
Explicitly supplying the arity is necessary because the actual arity of
|
||||||
|
a pseudovariadic function cannot be determined programmatically. Note that
|
||||||
|
@racket[tabulate] can be applied directly to a function, but the type of
|
||||||
|
@racket[tabulate] requires a cast is required the domains argument
|
||||||
|
@racket[doms].
|
||||||
|
|
||||||
|
@examples[#:eval functions-evaluator
|
||||||
|
(tabulate (λ (x y) (and x y))
|
||||||
|
(cast (make-list 2 '(#f #t))
|
||||||
|
(List (Listof Boolean) (Listof Boolean))))
|
||||||
|
]
|
||||||
|
|
||||||
|
This cast is what makes it necessary to resort to pseudovariadic functions and
|
||||||
|
explicit @racket[arity] to be able to write a type for
|
||||||
|
@racket[tabulate/pv/boolean].
|
||||||
|
|
||||||
|
See also @secref{fuctions/untyped} for simpler, but untyped version of
|
||||||
|
this function.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@defproc[(tabulate*/pv/boolean [arity Integer]
|
||||||
|
[func (Listof (-> Boolean * Boolean))])
|
||||||
|
(Listof (Listof Boolean))]{
|
||||||
|
|
||||||
|
Like @racket[tabulate/pv/boolean], but takes a list of functions of the
|
||||||
|
same arity.
|
||||||
|
|
||||||
|
@examples[#:eval functions-evaluator
|
||||||
|
(tabulate*/pv/boolean 2 (list (pvλ (x y) (and x y))
|
||||||
|
(pvλ (x y) (or x y))))
|
||||||
|
]}
|
||||||
|
|
||||||
@section{Constructing functions}
|
@section{Constructing functions}
|
||||||
|
|
||||||
@section{Random functions}
|
@section{Random functions}
|
||||||
|
|
Loading…
Reference in a new issue