Allow user to write new pair filter objects
This commit is contained in:
parent
4c17c2091c
commit
d88bea0147
|
@ -104,6 +104,19 @@
|
||||||
(pattern cdr
|
(pattern cdr
|
||||||
#:attr pe (make-CdrPE)))
|
#:attr pe (make-CdrPE)))
|
||||||
|
|
||||||
|
(define-splicing-syntax-class idx-obj
|
||||||
|
#:description "index object"
|
||||||
|
#:attributes (arg depth pair)
|
||||||
|
(pattern (~seq idx:nat)
|
||||||
|
#:attr arg (syntax-e #'idx)
|
||||||
|
#:attr depth 0
|
||||||
|
#:attr pair (list 0 (syntax-e #'idx)))
|
||||||
|
(pattern (~seq depth-idx:nat idx:nat)
|
||||||
|
#:attr arg (syntax-e #'idx)
|
||||||
|
#:attr depth (syntax-e #'depth-idx)
|
||||||
|
#:attr pair (list (syntax-e #'depth-idx)
|
||||||
|
(syntax-e #'idx))))
|
||||||
|
|
||||||
(define-splicing-syntax-class simple-latent-filter
|
(define-splicing-syntax-class simple-latent-filter
|
||||||
#:description "latent filter"
|
#:description "latent filter"
|
||||||
(pattern (~seq t:expr (~describe "@" (~datum @)) pe:path-elem ...)
|
(pattern (~seq t:expr (~describe "@" (~datum @)) pe:path-elem ...)
|
||||||
|
@ -118,18 +131,18 @@
|
||||||
#:attributes (prop)
|
#:attributes (prop)
|
||||||
(pattern (~literal Top) #:attr prop -top)
|
(pattern (~literal Top) #:attr prop -top)
|
||||||
(pattern (~literal Bot) #:attr prop -bot)
|
(pattern (~literal Bot) #:attr prop -bot)
|
||||||
(pattern (t:expr (~describe "@" (~datum @)) pe:path-elem ... i:nat)
|
(pattern (t:expr (~describe "@" (~datum @)) pe:path-elem ... i:idx-obj)
|
||||||
#:fail-unless (< (syntax-e #'i) (length doms))
|
#:fail-unless (< (attribute i.arg) (length doms))
|
||||||
(format "Filter proposition's object index ~a is larger than argument length ~a"
|
(format "Filter proposition's object index ~a is larger than argument length ~a"
|
||||||
(syntax-e #'i) (length doms))
|
(attribute i.arg) (length doms))
|
||||||
#:attr prop (-filter (parse-type #'t) (syntax-e #'i) (attribute pe.pe)))
|
#:attr prop (-filter (parse-type #'t) (attribute i.pair) (attribute pe.pe)))
|
||||||
(pattern (t:expr (~describe "@" (~datum @)) pe:path-elem ... i:id)
|
(pattern (t:expr (~describe "@" (~datum @)) pe:path-elem ... i:id)
|
||||||
#:attr prop (-filter (parse-type #'t) #'i (attribute pe.pe)))
|
#:attr prop (-filter (parse-type #'t) #'i (attribute pe.pe)))
|
||||||
(pattern ((~datum !) t:expr (~describe "@" (~datum @)) pe:path-elem ... i:nat)
|
(pattern ((~datum !) t:expr (~describe "@" (~datum @)) pe:path-elem ... i:idx-obj)
|
||||||
#:fail-unless (< (syntax-e #'i) (length doms))
|
#:fail-unless (< (attribute i.arg) (length doms))
|
||||||
(format "Filter proposition's object index ~a is larger than argument length ~a"
|
(format "Filter proposition's object index ~a is larger than argument length ~a"
|
||||||
(syntax-e #'i) (length doms))
|
(attribute i.arg) (length doms))
|
||||||
#:attr prop (-not-filter (parse-type #'t) (syntax-e #'i) (attribute pe.pe)))
|
#:attr prop (-not-filter (parse-type #'t) (attribute i.pair) (attribute pe.pe)))
|
||||||
(pattern ((~datum !) t:expr (~describe "@" (~datum @)) pe:path-elem ... i:id)
|
(pattern ((~datum !) t:expr (~describe "@" (~datum @)) pe:path-elem ... i:id)
|
||||||
#:attr prop (-not-filter (parse-type #'t) #'i (attribute pe.pe)))
|
#:attr prop (-not-filter (parse-type #'t) #'i (attribute pe.pe)))
|
||||||
(pattern ((~literal and) (~var p (prop doms)) ...)
|
(pattern ((~literal and) (~var p (prop doms)) ...)
|
||||||
|
|
|
@ -1780,6 +1780,22 @@
|
||||||
(void))
|
(void))
|
||||||
;; type doesn't really matter, just make sure it typechecks
|
;; type doesn't really matter, just make sure it typechecks
|
||||||
-Void]
|
-Void]
|
||||||
|
|
||||||
|
;; The following ensures that the correct filter can be
|
||||||
|
;; written by the user
|
||||||
|
[tc-e
|
||||||
|
(let ()
|
||||||
|
(: f (Any -> (Any -> Boolean : #:+ (Number @ 1 0)
|
||||||
|
#:- (! Number @ 1 0))
|
||||||
|
: #:+ Top #:- Bot))
|
||||||
|
(define f (λ (x) (λ (y) (number? x))))
|
||||||
|
(: b (U Number String))
|
||||||
|
(define b 5)
|
||||||
|
(define g (f b))
|
||||||
|
(if (g "foo") (add1 b) 3)
|
||||||
|
(void))
|
||||||
|
;; type doesn't really matter, just make sure it typechecks
|
||||||
|
-Void]
|
||||||
)
|
)
|
||||||
(test-suite
|
(test-suite
|
||||||
"tc-literal tests"
|
"tc-literal tests"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user