Search code examples
stringschemeracketrepresentation

String representation of custom data in Racket


I like how you can retain representation in transparent structs:

(struct posn (x y)
        #:transparent)

> (posn 1 2)
(posn 1 2)

But is there a way to customize it? Like in Python?


Solution

  • Check out the prop:custom-write property here. Here's a simple implementation:

    (struct pr (x y)
      #:transparent
      #:property prop:custom-write (λ (v p w?)
                                     (fprintf p "<~a,~a>" (pr-x v) (pr-y v))))
    
    > (pr 1 2)
    <1,2>
    

    Note that this works with non-#:transparent structures as well.