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:
Carl Eastlund 2013-07-08 18:14:15 -04:00
parent 6e01d1d9a3
commit d3d67c5978
2 changed files with 27 additions and 2 deletions

View File

@ -1,6 +1,6 @@
#lang racket/base
(require racket/generic unstable/macro-testing)
(require racket/generic racket/engine unstable/macro-testing)
(module+ test
(require rackunit)
@ -40,4 +40,16 @@
#:methods gen:foobar
[(define foo 0)])
'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")))))
)

View File

@ -72,7 +72,20 @@
(define stream-first car)
(define stream-rest cdr)
(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