I use this workaround in the math library, whose arrays are higher-order values that *can* be checked for equality:

(require (except-in typed/rackunit check-equal?))

;; This gets around the fact that typed/rackunit can no longer test
;; higher-order values for equality, since TR has firmed up its rules
;; on passing `Any' types in and out of untyped code
(define-syntax-rule (check-equal? a b . message)
  (check-true (equal? a b) . message))


There's got to be a more general fix along these lines.

Neil ⊥

On 05/29/2013 09:19 AM, Robby Findler wrote:
Yes: my message is about strange error messages that cause newbies to
just conclude that testing TR programs doesn't work. While I can
certainly fault someone for coming to this conclusion (and I did) I
think only half of the problem is on their side.

If they had gotten this message, they might have said "equal? isn't what
I want here" and then maybe made some progress.

But I do agree with you and if it is hard to get to even this state,
then it probably isn't worth pursuing.

Robby


On Wed, May 29, 2013 at 10:11 AM, Matthias Felleisen
<matth...@ccs.neu.edu <mailto:matth...@ccs.neu.edu>> wrote:


    If TR lived up exactly to the R level of semantics, to wit:

     > Welcome to DrRacket, version 5.3.4.10--2013-05-29(05524114/d) [3m].
     > Language: racket.
     > > (struct s ())
     > > (require rackunit)
     > > (check-equal? (s) (s))
     > --------------------
     > FAILURE
     > actual:     #<s>
     > expected:   #<s>
     > name:       check-equal?
     > location:   (unsaved-editor324 5 2 126 22)
     > expression: (check-equal? (s) (s))
     >
     > . . Check failure
     > --------------------


    would you really write a different message to dev? Opaque structures
    pose a problem for testing and that problem exists at both levels.

    -- Matthias






    On May 29, 2013, at 8:02 AM, Robby Findler
    <ro...@eecs.northwestern.edu <mailto:ro...@eecs.northwestern.edu>>
    wrote:

     > Well, given that replacing check-equal? with equal? (on the typed
    side) works, then it seems to me that one solution would be to move
    more of rackunit into TR, or to refactor rackunit to be more
    friendly to TR. (And if someone is going to work on this, then it
    would also be great if the error messages from failed test cases
    were made a bit more legible.)
     >
     > Robby
     >
     >
     > On Wed, May 29, 2013 at 6:53 AM, Sam Tobin-Hochstadt
    <sa...@ccs.neu.edu <mailto:sa...@ccs.neu.edu>> wrote:
     > That is indeed the correct fix.  I'm not entirely sure how to improve
     > the error message, since the problem in your original code is real.
     > There's no way the generated contract can tell at runtime that the
     > values passed to `check-equal?` aren't higher-order, so it has to
     > conservatively reject the call.  Suggestions are certainly welcome.
     >
     > Sam
     >
     > On Wed, May 29, 2013 at 7:46 AM, Robby Findler
     > <ro...@eecs.northwestern.edu
    <mailto:ro...@eecs.northwestern.edu>> wrote:
     > > I'm not sure if this should be considered a bug or a feature
    request (or
     > > something else, but hopefully one of those two!) so I thought
    I'd ask here
     > > before sending in a PR. This program:
     > >
     > >   #lang typed/racket
     > >   (require typed/rackunit)
     > >   (struct: s ([a : Integer]))
     > >   (check-equal? (s 1) (s 2))
     > >
     > > produces the output:
     > >
     > > check-equal?: broke its contract
     > >   Attempted to use a higher-order value passed as `Any` in
    untyped code:
     > > #<s>
     > >   in: the 1st argument of
     > >       (recursive-contract
     > >        (->* (Any Any) (String) any/c)
     > >        #:impersonator)
     > >   contract from: (interface for check-equal?)
     > >   blaming: (interface for check-equal?)
     > >   at: <collects>/typed/rackunit/main.rkt:20.2
     > >
     > > which is a bit confusing. (As someone who's been around Racket
    long enough,
     > > I guessed that sticking #:transparent into the struct
    declaration would be a
     > > thing to try, but newcomers seem unlikely to find that workaround.)
     > >
     > > Robby
     > >
     > >
     > > _________________________
     > >   Racket Developers list:
     > > http://lists.racket-lang.org/dev
     > >
     >
     > _________________________
     >  Racket Developers list:
     > http://lists.racket-lang.org/dev




_________________________
   Racket Developers list:
   http://lists.racket-lang.org/dev


_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to