One approach would be to not expect the clients to use deserialize
directly but provide a thin wrapper module which would be the place to
hang the blame information (and it would use `contract-out`).

Robby


On Mon, Jul 24, 2017 at 1:32 PM, Matthew Flatt <mfl...@cs.utah.edu> wrote:
> At Mon, 24 Jul 2017 12:35:51 -0500, Philip McGrath wrote:
>> I've also tried putting the
>> definition of `deserialize-info:adder-v0` in a different module, so that
>> its version of `adder` has a contract, but then the binding isn't seen by
>> `make-serialize-info`.
>
> In case you still want to pursue that direction, you can use the pair
> form of the second argument to `make-serialize-info`, which pairs a
> symbol with a reference to an exporting module. See the example below.
>
> (I think there's probably a library that's better to use than a raw
> `variable-reference->module-path-index` plus `module-path-index-join`,
> but I forget.)
>
> I don't see a way to blame the module that calls `deserialize`.
>
> ----------------------------------------
>
> #lang racket
>
> (module server racket
>   (require racket/serialize)
>   (provide (contract-out
>             [adder (-> natural-number/c (-> natural-number/c
>                                             natural-number/c))]))
>   (struct adder (base)
>     #:property prop:procedure
>     (λ (this x)
>       (+ (adder-base this) x))
>     #:property prop:serializable
>     (make-serialize-info (λ (this) (vector (adder-base this)))
>                          (cons 'deserialize-info:adder-v0
>                                (module-path-index-join
>                                 '(submod "." deserialize-info)
>                                 (variable-reference->module-path-index
>                                  (#%variable-reference))))
>                          #f
>                          (or (current-load-relative-directory)
>                              (current-directory))))
>   (define/contract make-adder
>     (-> natural-number/c (-> natural-number/c
>                              natural-number/c))
>     adder)
>
>   (module* deserialize-info racket/base
>     (require (submod ".."))
>     (require racket/serialize)
>     (provide deserialize-info:adder-v0)
>     (define deserialize-info:adder-v0
>       (make-deserialize-info adder
>                              (λ () (error 'adder
>                                           "can't have cycles"))))))
>
>
> (require 'server racket/serialize)
>
> ((deserialize (serialize (adder 5))) 'not-a-number)
>
> --
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to racket-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to