Add types for kernel struct constructors.
This commit is contained in:
parent
fc8ed9772a
commit
046d476970
|
@ -1355,6 +1355,33 @@
|
||||||
(promise-running? p)) B)
|
(promise-running? p)) B)
|
||||||
|#
|
|#
|
||||||
|
|
||||||
|
;Kernel Structs, check that their hidden identifiers type
|
||||||
|
;Currently broken in test-suite because of binding differences
|
||||||
|
#;
|
||||||
|
(tc-e (void exn
|
||||||
|
exn:fail
|
||||||
|
exn:fail:contract
|
||||||
|
exn:fail:contract:arity
|
||||||
|
exn:fail:contract:divide-by-zero
|
||||||
|
exn:fail:contract:non-fixnum-result
|
||||||
|
exn:fail:contract:continuation
|
||||||
|
exn:fail:contract:variable
|
||||||
|
exn:fail:syntax
|
||||||
|
exn:fail:read
|
||||||
|
exn:fail:read:eof
|
||||||
|
exn:fail:read:non-char
|
||||||
|
exn:fail:filesystem
|
||||||
|
exn:fail:filesystem:exists
|
||||||
|
exn:fail:filesystem:version
|
||||||
|
exn:fail:network
|
||||||
|
exn:fail:out-of-memory
|
||||||
|
exn:fail:unsupported
|
||||||
|
exn:fail:user
|
||||||
|
exn:break
|
||||||
|
arity-at-least
|
||||||
|
date
|
||||||
|
srcloc) -Void)
|
||||||
|
|
||||||
|
|
||||||
)
|
)
|
||||||
(test-suite
|
(test-suite
|
||||||
|
|
|
@ -9,29 +9,29 @@
|
||||||
(only-in (types convenience) [make-arr* make-arr])
|
(only-in (types convenience) [make-arr* make-arr])
|
||||||
(typecheck tc-structs))
|
(typecheck tc-structs))
|
||||||
|
|
||||||
(require (for-template racket/base))
|
(require (for-template racket/base (prefix-in k: '#%kernel)))
|
||||||
|
|
||||||
(provide initialize-structs)
|
(provide initialize-structs)
|
||||||
|
|
||||||
(define-syntax define-hierarchy
|
(define-syntax define-hierarchy
|
||||||
(syntax-rules (define-hierarchy)
|
(syntax-rules (define-hierarchy)
|
||||||
[(_ parent ([name : type] ...)
|
[(_ parent (opts ...) ([name : type] ...)
|
||||||
(define-hierarchy child (spec ...) grand ...)
|
(define-hierarchy child (child-opts ...) (spec ...) grand ...)
|
||||||
...)
|
...)
|
||||||
(begin
|
(begin
|
||||||
(d-s parent ([name : type] ...))
|
(d-s parent ([name : type] ...) opts ...)
|
||||||
(define-sub-hierarchy [child parent] (type ...) (spec ...) grand ...)
|
(define-sub-hierarchy [child parent] (type ...) (child-opts ...) (spec ...) grand ...)
|
||||||
...)]))
|
...)]))
|
||||||
|
|
||||||
(define-syntax define-sub-hierarchy
|
(define-syntax define-sub-hierarchy
|
||||||
(syntax-rules (define-hierarchy)
|
(syntax-rules (define-hierarchy)
|
||||||
[(_ [child parent] (inheritance ...) ([name : type] ...)
|
[(_ [child parent] (inheritance ...) (opts ...) ([name : type] ...)
|
||||||
(define-hierarchy grandchild (spec ...) great ...)
|
(define-hierarchy grandchild (grandchild-opts ...)(spec ...) great ...)
|
||||||
...)
|
...)
|
||||||
(begin
|
(begin
|
||||||
(d-s [child parent] ([name : type] ...) (inheritance ...))
|
(d-s [child parent] ([name : type] ...) (inheritance ...) opts ...)
|
||||||
(define-sub-hierarchy [grandchild child]
|
(define-sub-hierarchy [grandchild child]
|
||||||
(inheritance ... type ...) (spec ...)
|
(inheritance ... type ...) (grandchild-opts ...) (spec ...)
|
||||||
great
|
great
|
||||||
...)
|
...)
|
||||||
...)]))
|
...)]))
|
||||||
|
@ -40,14 +40,14 @@
|
||||||
(define (initialize-structs)
|
(define (initialize-structs)
|
||||||
|
|
||||||
|
|
||||||
(define-hierarchy srcloc
|
(define-hierarchy srcloc (#:kernel-maker k:srcloc)
|
||||||
([source : Univ]
|
([source : Univ]
|
||||||
[line : (*Un -Integer (-val #f))]
|
[line : (*Un -Integer (-val #f))]
|
||||||
[column : (*Un -Integer (-val #f))]
|
[column : (*Un -Integer (-val #f))]
|
||||||
[position : (*Un -Integer (-val #f))]
|
[position : (*Un -Integer (-val #f))]
|
||||||
[span : (*Un -Integer (-val #f))]))
|
[span : (*Un -Integer (-val #f))]))
|
||||||
|
|
||||||
(define-hierarchy date
|
(define-hierarchy date (#:kernel-maker k:date)
|
||||||
([second : -Number]
|
([second : -Number]
|
||||||
[minute : -Number]
|
[minute : -Number]
|
||||||
[hour : -Number]
|
[hour : -Number]
|
||||||
|
@ -59,41 +59,42 @@
|
||||||
[dst? : -Boolean]
|
[dst? : -Boolean]
|
||||||
[time-zone-offset : -Number]))
|
[time-zone-offset : -Number]))
|
||||||
|
|
||||||
(define-hierarchy arity-at-least
|
(define-hierarchy arity-at-least (#:kernel-maker k:arity-at-least)
|
||||||
([value : -Nat]))
|
([value : -Nat]))
|
||||||
|
|
||||||
(define-hierarchy exn
|
(define-hierarchy exn (#:kernel-maker k:exn)
|
||||||
([message : -String] [continuation-marks : -Cont-Mark-Set])
|
([message : -String] [continuation-marks : -Cont-Mark-Set])
|
||||||
|
|
||||||
(define-hierarchy exn:break ([continuation : top-func]))
|
(define-hierarchy exn:break (#:kernel-maker k:exn:break)
|
||||||
|
([continuation : top-func]))
|
||||||
|
|
||||||
(define-hierarchy exn:fail ()
|
(define-hierarchy exn:fail (#:kernel-maker k:exn:fail) ()
|
||||||
|
|
||||||
(define-hierarchy exn:fail:contract ()
|
(define-hierarchy exn:fail:contract (#:kernel-maker k:exn:fail:contract) ()
|
||||||
(define-hierarchy exn:fail:contract:arity ())
|
(define-hierarchy exn:fail:contract:arity (#:kernel-maker k:exn:fail:contract:arity) ())
|
||||||
(define-hierarchy exn:fail:contract:divide-by-zero ())
|
(define-hierarchy exn:fail:contract:divide-by-zero (#:kernel-maker k:exn:fail:contract:divide-by-zero) ())
|
||||||
(define-hierarchy exn:fail:contract:non-fixnum-result ())
|
(define-hierarchy exn:fail:contract:non-fixnum-result (#:kernel-maker k:exn:fail:contract:non-fixnum-result) ())
|
||||||
(define-hierarchy exn:fail:contract:continuation ())
|
(define-hierarchy exn:fail:contract:continuation (#:kernel-maker k:exn:fail:contract:continuation) ())
|
||||||
(define-hierarchy exn:fail:contract:variable ()))
|
(define-hierarchy exn:fail:contract:variable (#:kernel-maker k:exn:fail:contract:variable) ()))
|
||||||
|
|
||||||
(define-hierarchy exn:fail:syntax ([exprs : (-lst (-Syntax Univ))]))
|
(define-hierarchy exn:fail:syntax (#:kernel-maker k:exn:fail:syntax) ([exprs : (-lst (-Syntax Univ))]))
|
||||||
|
|
||||||
(define-hierarchy exn:fail:read
|
(define-hierarchy exn:fail:read (#:kernel-maker k:exn:fail:read)
|
||||||
([srclocs : (-lst Univ)]) ;; cce: Univ here should be srcloc
|
([srclocs : (-lst Univ)]) ;; cce: Univ here should be srcloc
|
||||||
(define-hierarchy exn:fail:read:eof ())
|
(define-hierarchy exn:fail:read:eof (#:kernel-maker k:exn:fail:read:eof) ())
|
||||||
(define-hierarchy exn:fail:read:non-char ()))
|
(define-hierarchy exn:fail:read:non-char (#:kernel-maker k:exn:fail:read:non-char) ()))
|
||||||
|
|
||||||
(define-hierarchy exn:fail:filesystem ()
|
(define-hierarchy exn:fail:filesystem (#:kernel-maker k:exn:fail:filesystem) ()
|
||||||
(define-hierarchy exn:fail:filesystem:exists ())
|
(define-hierarchy exn:fail:filesystem:exists (#:kernel-maker k:exn:fail:filesystem:exists) ())
|
||||||
(define-hierarchy exn:fail:filesystem:version ()))
|
(define-hierarchy exn:fail:filesystem:version (#:kernel-maker k:exn:fail:filesystem:version) ()))
|
||||||
|
|
||||||
(define-hierarchy exn:fail:network ())
|
(define-hierarchy exn:fail:network (#:kernel-maker k:exn:fail:network) ())
|
||||||
|
|
||||||
(define-hierarchy exn:fail:out-of-memory ())
|
(define-hierarchy exn:fail:out-of-memory (#:kernel-maker k:exn:fail:out-of-memory) ())
|
||||||
|
|
||||||
(define-hierarchy exn:fail:unsupported ())
|
(define-hierarchy exn:fail:unsupported (#:kernel-maker k:exn:fail:unsupported) ())
|
||||||
|
|
||||||
(define-hierarchy exn:fail:user ())))
|
(define-hierarchy exn:fail:user (#:kernel-maker k:exn:fail:user) ())))
|
||||||
|
|
||||||
;; cce: adding exn:break would require a generic type for continuations
|
;; cce: adding exn:break would require a generic type for continuations
|
||||||
(void))
|
(void))
|
||||||
|
|
|
@ -17,7 +17,9 @@
|
||||||
listof any/c or/c
|
listof any/c or/c
|
||||||
[->* c->*]
|
[->* c->*]
|
||||||
[-> c->])
|
[-> c->])
|
||||||
(for-syntax scheme/base))
|
(for-syntax
|
||||||
|
syntax/parse
|
||||||
|
scheme/base))
|
||||||
|
|
||||||
|
|
||||||
(require (for-template scheme/base
|
(require (for-template scheme/base
|
||||||
|
@ -282,25 +284,38 @@
|
||||||
|
|
||||||
;; register a struct type
|
;; register a struct type
|
||||||
;; convenience function for built-in structs
|
;; convenience function for built-in structs
|
||||||
;; tc/builtin-struct : identifier identifier Listof[identifier] Listof[Type] Listof[Type] -> void
|
;; tc/builtin-struct : identifier Maybe[identifier] Listof[identifier] Listof[Type] Maybe[identifier] Listof[Type] -> void
|
||||||
(define/cond-contract (tc/builtin-struct nm parent flds tys #;parent-tys)
|
(define/cond-contract (tc/builtin-struct nm parent flds tys kernel-maker #;parent-tys)
|
||||||
(c-> identifier? (or/c #f identifier?) (listof identifier?)
|
(c-> identifier? (or/c #f identifier?) (listof identifier?)
|
||||||
(listof Type/c) #;(listof fld?)
|
(listof Type/c) (or/c #f identifier?) #;(listof fld?)
|
||||||
any/c)
|
any/c)
|
||||||
(let* ([parent-name (if parent (make-Name parent) #f)]
|
(let* ([parent-name (if parent (make-Name parent) #f)]
|
||||||
[parent-flds (if parent (get-parent-flds parent-name) null)])
|
[parent-flds (if parent (get-parent-flds parent-name) null)])
|
||||||
(mk/register-sty nm flds parent-name parent-flds tys
|
(let ((defs (mk/register-sty nm flds parent-name parent-flds tys
|
||||||
#:mutable #t)))
|
#:mutable #t)))
|
||||||
|
(if kernel-maker
|
||||||
|
(let* ((result-type (lookup-type-name nm))
|
||||||
|
(ty (->* tys result-type)))
|
||||||
|
(register-type kernel-maker ty)
|
||||||
|
(cons (make-def-binding kernel-maker ty) defs))
|
||||||
|
defs))))
|
||||||
|
|
||||||
|
|
||||||
;; syntax for tc/builtin-struct
|
;; syntax for tc/builtin-struct
|
||||||
(define-syntax (d-s stx)
|
(define-syntax (d-s stx)
|
||||||
(syntax-case stx (:)
|
(define-splicing-syntax-class options
|
||||||
[(_ (nm par) ([fld : ty] ...) (par-ty ...))
|
(pattern (~optional (~seq #:kernel-maker maker:id))
|
||||||
|
#:attr kernel-maker (if (attribute maker) #'(quote-syntax maker) #'#f)))
|
||||||
|
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ (nm:id par:id) ([fld:id (~datum :) ty] ...) (par-ty ...) opts:options)
|
||||||
#'(tc/builtin-struct #'nm #'par
|
#'(tc/builtin-struct #'nm #'par
|
||||||
(list #'fld ...)
|
(list #'fld ...)
|
||||||
(list ty ...))]
|
(list ty ...)
|
||||||
[(_ nm ([fld : ty] ...))
|
opts.kernel-maker)]
|
||||||
|
[(_ nm:id ([fld:id (~datum :) ty] ...) opts:options)
|
||||||
#'(tc/builtin-struct #'nm #f
|
#'(tc/builtin-struct #'nm #f
|
||||||
(list #'fld ...)
|
(list #'fld ...)
|
||||||
(list ty ...))]))
|
(list ty ...)
|
||||||
|
opts.kernel-maker)]))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user