Added tests for "default" generic method implementations to work like #:methods.
Specifically, it should be possible for a "default" implementation to have unsupported methods, and to use define/generic.
This commit is contained in:
parent
6e01d1d9a3
commit
d3d67c5978
|
@ -1,6 +1,6 @@
|
||||||
#lang racket/base
|
#lang racket/base
|
||||||
|
|
||||||
(require racket/generic unstable/macro-testing)
|
(require racket/generic racket/engine unstable/macro-testing)
|
||||||
|
|
||||||
(module+ test
|
(module+ test
|
||||||
(require rackunit)
|
(require rackunit)
|
||||||
|
@ -40,4 +40,16 @@
|
||||||
#:methods gen:foobar
|
#:methods gen:foobar
|
||||||
[(define foo 0)])
|
[(define foo 0)])
|
||||||
'ignore))))
|
'ignore))))
|
||||||
|
(check-exn #rx"foo: not implemented for 5"
|
||||||
|
(lambda () (let ()
|
||||||
|
(define-generics foobar
|
||||||
|
[foo foobar x]
|
||||||
|
#:defaults ([number?]))
|
||||||
|
;; a failing implementation may loop forever,
|
||||||
|
;; due to self-reference to the generic method foo,
|
||||||
|
;; so using an engine here to limit the time.
|
||||||
|
(define e (engine (lambda (suspend?) (foo 5 6))))
|
||||||
|
;; 1000 ms should be far more than enough.
|
||||||
|
(or (engine-run 1000 e)
|
||||||
|
(error "computation did not terminate")))))
|
||||||
)
|
)
|
||||||
|
|
|
@ -72,7 +72,20 @@
|
||||||
(define stream-first car)
|
(define stream-first car)
|
||||||
(define stream-rest cdr)
|
(define stream-rest cdr)
|
||||||
(define stream-empty? null?)])
|
(define stream-empty? null?)])
|
||||||
#:defined-table stream-table))
|
#:defined-table stream-table)
|
||||||
|
|
||||||
|
(define-generics stream
|
||||||
|
(stream-first stream)
|
||||||
|
(stream-rest stream)
|
||||||
|
(stream-empty? stream)
|
||||||
|
#:defaults
|
||||||
|
([box?
|
||||||
|
(define/generic first stream-first)
|
||||||
|
(define/generic rest stream-rest)
|
||||||
|
(define/generic empty? stream-empty?)
|
||||||
|
(define stream-first (compose first unbox))
|
||||||
|
(define stream-rest (compose rest unbox))
|
||||||
|
(define stream-empty? (compose empty? unbox))])))
|
||||||
|
|
||||||
(check-bad-syntax
|
(check-bad-syntax
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user