hyper-literate/comments/typed-syntax-predicate.rkt
2017-01-10 15:54:34 +01:00

52 lines
1.5 KiB
Racket

#lang typed/racket
(provide isexp?
CoreSexp)
(module unsafe racket
(provide isexp?)
(define isexp/c
(flat-rec-contract isexp
(or/c boolean?
char?
number?
keyword?
null?
(and/c string? immutable?)
symbol?
(box/c isexp #:immutable #t)
(cons/c isexp isexp)
(vectorof isexp #:immutable #t))))
(define sexp/c
(recursive-contract
(or/c boolean?
char?
number?
keyword?
null?
string?
symbol?
(box/c sexp/c)
(cons/c sexp/c sexp/c)
(vectorof sexp/c))))
(define isexp?
(flat-contract-predicate isexp/c)))
(define-type CoreSexp (Rec core-sexp
(U Boolean
Char
Number
Keyword
Null
String
Symbol
#|(Boxof sexp)|#
(Pairof core-sexp core-sexp)
#|(Vectorof sexp)|#)))
(require typed/racket/unsafe)
(unsafe-require/typed 'unsafe
[isexp? ( Any Boolean : #:+ Sexp #:- (! CoreSexp))])