[racket] comparing structure types through contracts

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Tue Feb 7 10:34:25 EST 2012

That's a bug. I've looked into it a little bit, enough to say that I
can't fix it this morning. Sorry.

Robby

On Tue, Feb 7, 2012 at 1:19 AM, John Clements <clements at brinckerhoff.org> wrote:
> I'm working with Dave Herman's JavaScript package. I've found a problem and a workaround, but I want to make sure there's not an easier workaround before I convert a bunch of code.  The following program illustrates the issue:
>
> #lang racket/load
>
> (module a racket
>
>  ;; this formulation "works" (prints #t):
>  (define-struct/contract s ((a number?) (b number?)) #:transparent)
>  (provide (struct-out s))
>
>  ;; this formulation does not work (prints #f):
>  #;(define-struct s (a b) #:transparent)
>
>  #;(provide/contract [struct s ([a number?]
>                               [b number?])]
>                    #;(struct-out s)))
>
> (module b racket
>  (require 'a)
>  (define-values (type _) (struct-info (make-s 3 4)))
>  (printf "type: ~s\n" type)
>  (printf "eq? ~s\n"
>          (eq? type
>               struct:s)))
>
> (require 'b)
>
>
> The problem is that when a structure is defined using define-struct and then a contract is provided at the boundary, the structure type returned by struct-info doesn't compare to the exported struct's value using eq?.  As the code illustrates, I can work around this by pushing the contract down into the definition of the structure itself.
>
> Before I change many pairs of structure-definitions & contracts, is there some other simpler way to make this code "work"--that is, print #t?
>
> Thanks!
>
> John
>
>
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users
>


Posted on the users mailing list.