Start functions/untyped.
This commit is contained in:
parent
f2a9336d71
commit
096d536908
2 changed files with 80 additions and 63 deletions
|
@ -19,10 +19,6 @@
|
||||||
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)
|
||||||
|
|
||||||
(unsafe-provide
|
|
||||||
(rename-out [tabulate* tabulate*/untyped]
|
|
||||||
[tabulate tabulate/untyped]))
|
|
||||||
|
|
||||||
(module+ test
|
(module+ test
|
||||||
(require typed/rackunit))
|
(require typed/rackunit))
|
||||||
|
|
||||||
|
@ -150,14 +146,50 @@
|
||||||
(test-case "tabulate/pv"
|
(test-case "tabulate/pv"
|
||||||
(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)))))
|
||||||
|
|
||||||
|
(module untyped racket
|
||||||
|
(module+ test
|
||||||
|
(require rackunit))
|
||||||
|
|
||||||
|
(provide
|
||||||
|
(contract-out [tabulate* (-> (listof procedure?) (listof (listof any/c))
|
||||||
|
(listof (listof any/c)))]
|
||||||
|
[tabulate (-> procedure? (listof (listof any/c))
|
||||||
|
(listof (listof any/c)))]))
|
||||||
|
|
||||||
|
(define (tabulate* funcs doms)
|
||||||
|
(for/list ([xs (in-list (apply cartesian-product doms))])
|
||||||
|
(append xs (for/list ([f funcs])
|
||||||
|
(apply f xs)))))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(test-case "tabulate*"
|
||||||
|
(check-equal? (tabulate*
|
||||||
|
(list (λ (x y) (and x y))
|
||||||
|
(λ (x y) (or x y)))
|
||||||
|
'((#f #t) (#f #t)))
|
||||||
|
'((#f #f #f #f) (#f #t #f #t) (#t #f #f #t) (#t #t #t #t)))
|
||||||
|
(check-equal? (tabulate* empty '((#f #t) (#f #t)))
|
||||||
|
'((#f #f) (#f #t) (#t #f) (#t #t)))))
|
||||||
|
|
||||||
|
(define (tabulate func doms)
|
||||||
|
(tabulate* (list func) doms))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(test-case "tabulate"
|
||||||
|
(check-equal? (tabulate (λ (x y) (and x y)) '((#f #t) (#f #t)))
|
||||||
|
'((#f #f #f) (#f #t #f) (#t #f #f) (#t #t #t))))))
|
||||||
)
|
)
|
||||||
|
|
||||||
(require 'typed)
|
(require 'typed)
|
||||||
(provide
|
(provide
|
||||||
pseudovariadic-lambda pvλ pseudovariadic-define pvdefine
|
pseudovariadic-lambda pvλ pseudovariadic-define pvdefine
|
||||||
tabulate* tabulate*/strict tabulate*/pv tabulate*/untyped
|
tabulate* tabulate*/strict tabulate*/pv
|
||||||
tabulate tabulate/strict tabulate/pv tabulate/untyped)
|
tabulate tabulate/strict tabulate/pv)
|
||||||
|
|
||||||
|
(require (rename-in (submod 'typed untyped)
|
||||||
|
[tabulate tabulate/untyped]
|
||||||
|
[tabulate* tabulate*/untyped]))
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
;; Structures
|
;; Structures
|
||||||
|
|
|
@ -112,33 +112,6 @@ Like @racket[tabulate], but @racket[func]
|
||||||
(tabulate/pv (pvλ (x y) (and x y)) '((#f #t) (#f #t)))
|
(tabulate/pv (pvλ (x y) (and x y)) '((#f #t) (#f #t)))
|
||||||
]}
|
]}
|
||||||
|
|
||||||
@defproc[(tabulate/untyped [funcs procedure?]
|
|
||||||
[doms (listof list?)])
|
|
||||||
(listof list?)]{
|
|
||||||
|
|
||||||
A version of @racket[tabulate] without type checking.
|
|
||||||
|
|
||||||
As of 2022-03-06, Typed Racket cannot generate contracts for polymorphic
|
|
||||||
variable-arity functions. This means that @racket[tabulate] cannot be used
|
|
||||||
directly in untyped code and should be replaced by @racket[tabulate/untyped],
|
|
||||||
which is simply an @racket[unsafe-provide] of @racket[tabulate].
|
|
||||||
|
|
||||||
@examples[#:eval functions-evaluator
|
|
||||||
(tabulate/untyped (λ (x y) (and x y)) '((#f #t) (#f #t)))
|
|
||||||
]
|
|
||||||
|
|
||||||
The contracts in the documentation entry are provided for explanatory purposes
|
|
||||||
and are not actually enforced. Some contracts on the functions
|
|
||||||
@racket[tabulate] uses internally are still checked. For example, trying to
|
|
||||||
tabulate a function of wrong arity will still raise an error.
|
|
||||||
|
|
||||||
@examples[#:eval functions-evaluator
|
|
||||||
(module tabulate/untyped-test racket/base
|
|
||||||
(require "functions.rkt")
|
|
||||||
(tabulate/untyped (λ (x y z) (and x y z)) '((#f #t) (#f #t))))
|
|
||||||
(eval:error (require 'tabulate/untyped-test))
|
|
||||||
]}
|
|
||||||
|
|
||||||
@defproc[(tabulate* [funcs (Listof (-> a ... b))]
|
@defproc[(tabulate* [funcs (Listof (-> a ... b))]
|
||||||
[doms (List (Listof a) ... a)])
|
[doms (List (Listof a) ... a)])
|
||||||
(Listof (Listof (U Any b)))]{
|
(Listof (Listof (U Any b)))]{
|
||||||
|
@ -193,38 +166,50 @@ are @seclink["pseudovariadic"]{pseudovariadic}.
|
||||||
'((#f #t) (#f #t)))
|
'((#f #t) (#f #t)))
|
||||||
]}
|
]}
|
||||||
|
|
||||||
@defproc[(tabulate*/untyped [funcs (listof procedure?)]
|
|
||||||
[doms (listof list?)])
|
|
||||||
(listof list?)]{
|
|
||||||
|
|
||||||
A version of @racket[tabulate*] without type checking.
|
|
||||||
|
|
||||||
As of 2022-03-06, Typed Racket cannot generate contracts for polymorphic
|
|
||||||
variable-arity functions. This means that @racket[tabulate*] cannot be used
|
|
||||||
directly in untyped code and should be replaced by @racket[tabulate*/untyped],
|
|
||||||
which is simply an @racket[unsafe-provide] of @racket[tabulate*].
|
|
||||||
|
|
||||||
@examples[#:eval functions-evaluator
|
|
||||||
(tabulate*/untyped (list (λ (x y) (and x y))
|
|
||||||
(λ (x y) (or x y)))
|
|
||||||
'((#f #t) (#f #t)))
|
|
||||||
]
|
|
||||||
|
|
||||||
The contracts in the documentation entry are provided for explanatory purposes
|
|
||||||
and are not actually enforced. Some contracts on the functions
|
|
||||||
@racket[tabulate*] uses internally are still checked. For example, trying to
|
|
||||||
tabulate a function of wrong arity will still raise an error.
|
|
||||||
|
|
||||||
@examples[#:eval functions-evaluator
|
|
||||||
(module tabulate*/untyped-test racket/base
|
|
||||||
(require "functions.rkt")
|
|
||||||
(tabulate*/untyped (list (λ (x y z) (and x y z)))
|
|
||||||
'((#f #t) (#f #t))))
|
|
||||||
(eval:error (require 'tabulate*/untyped-test))
|
|
||||||
]}
|
|
||||||
|
|
||||||
@section{Constructing functions}
|
@section{Constructing functions}
|
||||||
|
|
||||||
@section{Random functions}
|
@section{Random functions}
|
||||||
|
|
||||||
@section{Threshold Boolean functions}
|
@section{Threshold Boolean functions}
|
||||||
|
|
||||||
|
@section[#:tag "fuctions/untyped"]{Untyped definitions}
|
||||||
|
|
||||||
|
@defmodule[(submod dds/functions untyped)]
|
||||||
|
|
||||||
|
@(require (for-label (only-in racket/contract/base listof any/c)))
|
||||||
|
|
||||||
|
This submodule contains some functions which cannot be typed or some functions
|
||||||
|
for which Typed Racket cannot produce contracts, i.e. polymorphic functions of
|
||||||
|
variable arity. The definitions in this submodule specifically target untyped
|
||||||
|
user code.
|
||||||
|
|
||||||
|
@(define functions-evaluator/untyped
|
||||||
|
(parameterize ([sandbox-output 'string]
|
||||||
|
[sandbox-error-output 'string]
|
||||||
|
[sandbox-memory-limit 50])
|
||||||
|
(make-evaluator 'racket #:requires '((submod "functions.rkt" typed untyped)))))
|
||||||
|
|
||||||
|
@defproc[(tabulate [funcs procedure?]
|
||||||
|
[doms (listof list?)])
|
||||||
|
(listof list?)]{
|
||||||
|
|
||||||
|
Given a function @racket[func] and a list of domains @racket[doms] for each of
|
||||||
|
its arguments, in order, produces a list of lists giving the values of
|
||||||
|
arguments and the value of the functions for these inputs.
|
||||||
|
|
||||||
|
@examples[#:eval functions-evaluator/untyped
|
||||||
|
(tabulate (λ (x y) (and x y)) '((#f #t) (#f #t)))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defproc[(tabulate* [funcs (listof procedure?)]
|
||||||
|
[doms (listof list?)])
|
||||||
|
(listof list?)]{
|
||||||
|
|
||||||
|
Like @racket[tabulate], but @racket[funcs] is a list of functions taking the
|
||||||
|
same arguments over the same domains.
|
||||||
|
|
||||||
|
@examples[#:eval functions-evaluator/untyped
|
||||||
|
(tabulate* (list (λ (x y) (and x y))
|
||||||
|
(λ (x y) (or x y)))
|
||||||
|
'((#f #t) (#f #t)))
|
||||||
|
]}
|
||||||
|
|
Loading…
Reference in a new issue