Allow chaperones on class methods
This allows libraries to add metadata to methods in the form of chaperone properties which can be read by contracts on methods.
This commit is contained in:
parent
c5e9f42cee
commit
5dc6be1a17
|
@ -252,7 +252,7 @@ interface @racket[(class->interface object%)], and is transparent
|
|||
public pubment public-final override override-final overment augment augride
|
||||
augment-final private abstract inherit inherit/super inherit/inner
|
||||
rename-super rename-inner begin lambda case-lambda let-values letrec-values
|
||||
define-values #%plain-lambda)
|
||||
define-values #%plain-lambda chaperone-procedure)
|
||||
(class* superclass-expr (interface-expr ...)
|
||||
class-clause
|
||||
...)
|
||||
|
@ -314,7 +314,9 @@ interface @racket[(class->interface object%)], and is transparent
|
|||
(let-values ([(id) method-procedure] ...+)
|
||||
id)
|
||||
(letrec-values ([(id) method-procedure] ...+)
|
||||
id)])]{
|
||||
id)
|
||||
(chaperone-procedure method-procedure wrapper-proc
|
||||
other-arg-expr ...)])]{
|
||||
|
||||
Produces a class value.
|
||||
|
||||
|
|
|
@ -2054,6 +2054,27 @@
|
|||
|
||||
(void))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Test chaperone-procedure on method definitions
|
||||
|
||||
(test #t class? (class object% (public m) (define m (chaperone-procedure (λ (x) x) values))))
|
||||
(test #t class? (class object%
|
||||
(public m)
|
||||
(define m
|
||||
(chaperone-procedure (case-lambda [(x) x]) values))))
|
||||
(test #t class? (class object%
|
||||
(public m)
|
||||
(define m
|
||||
(let-values ([(m) (chaperone-procedure (λ (x) x) values)])
|
||||
m))))
|
||||
(test #t zero? (send (new (class object%
|
||||
(super-new)
|
||||
(public m)
|
||||
(define m
|
||||
(let-values ([(m) (chaperone-procedure (λ () 0) values)])
|
||||
m))))
|
||||
m))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(report-errs)
|
||||
|
|
|
@ -632,6 +632,20 @@
|
|||
stx)
|
||||
stx
|
||||
(syntax-local-introduce #'let-))))]
|
||||
[(-#%app -chaperone-procedure expr . rst)
|
||||
(and (free-identifier=? (syntax -#%app)
|
||||
(quote-syntax #%plain-app))
|
||||
(or (free-identifier=? (syntax -chaperone-procedure)
|
||||
(quote-syntax chaperone-procedure))
|
||||
(free-identifier=? (syntax -chaperone-procedure)
|
||||
(quote-syntax chaperone-procedure))))
|
||||
(with-syntax ([expr (loop #'expr #t name locals)])
|
||||
(syntax-track-origin
|
||||
(rearm
|
||||
(syntax/loc stx (-#%app -chaperone-procedure expr . rst))
|
||||
stx)
|
||||
stx
|
||||
(syntax-local-introduce #'-#%app)))]
|
||||
[_else
|
||||
(if can-expand?
|
||||
(loop (expand stx locals) #f name locals)
|
||||
|
|
Loading…
Reference in New Issue
Block a user